From 699493cf24840444362e954aad3333a8f0c8e85e Mon Sep 17 00:00:00 2001 From: Rickard Jonsson Date: Sun, 11 Dec 2022 20:59:02 +0100 Subject: [PATCH 01/72] Make sure sidedrawer is closed on link click --- apps/ui/src/routes/__layout.svelte | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/apps/ui/src/routes/__layout.svelte b/apps/ui/src/routes/__layout.svelte index 2efaa8a4e..68c036ceb 100644 --- a/apps/ui/src/routes/__layout.svelte +++ b/apps/ui/src/routes/__layout.svelte @@ -135,6 +135,10 @@ }); } }); + + let sidedrawerToggler: HTMLInputElement; + + const closeDrawer = () => (sidedrawerToggler.checked = false); @@ -154,7 +158,7 @@ {/if}
- +
{#if $appSession.userId} IAM @@ -368,6 +372,7 @@ sveltekit:prefetch href="/" class:bg-pink-500={$page.url.pathname === '/'} + on:click={closeDrawer} > Date: Mon, 12 Dec 2022 08:44:23 +0100 Subject: [PATCH 02/72] wip --- .gitignore | 1 - .../migration.sql | 2 +- apps/client/.eslintignore | 13 + apps/client/.eslintrc.cjs | 20 + apps/client/.gitignore | 10 + apps/client/.npmrc | 1 + apps/client/.prettierignore | 13 + apps/client/.prettierrc | 9 + apps/client/README.md | 1 + apps/client/package.json | 46 + apps/client/playwright.config.ts | 10 + apps/client/pnpm-lock.yaml | 1793 +++++++++++++++++ apps/client/postcss.config.cjs | 13 + apps/client/src/app.d.ts | 9 + apps/client/src/app.html | 12 + apps/client/src/app.postcss | 14 + apps/client/src/lib/store.ts | 22 + apps/client/src/routes/+layout.svelte | 7 + apps/client/src/routes/+page.svelte | 10 + apps/client/static/favicon.png | Bin 0 -> 1571 bytes apps/client/svelte.config.js | 21 + apps/client/tailwind.config.cjs | 11 + apps/client/tests/test.ts | 6 + apps/client/tsconfig.json | 21 + apps/client/vite.config.ts | 11 + apps/server/.env-template | 2 + apps/server/.prettierrc | 9 + apps/server/db/.gitkeep | 0 apps/server/package.json | 56 + .../20221206140938_init/migration.sql | 21 + .../prisma/migrations/migration_lock.toml | 3 + apps/server/prisma/schema.prisma | 11 + apps/server/src/config/index.ts | 7 + apps/server/src/env.js | 15 + apps/server/src/index.ts | 7 + apps/server/src/prisma.ts | 21 + apps/server/src/router/context.ts | 19 + apps/server/src/router/index.ts | 8 + apps/server/src/router/routers/api.ts | 18 + apps/server/src/router/trpc.ts | 13 + apps/server/src/server.ts | 58 + apps/server/tsconfig.json | 43 + package.json | 5 + pnpm-lock.yaml | 791 +++++++- 44 files changed, 3130 insertions(+), 53 deletions(-) create mode 100644 apps/client/.eslintignore create mode 100644 apps/client/.eslintrc.cjs create mode 100644 apps/client/.gitignore create mode 100644 apps/client/.npmrc create mode 100644 apps/client/.prettierignore create mode 100644 apps/client/.prettierrc create mode 100644 apps/client/README.md create mode 100644 apps/client/package.json create mode 100644 apps/client/playwright.config.ts create mode 100644 apps/client/pnpm-lock.yaml create mode 100644 apps/client/postcss.config.cjs create mode 100644 apps/client/src/app.d.ts create mode 100644 apps/client/src/app.html create mode 100644 apps/client/src/app.postcss create mode 100644 apps/client/src/lib/store.ts create mode 100644 apps/client/src/routes/+layout.svelte create mode 100644 apps/client/src/routes/+page.svelte create mode 100644 apps/client/static/favicon.png create mode 100644 apps/client/svelte.config.js create mode 100644 apps/client/tailwind.config.cjs create mode 100644 apps/client/tests/test.ts create mode 100644 apps/client/tsconfig.json create mode 100644 apps/client/vite.config.ts create mode 100644 apps/server/.env-template create mode 100644 apps/server/.prettierrc create mode 100644 apps/server/db/.gitkeep create mode 100644 apps/server/package.json create mode 100644 apps/server/prisma/migrations/20221206140938_init/migration.sql create mode 100644 apps/server/prisma/migrations/migration_lock.toml create mode 100644 apps/server/prisma/schema.prisma create mode 100644 apps/server/src/config/index.ts create mode 100644 apps/server/src/env.js create mode 100644 apps/server/src/index.ts create mode 100644 apps/server/src/prisma.ts create mode 100644 apps/server/src/router/context.ts create mode 100644 apps/server/src/router/index.ts create mode 100644 apps/server/src/router/routers/api.ts create mode 100644 apps/server/src/router/trpc.ts create mode 100644 apps/server/src/server.ts create mode 100644 apps/server/tsconfig.json diff --git a/.gitignore b/.gitignore index c31810490..410aba9ee 100644 --- a/.gitignore +++ b/.gitignore @@ -8,7 +8,6 @@ package .env.* !.env.example dist -client apps/api/db/*.db apps/api/db/migration.db-journal apps/api/core* diff --git a/apps/api/prisma/migrations/20221129121702_preview_separator/migration.sql b/apps/api/prisma/migrations/20221129121702_preview_separator/migration.sql index 2fdff0eca..e0d64cdc8 100644 --- a/apps/api/prisma/migrations/20221129121702_preview_separator/migration.sql +++ b/apps/api/prisma/migrations/20221129121702_preview_separator/migration.sql @@ -25,7 +25,7 @@ CREATE TABLE "new_Setting" ( "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", "numberOfDockerImagesKeptLocally", "proxyDefaultRedirect", "sentryDSN", "updatedAt" FROM "Setting"; +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"); diff --git a/apps/client/.eslintignore b/apps/client/.eslintignore new file mode 100644 index 000000000..38972655f --- /dev/null +++ b/apps/client/.eslintignore @@ -0,0 +1,13 @@ +.DS_Store +node_modules +/build +/.svelte-kit +/package +.env +.env.* +!.env.example + +# Ignore files for PNPM, NPM and YARN +pnpm-lock.yaml +package-lock.json +yarn.lock diff --git a/apps/client/.eslintrc.cjs b/apps/client/.eslintrc.cjs new file mode 100644 index 000000000..3ccf435f0 --- /dev/null +++ b/apps/client/.eslintrc.cjs @@ -0,0 +1,20 @@ +module.exports = { + root: true, + parser: '@typescript-eslint/parser', + extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended', 'prettier'], + plugins: ['svelte3', '@typescript-eslint'], + ignorePatterns: ['*.cjs'], + overrides: [{ files: ['*.svelte'], processor: 'svelte3/svelte3' }], + settings: { + 'svelte3/typescript': () => require('typescript') + }, + parserOptions: { + sourceType: 'module', + ecmaVersion: 2020 + }, + env: { + browser: true, + es2017: true, + node: true + } +}; diff --git a/apps/client/.gitignore b/apps/client/.gitignore new file mode 100644 index 000000000..6635cf554 --- /dev/null +++ b/apps/client/.gitignore @@ -0,0 +1,10 @@ +.DS_Store +node_modules +/build +/.svelte-kit +/package +.env +.env.* +!.env.example +vite.config.js.timestamp-* +vite.config.ts.timestamp-* diff --git a/apps/client/.npmrc b/apps/client/.npmrc new file mode 100644 index 000000000..b6f27f135 --- /dev/null +++ b/apps/client/.npmrc @@ -0,0 +1 @@ +engine-strict=true diff --git a/apps/client/.prettierignore b/apps/client/.prettierignore new file mode 100644 index 000000000..38972655f --- /dev/null +++ b/apps/client/.prettierignore @@ -0,0 +1,13 @@ +.DS_Store +node_modules +/build +/.svelte-kit +/package +.env +.env.* +!.env.example + +# Ignore files for PNPM, NPM and YARN +pnpm-lock.yaml +package-lock.json +yarn.lock diff --git a/apps/client/.prettierrc b/apps/client/.prettierrc new file mode 100644 index 000000000..a77fddea9 --- /dev/null +++ b/apps/client/.prettierrc @@ -0,0 +1,9 @@ +{ + "useTabs": true, + "singleQuote": true, + "trailingComma": "none", + "printWidth": 100, + "plugins": ["prettier-plugin-svelte"], + "pluginSearchDirs": ["."], + "overrides": [{ "files": "*.svelte", "options": { "parser": "svelte" } }] +} diff --git a/apps/client/README.md b/apps/client/README.md new file mode 100644 index 000000000..d7fe004d9 --- /dev/null +++ b/apps/client/README.md @@ -0,0 +1 @@ +# SvelteKit Static site diff --git a/apps/client/package.json b/apps/client/package.json new file mode 100644 index 000000000..0ac71ab15 --- /dev/null +++ b/apps/client/package.json @@ -0,0 +1,46 @@ +{ + "name": "client", + "description": "Coolify's SvelteKit UI", + "license": "Apache-2.0", + "private": true, + "scripts": { + "dev": "vite dev", + "build": "vite build && cp -Pr build/ ../../build/public", + "preview": "vite preview", + "test": "playwright test", + "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", + "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", + "lint": "prettier --plugin-search-dir . --check . && eslint .", + "format": "prettier --plugin-search-dir . --write ." + }, + "devDependencies": { + "@playwright/test": "1.28.1", + "@sveltejs/adapter-static": "1.0.0-next.48", + "@sveltejs/kit": "1.0.0-next.572", + "@typescript-eslint/eslint-plugin": "5.44.0", + "@typescript-eslint/parser": "5.44.0", + "autoprefixer": "10.4.13", + "eslint": "8.28.0", + "eslint-config-prettier": "8.5.0", + "eslint-plugin-svelte3": "4.0.0", + "postcss": "8.4.19", + "postcss-load-config": "4.0.1", + "prettier": "2.8.0", + "prettier-plugin-svelte": "2.8.1", + "svelte": "3.53.1", + "svelte-check": "2.9.2", + "svelte-preprocess": "^4.10.7", + "tailwindcss": "3.2.4", + "tslib": "2.4.1", + "typescript": "4.9.3", + "vite": "3.2.4" + }, + "type": "module", + "dependencies": { + "js-cookie": "3.0.1", + "@trpc/client": "10.1.0", + "@trpc/server": "10.1.0", + "server": "workspace:*", + "superjson": "1.11.0" + } +} diff --git a/apps/client/playwright.config.ts b/apps/client/playwright.config.ts new file mode 100644 index 000000000..6ad3a7faa --- /dev/null +++ b/apps/client/playwright.config.ts @@ -0,0 +1,10 @@ +import type { PlaywrightTestConfig } from '@playwright/test'; + +const config: PlaywrightTestConfig = { + webServer: { + command: 'npm run build && npm run preview', + port: 4173 + } +}; + +export default config; diff --git a/apps/client/pnpm-lock.yaml b/apps/client/pnpm-lock.yaml new file mode 100644 index 000000000..f9b8429e8 --- /dev/null +++ b/apps/client/pnpm-lock.yaml @@ -0,0 +1,1793 @@ +lockfileVersion: 5.4 + +specifiers: + '@playwright/test': 1.25.0 + '@sveltejs/adapter-auto': next + '@sveltejs/kit': next + '@trpc/client': ^10.1.0 + '@typescript-eslint/eslint-plugin': ^5.27.0 + '@typescript-eslint/parser': ^5.27.0 + eslint: ^8.16.0 + eslint-config-prettier: ^8.3.0 + eslint-plugin-svelte3: ^4.0.0 + prettier: ^2.6.2 + prettier-plugin-svelte: ^2.7.0 + svelte: ^3.44.0 + svelte-check: ^2.7.1 + svelte-preprocess: ^4.10.6 + tslib: ^2.3.1 + typescript: ^4.7.4 + vite: ^3.1.0 + +dependencies: + '@trpc/client': 10.1.0 + +devDependencies: + '@playwright/test': 1.25.0 + '@sveltejs/adapter-auto': 1.0.0-next.89 + '@sveltejs/kit': 1.0.0-next.560_svelte@3.53.1+vite@3.2.4 + '@typescript-eslint/eslint-plugin': 5.44.0_fnsv2sbzcckq65bwfk7a5xwslu + '@typescript-eslint/parser': 5.44.0_hsf322ms6xhhd4b5ne6lb74y4a + eslint: 8.28.0 + eslint-config-prettier: 8.5.0_eslint@8.28.0 + eslint-plugin-svelte3: 4.0.0_xgu65rlhscpnxffotiaicv6m5i + prettier: 2.8.0 + prettier-plugin-svelte: 2.8.1_3ndnxlh52lolrqe4kgjgbxb3xa + svelte: 3.53.1 + svelte-check: 2.9.2_svelte@3.53.1 + svelte-preprocess: 4.10.7_7dvewpees4iyn2tkw2qzal77a4 + tslib: 2.4.1 + typescript: 4.9.3 + vite: 3.2.4 + +packages: + + /@esbuild/android-arm/0.15.15: + resolution: {integrity: sha512-JJjZjJi2eBL01QJuWjfCdZxcIgot+VoK6Fq7eKF9w4YHm9hwl7nhBR1o2Wnt/WcANk5l9SkpvrldW1PLuXxcbw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64/0.15.15: + resolution: {integrity: sha512-lhz6UNPMDXUhtXSulw8XlFAtSYO26WmHQnCi2Lg2p+/TMiJKNLtZCYUxV4wG6rZMzXmr8InGpNwk+DLT2Hm0PA==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@eslint/eslintrc/1.3.3: + resolution: {integrity: sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.4.1 + globals: 13.18.0 + ignore: 5.2.0 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@humanwhocodes/config-array/0.11.7: + resolution: {integrity: sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 1.2.1 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@humanwhocodes/module-importer/1.0.1: + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + dev: true + + /@humanwhocodes/object-schema/1.2.1: + resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + dev: true + + /@jridgewell/resolve-uri/3.1.0: + resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/sourcemap-codec/1.4.14: + resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} + dev: true + + /@jridgewell/trace-mapping/0.3.17: + resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==} + dependencies: + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.4.14 + dev: true + + /@nodelib/fs.scandir/2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat/2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@nodelib/fs.walk/1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.13.0 + dev: true + + /@playwright/test/1.25.0: + resolution: {integrity: sha512-j4EZhTTQI3dBeWblE21EV//swwmBtOpIrLdOIJIRv4uqsLdHgBg1z+JtTg+AeC5o2bAXIE26kDNW5A0TimG8Bg==} + engines: {node: '>=14'} + hasBin: true + dependencies: + '@types/node': 18.11.9 + playwright-core: 1.25.0 + dev: true + + /@polka/url/1.0.0-next.21: + resolution: {integrity: sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==} + dev: true + + /@sveltejs/adapter-auto/1.0.0-next.89: + resolution: {integrity: sha512-S+sASFX4sSZD1xEKmZ3zHxQh2DGxXBUpCGAtUakKkI2MRvFIm+zYIm+7GPekofMLd19FjdFDKkuOjBKPdmA8+w==} + dependencies: + import-meta-resolve: 2.2.0 + dev: true + + /@sveltejs/kit/1.0.0-next.560_svelte@3.53.1+vite@3.2.4: + resolution: {integrity: sha512-ldZJyd+jfQWVkOkRHq25cXMffhL5MgB1Uzhhw1ngF8ezB38P/g4T+5ohP8wuk2lxPJIjbY3S6BeXN5mod9XOhA==} + engines: {node: '>=16.14'} + hasBin: true + requiresBuild: true + peerDependencies: + svelte: ^3.44.0 + vite: ^3.2.0 + dependencies: + '@sveltejs/vite-plugin-svelte': 1.3.1_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.26.7 + 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.12.0 + vite: 3.2.4 + transitivePeerDependencies: + - diff-match-patch + - supports-color + dev: true + + /@sveltejs/vite-plugin-svelte/1.3.1_svelte@3.53.1+vite@3.2.4: + resolution: {integrity: sha512-2Uu2sDdIR+XQWF7QWOVSF2jR9EU6Ciw1yWfYnfLYj8HIgnNxkh/8g22Fw2pBUI8QNyW/KxtqJUWBI+8ypamSrQ==} + engines: {node: ^14.18.0 || >= 16} + peerDependencies: + diff-match-patch: ^1.0.5 + svelte: ^3.44.0 + vite: ^3.0.0 + peerDependenciesMeta: + diff-match-patch: + optional: true + 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.2_vite@3.2.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@trpc/client/10.1.0: + resolution: {integrity: sha512-E7L9l2OTa5lIdM0NYvQLJf/GLapskfiVLv0Jv7t6GVxEOFd+O4THWsWQgJVUUAz9iq805iMNkY3uqSvf4GJaWg==} + peerDependencies: + '@trpc/server': 10.1.0 + dev: false + + /@types/cookie/0.5.1: + resolution: {integrity: sha512-COUnqfB2+ckwXXSFInsFdOAWQzCCx+a5hq2ruyj+Vjund94RJQd4LG2u9hnvJrTgunKAaax7ancBYlDrNYxA0g==} + dev: true + + /@types/json-schema/7.0.11: + resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} + dev: true + + /@types/node/18.11.9: + resolution: {integrity: sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==} + dev: true + + /@types/pug/2.0.6: + resolution: {integrity: sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg==} + dev: true + + /@types/sass/1.43.1: + resolution: {integrity: sha512-BPdoIt1lfJ6B7rw35ncdwBZrAssjcwzI5LByIrYs+tpXlj/CAkuVdRsgZDdP4lq5EjyWzwxZCqAoFyHKFwp32g==} + dependencies: + '@types/node': 18.11.9 + dev: true + + /@types/semver/7.3.13: + resolution: {integrity: sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==} + 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} + peerDependencies: + '@typescript-eslint/parser': ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/parser': 5.44.0_hsf322ms6xhhd4b5ne6lb74y4a + '@typescript-eslint/scope-manager': 5.44.0 + '@typescript-eslint/type-utils': 5.44.0_hsf322ms6xhhd4b5ne6lb74y4a + '@typescript-eslint/utils': 5.44.0_hsf322ms6xhhd4b5ne6lb74y4a + debug: 4.3.4 + eslint: 8.28.0 + ignore: 5.2.0 + natural-compare-lite: 1.4.0 + regexpp: 3.2.0 + semver: 7.3.8 + tsutils: 3.21.0_typescript@4.9.3 + typescript: 4.9.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/parser/5.44.0_hsf322ms6xhhd4b5ne6lb74y4a: + resolution: {integrity: sha512-H7LCqbZnKqkkgQHaKLGC6KUjt3pjJDx8ETDqmwncyb6PuoigYajyAwBGz08VU/l86dZWZgI4zm5k2VaKqayYyA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 5.44.0 + '@typescript-eslint/types': 5.44.0 + '@typescript-eslint/typescript-estree': 5.44.0_typescript@4.9.3 + debug: 4.3.4 + eslint: 8.28.0 + typescript: 4.9.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/scope-manager/5.44.0: + resolution: {integrity: sha512-2pKml57KusI0LAhgLKae9kwWeITZ7IsZs77YxyNyIVOwQ1kToyXRaJLl+uDEXzMN5hnobKUOo2gKntK9H1YL8g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.44.0 + '@typescript-eslint/visitor-keys': 5.44.0 + dev: true + + /@typescript-eslint/type-utils/5.44.0_hsf322ms6xhhd4b5ne6lb74y4a: + resolution: {integrity: sha512-A1u0Yo5wZxkXPQ7/noGkRhV4J9opcymcr31XQtOzcc5nO/IHN2E2TPMECKWYpM3e6olWEM63fq/BaL1wEYnt/w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '*' + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/typescript-estree': 5.44.0_typescript@4.9.3 + '@typescript-eslint/utils': 5.44.0_hsf322ms6xhhd4b5ne6lb74y4a + debug: 4.3.4 + eslint: 8.28.0 + tsutils: 3.21.0_typescript@4.9.3 + typescript: 4.9.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/types/5.44.0: + resolution: {integrity: sha512-Tp+zDnHmGk4qKR1l+Y1rBvpjpm5tGXX339eAlRBDg+kgZkz9Bw+pqi4dyseOZMsGuSH69fYfPJCBKBrbPCxYFQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@typescript-eslint/typescript-estree/5.44.0_typescript@4.9.3: + resolution: {integrity: sha512-M6Jr+RM7M5zeRj2maSfsZK2660HKAJawv4Ud0xT+yauyvgrsHu276VtXlKDFnEmhG+nVEd0fYZNXGoAgxwDWJw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 5.44.0 + '@typescript-eslint/visitor-keys': 5.44.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.3.8 + tsutils: 3.21.0_typescript@4.9.3 + typescript: 4.9.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/utils/5.44.0_hsf322ms6xhhd4b5ne6lb74y4a: + resolution: {integrity: sha512-fMzA8LLQ189gaBjS0MZszw5HBdZgVwxVFShCO3QN+ws3GlPkcy9YuS3U4wkT6su0w+Byjq3mS3uamy9HE4Yfjw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@types/json-schema': 7.0.11 + '@types/semver': 7.3.13 + '@typescript-eslint/scope-manager': 5.44.0 + '@typescript-eslint/types': 5.44.0 + '@typescript-eslint/typescript-estree': 5.44.0_typescript@4.9.3 + eslint: 8.28.0 + eslint-scope: 5.1.1 + eslint-utils: 3.0.0_eslint@8.28.0 + semver: 7.3.8 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/visitor-keys/5.44.0: + resolution: {integrity: sha512-a48tLG8/4m62gPFbJ27FxwCOqPKxsb8KC3HkmYoq2As/4YyjQl1jDbRr1s63+g4FS/iIehjmN3L5UjmKva1HzQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.44.0 + eslint-visitor-keys: 3.3.0 + dev: true + + /acorn-jsx/5.3.2_acorn@8.8.1: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.8.1 + dev: true + + /acorn/8.8.1: + resolution: {integrity: sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /ajv/6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + dev: true + + /ansi-regex/5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: true + + /ansi-styles/4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: true + + /anymatch/3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /argparse/2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: true + + /array-union/2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: true + + /balanced-match/1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true + + /binary-extensions/2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + dev: true + + /brace-expansion/1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /braces/3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: true + + /buffer-crc32/0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + dev: true + + /busboy/1.6.0: + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} + dependencies: + streamsearch: 1.1.0 + dev: true + + /callsites/3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + dev: true + + /chalk/4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /chokidar/3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /color-convert/2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + dev: true + + /color-name/1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + dev: true + + /concat-map/0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: true + + /cookie/0.5.0: + resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} + engines: {node: '>= 0.6'} + dev: true + + /cross-spawn/7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: true + + /debug/4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: true + + /deep-is/0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + dev: true + + /deepmerge/4.2.2: + resolution: {integrity: sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==} + engines: {node: '>=0.10.0'} + dev: true + + /detect-indent/6.1.0: + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} + engines: {node: '>=8'} + dev: true + + /devalue/4.2.0: + resolution: {integrity: sha512-mbjoAaCL2qogBKgeFxFPOXAUsZchircF+B/79LD4sHH0+NHfYm8gZpQrskKDn5gENGt35+5OI1GUF7hLVnkPDw==} + dev: true + + /dir-glob/3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dependencies: + path-type: 4.0.0 + dev: true + + /doctrine/3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /es6-promise/3.3.1: + resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==} + dev: true + + /esbuild-android-64/0.15.15: + resolution: {integrity: sha512-F+WjjQxO+JQOva3tJWNdVjouFMLK6R6i5gjDvgUthLYJnIZJsp1HlF523k73hELY20WPyEO8xcz7aaYBVkeg5Q==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /esbuild-android-arm64/0.15.15: + resolution: {integrity: sha512-attlyhD6Y22jNyQ0fIIQ7mnPvDWKw7k6FKnsXlBvQE6s3z6s6cuEHcSgoirquQc7TmZgVCK5fD/2uxmRN+ZpcQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /esbuild-darwin-64/0.15.15: + resolution: {integrity: sha512-ohZtF8W1SHJ4JWldsPVdk8st0r9ExbAOSrBOh5L+Mq47i696GVwv1ab/KlmbUoikSTNoXEhDzVpxUR/WIO19FQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /esbuild-darwin-arm64/0.15.15: + resolution: {integrity: sha512-P8jOZ5zshCNIuGn+9KehKs/cq5uIniC+BeCykvdVhx/rBXSxmtj3CUIKZz4sDCuESMbitK54drf/2QX9QHG5Ag==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /esbuild-freebsd-64/0.15.15: + resolution: {integrity: sha512-KkTg+AmDXz1IvA9S1gt8dE24C8Thx0X5oM0KGF322DuP+P3evwTL9YyusHAWNsh4qLsR80nvBr/EIYs29VSwuA==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /esbuild-freebsd-arm64/0.15.15: + resolution: {integrity: sha512-FUcML0DRsuyqCMfAC+HoeAqvWxMeq0qXvclZZ/lt2kLU6XBnDA5uKTLUd379WYEyVD4KKFctqWd9tTuk8C/96g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-32/0.15.15: + resolution: {integrity: sha512-q28Qn5pZgHNqug02aTkzw5sW9OklSo96b5nm17Mq0pDXrdTBcQ+M6Q9A1B+dalFeynunwh/pvfrNucjzwDXj+Q==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-64/0.15.15: + resolution: {integrity: sha512-217KPmWMirkf8liO+fj2qrPwbIbhNTGNVtvqI1TnOWJgcMjUWvd677Gq3fTzXEjilkx2yWypVnTswM2KbXgoAg==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-arm/0.15.15: + resolution: {integrity: sha512-RYVW9o2yN8yM7SB1yaWr378CwrjvGCyGybX3SdzPHpikUHkME2AP55Ma20uNwkNyY2eSYFX9D55kDrfQmQBR4w==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-arm64/0.15.15: + resolution: {integrity: sha512-/ltmNFs0FivZkYsTzAsXIfLQX38lFnwJTWCJts0IbCqWZQe+jjj0vYBNbI0kmXLb3y5NljiM5USVAO1NVkdh2g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-mips64le/0.15.15: + resolution: {integrity: sha512-PksEPb321/28GFFxtvL33yVPfnMZihxkEv5zME2zapXGp7fA1X2jYeiTUK+9tJ/EGgcNWuwvtawPxJG7Mmn86A==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-ppc64le/0.15.15: + resolution: {integrity: sha512-ek8gJBEIhcpGI327eAZigBOHl58QqrJrYYIZBWQCnH3UnXoeWMrMZLeeZL8BI2XMBhP+sQ6ERctD5X+ajL/AIA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-riscv64/0.15.15: + resolution: {integrity: sha512-H5ilTZb33/GnUBrZMNJtBk7/OXzDHDXjIzoLXHSutwwsLxSNaLxzAaMoDGDd/keZoS+GDBqNVxdCkpuiRW4OSw==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-s390x/0.15.15: + resolution: {integrity: sha512-jKaLUg78mua3rrtrkpv4Or2dNTJU7bgHN4bEjT4OX4GR7nLBSA9dfJezQouTxMmIW7opwEC5/iR9mpC18utnxQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-netbsd-64/0.15.15: + resolution: {integrity: sha512-aOvmF/UkjFuW6F36HbIlImJTTx45KUCHJndtKo+KdP8Dhq3mgLRKW9+6Ircpm8bX/RcS3zZMMmaBLkvGY06Gvw==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /esbuild-openbsd-64/0.15.15: + resolution: {integrity: sha512-HFFX+WYedx1w2yJ1VyR1Dfo8zyYGQZf1cA69bLdrHzu9svj6KH6ZLK0k3A1/LFPhcEY9idSOhsB2UyU0tHPxgQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /esbuild-sunos-64/0.15.15: + resolution: {integrity: sha512-jOPBudffG4HN8yJXcK9rib/ZTFoTA5pvIKbRrt3IKAGMq1EpBi4xoVoSRrq/0d4OgZLaQbmkHp8RO9eZIn5atA==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /esbuild-windows-32/0.15.15: + resolution: {integrity: sha512-MDkJ3QkjnCetKF0fKxCyYNBnOq6dmidcwstBVeMtXSgGYTy8XSwBeIE4+HuKiSsG6I/mXEb++px3IGSmTN0XiA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /esbuild-windows-64/0.15.15: + resolution: {integrity: sha512-xaAUIB2qllE888SsMU3j9nrqyLbkqqkpQyWVkfwSil6BBPgcPk3zOFitTTncEKCLTQy3XV9RuH7PDj3aJDljWA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /esbuild-windows-arm64/0.15.15: + resolution: {integrity: sha512-ttuoCYCIJAFx4UUKKWYnFdrVpoXa3+3WWkXVI6s09U+YjhnyM5h96ewTq/WgQj9LFSIlABQvadHSOQyAVjW5xQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /esbuild/0.15.15: + resolution: {integrity: sha512-TEw/lwK4Zzld9x3FedV6jy8onOUHqcEX3ADFk4k+gzPUwrxn8nWV62tH0udo8jOtjFodlEfc4ypsqX3e+WWO6w==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.15.15 + '@esbuild/linux-loong64': 0.15.15 + esbuild-android-64: 0.15.15 + esbuild-android-arm64: 0.15.15 + esbuild-darwin-64: 0.15.15 + esbuild-darwin-arm64: 0.15.15 + esbuild-freebsd-64: 0.15.15 + esbuild-freebsd-arm64: 0.15.15 + esbuild-linux-32: 0.15.15 + esbuild-linux-64: 0.15.15 + esbuild-linux-arm: 0.15.15 + esbuild-linux-arm64: 0.15.15 + esbuild-linux-mips64le: 0.15.15 + esbuild-linux-ppc64le: 0.15.15 + esbuild-linux-riscv64: 0.15.15 + esbuild-linux-s390x: 0.15.15 + esbuild-netbsd-64: 0.15.15 + esbuild-openbsd-64: 0.15.15 + esbuild-sunos-64: 0.15.15 + esbuild-windows-32: 0.15.15 + esbuild-windows-64: 0.15.15 + esbuild-windows-arm64: 0.15.15 + dev: true + + /escape-string-regexp/4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + dev: true + + /eslint-config-prettier/8.5.0_eslint@8.28.0: + resolution: {integrity: sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + dependencies: + eslint: 8.28.0 + dev: true + + /eslint-plugin-svelte3/4.0.0_xgu65rlhscpnxffotiaicv6m5i: + resolution: {integrity: sha512-OIx9lgaNzD02+MDFNLw0GEUbuovNcglg+wnd/UY0fbZmlQSz7GlQiQ1f+yX0XvC07XPcDOnFcichqI3xCwp71g==} + peerDependencies: + eslint: '>=8.0.0' + svelte: ^3.2.0 + dependencies: + eslint: 8.28.0 + svelte: 3.53.1 + dev: true + + /eslint-scope/5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + dev: true + + /eslint-scope/7.1.1: + resolution: {integrity: sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + dev: true + + /eslint-utils/3.0.0_eslint@8.28.0: + resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} + engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} + peerDependencies: + eslint: '>=5' + dependencies: + eslint: 8.28.0 + eslint-visitor-keys: 2.1.0 + dev: true + + /eslint-visitor-keys/2.1.0: + resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} + engines: {node: '>=10'} + dev: true + + /eslint-visitor-keys/3.3.0: + resolution: {integrity: sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /eslint/8.28.0: + resolution: {integrity: sha512-S27Di+EVyMxcHiwDrFzk8dJYAaD+/5SoWKxL1ri/71CRHsnJnRDPNt2Kzj24+MT9FDupf4aqqyqPrvI8MvQ4VQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint/eslintrc': 1.3.3 + '@humanwhocodes/config-array': 0.11.7 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.1.1 + eslint-utils: 3.0.0_eslint@8.28.0 + eslint-visitor-keys: 3.3.0 + espree: 9.4.1 + esquery: 1.4.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.18.0 + grapheme-splitter: 1.0.4 + ignore: 5.2.0 + import-fresh: 3.3.0 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-sdsl: 4.2.0 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.1 + regexpp: 3.2.0 + strip-ansi: 6.0.1 + strip-json-comments: 3.1.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /espree/9.4.1: + resolution: {integrity: sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.8.1 + acorn-jsx: 5.3.2_acorn@8.8.1 + eslint-visitor-keys: 3.3.0 + dev: true + + /esquery/1.4.0: + resolution: {integrity: sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + dev: true + + /esrecurse/4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + dev: true + + /estraverse/4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + dev: true + + /estraverse/5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + dev: true + + /esutils/2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + dev: true + + /fast-deep-equal/3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + dev: true + + /fast-glob/3.2.12: + resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: true + + /fast-json-stable-stringify/2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + dev: true + + /fast-levenshtein/2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + dev: true + + /fastq/1.13.0: + resolution: {integrity: sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==} + dependencies: + reusify: 1.0.4 + dev: true + + /file-entry-cache/6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flat-cache: 3.0.4 + dev: true + + /fill-range/7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + + /find-up/5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + dev: true + + /flat-cache/3.0.4: + resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flatted: 3.2.7 + rimraf: 3.0.2 + dev: true + + /flatted/3.2.7: + resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} + dev: true + + /fs.realpath/1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: true + + /fsevents/2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind/1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + dev: true + + /glob-parent/5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob-parent/6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob/7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /globals/13.18.0: + resolution: {integrity: sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + dev: true + + /globalyzer/0.1.0: + resolution: {integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==} + dev: true + + /globby/11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.2.12 + ignore: 5.2.0 + merge2: 1.4.1 + slash: 3.0.0 + dev: true + + /globrex/0.1.2: + resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + dev: true + + /graceful-fs/4.2.10: + resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} + dev: true + + /grapheme-splitter/1.0.4: + resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} + dev: true + + /has-flag/4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: true + + /has/1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: 1.1.1 + dev: true + + /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==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + dev: true + + /import-meta-resolve/2.2.0: + resolution: {integrity: sha512-CpPOtiCHxP9HdtDM5F45tNiAe66Cqlv3f5uHoJjt+KlaLrUh9/Wz9vepADZ78SlqEo62aDWZtj9ydMGXV+CPnw==} + dev: true + + /imurmurhash/0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + dev: true + + /inflight/1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: true + + /inherits/2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: true + + /is-binary-path/2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: true + + /is-core-module/2.11.0: + resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} + dependencies: + has: 1.0.3 + dev: true + + /is-extglob/2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-glob/4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-number/7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + + /is-path-inside/3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + dev: true + + /isexe/2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: true + + /js-sdsl/4.2.0: + resolution: {integrity: sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==} + dev: true + + /js-yaml/4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + dev: true + + /json-schema-traverse/0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + dev: true + + /json-stable-stringify-without-jsonify/1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + dev: true + + /kleur/4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + dev: true + + /levn/0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /locate-path/6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + dev: true + + /lodash.merge/4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: true + + /lru-cache/6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: true + + /magic-string/0.25.9: + resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} + dependencies: + sourcemap-codec: 1.4.8 + dev: true + + /magic-string/0.26.7: + resolution: {integrity: sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==} + engines: {node: '>=12'} + dependencies: + sourcemap-codec: 1.4.8 + dev: true + + /merge2/1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true + + /micromatch/4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: true + + /mime/3.0.0: + resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} + engines: {node: '>=10.0.0'} + hasBin: true + dev: true + + /min-indent/1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + dev: true + + /minimatch/3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: true + + /minimist/1.2.7: + resolution: {integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==} + dev: true + + /mkdirp/0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + dependencies: + minimist: 1.2.7 + dev: true + + /mri/1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + dev: true + + /mrmime/1.0.1: + resolution: {integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==} + engines: {node: '>=10'} + dev: true + + /ms/2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: true + + /nanoid/3.3.4: + resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + + /natural-compare-lite/1.4.0: + resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} + dev: true + + /natural-compare/1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + dev: true + + /normalize-path/3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /once/1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: true + + /optionator/0.9.1: + resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} + engines: {node: '>= 0.8.0'} + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.3 + dev: true + + /p-limit/3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + dev: true + + /p-locate/5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + dev: true + + /parent-module/1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + dev: true + + /path-exists/4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + dev: true + + /path-is-absolute/1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: true + + /path-key/3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: true + + /path-parse/1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + + /path-type/4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + dev: true + + /picocolors/1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: true + + /picomatch/2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: true + + /playwright-core/1.25.0: + resolution: {integrity: sha512-kZ3Jwaf3wlu0GgU0nB8UMQ+mXFTqBIFz9h1svTlNduNKjnbPXFxw7mJanLVjqxHJRn62uBfmgBj93YHidk2N5Q==} + engines: {node: '>=14'} + hasBin: true + dev: true + + /postcss/8.4.19: + resolution: {integrity: sha512-h+pbPsyhlYj6N2ozBmHhHrs9DzGmbaarbLvWipMRO7RLS+v4onj26MPFXA5OBYFxyqYhUJK456SwDcY9H2/zsA==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.4 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + + /prelude-ls/1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.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/2.8.0: + resolution: {integrity: sha512-9Lmg8hTFZKG0Asr/kW9Bp8tJjRVluO8EJQVfY2T7FMw9T5jy4I/Uvx0Rca/XWf50QQ1/SS48+6IJWnrb+2yemA==} + engines: {node: '>=10.13.0'} + hasBin: true + dev: true + + /punycode/2.1.1: + resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==} + engines: {node: '>=6'} + dev: true + + /queue-microtask/1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + + /readdirp/3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: true + + /regexpp/3.2.0: + resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} + engines: {node: '>=8'} + dev: true + + /resolve-from/4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + dev: true + + /resolve/1.22.1: + resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} + hasBin: true + dependencies: + is-core-module: 2.11.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /reusify/1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + + /rimraf/2.7.1: + resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /rimraf/3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /rollup/2.79.1: + resolution: {integrity: sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==} + engines: {node: '>=10.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /run-parallel/1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + + /sade/1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} + dependencies: + mri: 1.2.0 + dev: true + + /sander/0.5.1: + resolution: {integrity: sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==} + dependencies: + es6-promise: 3.3.1 + graceful-fs: 4.2.10 + mkdirp: 0.5.6 + rimraf: 2.7.1 + dev: true + + /semver/7.3.8: + resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /set-cookie-parser/2.5.1: + resolution: {integrity: sha512-1jeBGaKNGdEq4FgIrORu/N570dwoPYio8lSoYLWmX7sQ//0JY08Xh9o5pBcgmHQ/MbsYp/aZnOe1s1lIsbLprQ==} + dev: true + + /shebang-command/2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: true + + /shebang-regex/3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + 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/3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: true + + /sorcery/0.10.0: + resolution: {integrity: sha512-R5ocFmKZQFfSTstfOtHjJuAwbpGyf9qjQa1egyhvXSbM7emjrtLXtGdZsDJDABC85YBfVvrOiGWKSYXPKdvP1g==} + hasBin: true + dependencies: + buffer-crc32: 0.2.13 + minimist: 1.2.7 + sander: 0.5.1 + sourcemap-codec: 1.4.8 + dev: true + + /source-map-js/1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + dev: true + + /sourcemap-codec/1.4.8: + resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} + dev: true + + /streamsearch/1.1.0: + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} + dev: true + + /strip-ansi/6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: true + + /strip-indent/3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + dependencies: + min-indent: 1.0.1 + dev: true + + /strip-json-comments/3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + dev: true + + /supports-color/7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-preserve-symlinks-flag/1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true + + /svelte-check/2.9.2_svelte@3.53.1: + resolution: {integrity: sha512-DRi8HhnCiqiGR2YF9ervPGvtoYrheE09cXieCTEqeTPOTJzfoa54Py8rovIBv4bH4n5HgZYIyTQ3DDLHQLl2uQ==} + hasBin: true + peerDependencies: + svelte: ^3.24.0 + dependencies: + '@jridgewell/trace-mapping': 0.3.17 + 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_7dvewpees4iyn2tkw2qzal77a4 + typescript: 4.9.3 + transitivePeerDependencies: + - '@babel/core' + - coffeescript + - less + - node-sass + - postcss + - postcss-load-config + - pug + - sass + - stylus + - sugarss + dev: true + + /svelte-hmr/0.15.1_svelte@3.53.1: + resolution: {integrity: sha512-BiKB4RZ8YSwRKCNVdNxK/GfY+r4Kjgp9jCLEy0DuqAKfmQtpL38cQK3afdpjw4sqSs4PLi3jIPJIFp259NkZtA==} + engines: {node: ^12.20 || ^14.13.1 || >= 16} + peerDependencies: + svelte: '>=3.19.0' + dependencies: + svelte: 3.53.1 + dev: true + + /svelte-preprocess/4.10.7_7dvewpees4iyn2tkw2qzal77a4: + 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 + sorcery: 0.10.0 + strip-indent: 3.0.0 + svelte: 3.53.1 + typescript: 4.9.3 + dev: true + + /svelte/3.53.1: + resolution: {integrity: sha512-Q4/hHkktZogGhN5iqxqSi9sjEVoe/NbIxX4hXEHoasTxj+TxEQVAq66LnDMdAZxjmsodkoI5F3slqsS68U7FNw==} + engines: {node: '>= 8'} + dev: true + + /text-table/0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + dev: true + + /tiny-glob/0.2.9: + resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==} + dependencies: + globalyzer: 0.1.0 + globrex: 0.1.2 + dev: true + + /to-regex-range/5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: true + + /totalist/3.0.0: + resolution: {integrity: sha512-eM+pCBxXO/njtF7vdFsHuqb+ElbxqtI4r5EAvk6grfAFyJ6IvWlSkfZ5T9ozC6xWw3Fj1fGoSmrl0gUs46JVIw==} + engines: {node: '>=6'} + dev: true + + /tslib/1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + dev: true + + /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==} + engines: {node: '>= 6'} + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + dependencies: + tslib: 1.14.1 + typescript: 4.9.3 + dev: true + + /type-check/0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + dev: true + + /type-fest/0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + dev: true + + /typescript/4.9.3: + resolution: {integrity: sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA==} + engines: {node: '>=4.2.0'} + hasBin: true + dev: true + + /undici/5.12.0: + resolution: {integrity: sha512-zMLamCG62PGjd9HHMpo05bSLvvwWOZgGeiWlN/vlqu3+lRo3elxktVGEyLMX+IO7c2eflLjcW74AlkhEZm15mg==} + engines: {node: '>=12.18'} + dependencies: + busboy: 1.6.0 + dev: true + + /uri-js/4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.1.1 + dev: true + + /vite/3.2.4: + resolution: {integrity: sha512-Z2X6SRAffOUYTa+sLy3NQ7nlHFU100xwanq1WDwqaiFiCe+25zdxP1TfCS5ojPV2oDDcXudHIoPnI1Z/66B7Yw==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + esbuild: 0.15.15 + postcss: 8.4.19 + resolve: 1.22.1 + rollup: 2.79.1 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /vitefu/0.2.2_vite@3.2.4: + resolution: {integrity: sha512-8CKEIWPm4B4DUDN+h+hVJa9pyNi7rzc5MYmbxhs1wcMakueGFNWB5/DL30USm9qU3xUPnL4/rrLEAwwFiD1tag==} + peerDependencies: + vite: ^3.0.0 + peerDependenciesMeta: + vite: + optional: true + dependencies: + vite: 3.2.4 + dev: true + + /which/2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /word-wrap/1.2.3: + resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} + engines: {node: '>=0.10.0'} + dev: true + + /wrappy/1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: true + + /yallist/4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: true + + /yocto-queue/0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + dev: true diff --git a/apps/client/postcss.config.cjs b/apps/client/postcss.config.cjs new file mode 100644 index 000000000..fe10e55a8 --- /dev/null +++ b/apps/client/postcss.config.cjs @@ -0,0 +1,13 @@ +const tailwindcss = require('tailwindcss'); +const autoprefixer = require('autoprefixer'); + +const config = { + plugins: [ + //Some plugins, like tailwindcss/nesting, need to run before Tailwind, + tailwindcss(), + //But others, like autoprefixer, need to run after, + autoprefixer + ] +}; + +module.exports = config; diff --git a/apps/client/src/app.d.ts b/apps/client/src/app.d.ts new file mode 100644 index 000000000..8f4d63895 --- /dev/null +++ b/apps/client/src/app.d.ts @@ -0,0 +1,9 @@ +// See https://kit.svelte.dev/docs/types#app +// for information about these interfaces +// and what to do when importing types +declare namespace App { + // interface Locals {} + // interface PageData {} + // interface Error {} + // interface Platform {} +} diff --git a/apps/client/src/app.html b/apps/client/src/app.html new file mode 100644 index 000000000..0061883f2 --- /dev/null +++ b/apps/client/src/app.html @@ -0,0 +1,12 @@ + + + + + + + %sveltekit.head% + + +
%sveltekit.body%
+ + diff --git a/apps/client/src/app.postcss b/apps/client/src/app.postcss new file mode 100644 index 000000000..d32a3b615 --- /dev/null +++ b/apps/client/src/app.postcss @@ -0,0 +1,14 @@ +/* Write your global styles here, in PostCSS syntax */ +@tailwind base; +@tailwind components; +@tailwind utilities; + +html { + @apply bg-black text-white; +} +input { + @apply bg-black border; +} +button { + @apply border px-2 p-1 bg-green-500; +} diff --git a/apps/client/src/lib/store.ts b/apps/client/src/lib/store.ts new file mode 100644 index 000000000..c58c5921a --- /dev/null +++ b/apps/client/src/lib/store.ts @@ -0,0 +1,22 @@ +import { writable, readable, type Writable, type Readable } from 'svelte/store'; +import superjson from 'superjson'; +import type { AppRouter } from 'server/src/router'; +import { createTRPCProxyClient, httpBatchLink } from '@trpc/client'; +import { browser, dev } from '$app/environment'; +import Cookies from 'js-cookie'; +const serverBaseUrl = dev ? `http://${browser && window.location.hostname}:2022` : ''; + +export let token: string = Cookies.get('token') || ''; +export const t = createTRPCProxyClient({ + transformer: superjson, + links: [ + httpBatchLink({ + url: `${serverBaseUrl}/trpc`, + headers() { + return { + Authorization: token + }; + } + }) + ] +}); diff --git a/apps/client/src/routes/+layout.svelte b/apps/client/src/routes/+layout.svelte new file mode 100644 index 000000000..64e89a8d2 --- /dev/null +++ b/apps/client/src/routes/+layout.svelte @@ -0,0 +1,7 @@ + + +
+ +
diff --git a/apps/client/src/routes/+page.svelte b/apps/client/src/routes/+page.svelte new file mode 100644 index 000000000..952613f4d --- /dev/null +++ b/apps/client/src/routes/+page.svelte @@ -0,0 +1,10 @@ + + +
hello
diff --git a/apps/client/static/favicon.png b/apps/client/static/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..825b9e65af7c104cfb07089bb28659393b4f2097 GIT binary patch literal 1571 zcmV+;2Hg3HP)Px)-AP12RCwC$UE6KzI1p6{F2N z1VK2vi|pOpn{~#djwYcWXTI_im_u^TJgMZ4JMOsSj!0ma>B?-(Hr@X&W@|R-$}W@Z zgj#$x=!~7LGqHW?IO8+*oE1MyDp!G=L0#^lUx?;!fXv@l^6SvTnf^ac{5OurzC#ZMYc20lI%HhX816AYVs1T3heS1*WaWH z%;x>)-J}YB5#CLzU@GBR6sXYrD>Vw(Fmt#|JP;+}<#6b63Ike{Fuo!?M{yEffez;| zp!PfsuaC)>h>-AdbnwN13g*1LowNjT5?+lFVd#9$!8Z9HA|$*6dQ8EHLu}U|obW6f z2%uGv?vr=KNq7YYa2Roj;|zooo<)lf=&2yxM@e`kM$CmCR#x>gI>I|*Ubr({5Y^rb zghxQU22N}F51}^yfDSt786oMTc!W&V;d?76)9KXX1 z+6Okem(d}YXmmOiZq$!IPk5t8nnS{%?+vDFz3BevmFNgpIod~R{>@#@5x9zJKEHLHv!gHeK~n)Ld!M8DB|Kfe%~123&Hz1Z(86nU7*G5chmyDe ziV7$pB7pJ=96hpxHv9rCR29%bLOXlKU<_13_M8x)6;P8E1Kz6G<&P?$P^%c!M5`2` zfY2zg;VK5~^>TJGQzc+33-n~gKt{{of8GzUkWmU110IgI0DLxRIM>0US|TsM=L|@F z0Bun8U!cRB7-2apz=y-7*UxOxz@Z0)@QM)9wSGki1AZ38ceG7Q72z5`i;i=J`ILzL z@iUO?SBBG-0cQuo+an4TsLy-g-x;8P4UVwk|D8{W@U1Zi z!M)+jqy@nQ$p?5tsHp-6J304Q={v-B>66$P0IDx&YT(`IcZ~bZfmn11#rXd7<5s}y zBi9eim&zQc0Dk|2>$bs0PnLmDfMP5lcXRY&cvJ=zKxI^f0%-d$tD!`LBf9^jMSYUA zI8U?CWdY@}cRq6{5~y+)#h1!*-HcGW@+gZ4B};0OnC~`xQOyH19z*TA!!BJ%9s0V3F?CAJ{hTd#*tf+ur-W9MOURF-@B77_-OshsY}6 zOXRY=5%C^*26z?l)1=$bz30!so5tfABdSYzO+H=CpV~aaUefmjvfZ3Ttu9W&W3Iu6 zROlh0MFA5h;my}8lB0tAV-Rvc2Zs_CCSJnx@d`**$idgy-iMob4dJWWw|21b4NB=LfsYp0Aeh{Ov)yztQi;eL4y5 zMi>8^SzKqk8~k?UiQK^^-5d8c%bV?$F8%X~czyiaKCI2=UH { + await page.goto('/'); + expect(await page.textContent('h1')).toBe('Welcome to SvelteKit'); +}); diff --git a/apps/client/tsconfig.json b/apps/client/tsconfig.json new file mode 100644 index 000000000..b959b7dc5 --- /dev/null +++ b/apps/client/tsconfig.json @@ -0,0 +1,21 @@ +{ + "extends": "./.svelte-kit/tsconfig.json", + "compilerOptions": { + "allowJs": true, + "checkJs": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "sourceMap": true, + "strict": false, + "paths": { + "$lib": [ + "src/lib" + ], + "$lib/*": [ + "src/lib/*" + ], + } + } +} \ No newline at end of file diff --git a/apps/client/vite.config.ts b/apps/client/vite.config.ts new file mode 100644 index 000000000..65a557e19 --- /dev/null +++ b/apps/client/vite.config.ts @@ -0,0 +1,11 @@ +import { sveltekit } from '@sveltejs/kit/vite'; +import type { UserConfig } from 'vite'; + +const config: UserConfig = { + server: { + host: '0.0.0.0', + }, + plugins: [sveltekit()] +}; + +export default config; diff --git a/apps/server/.env-template b/apps/server/.env-template new file mode 100644 index 000000000..a45f8578c --- /dev/null +++ b/apps/server/.env-template @@ -0,0 +1,2 @@ +NODE_ENV="development" +DATABASE_URL="file:../db/dev.db" \ No newline at end of file diff --git a/apps/server/.prettierrc b/apps/server/.prettierrc new file mode 100644 index 000000000..a77fddea9 --- /dev/null +++ b/apps/server/.prettierrc @@ -0,0 +1,9 @@ +{ + "useTabs": true, + "singleQuote": true, + "trailingComma": "none", + "printWidth": 100, + "plugins": ["prettier-plugin-svelte"], + "pluginSearchDirs": ["."], + "overrides": [{ "files": "*.svelte", "options": { "parser": "svelte" } }] +} diff --git a/apps/server/db/.gitkeep b/apps/server/db/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/apps/server/package.json b/apps/server/package.json new file mode 100644 index 000000000..0621bd01b --- /dev/null +++ b/apps/server/package.json @@ -0,0 +1,56 @@ +{ + "name": "server", + "description": "Coolify's Fastify API", + "license": "Apache-2.0", + "scripts": { + "build": "rimraf ../../build && tsc --outDir ../../build", + "dev": "tsx watch --clear-screen=false src", + "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": { + "jsonwebtoken": "8.5.1", + "@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", + "@prisma/client": "4.6.1", + "@trpc/client": "10.1.0", + "@trpc/server": "10.1.0", + "abort-controller": "3.0.0", + "fastify": "4.10.2", + "fastify-plugin": "4.4.0", + "node-fetch": "3.3.0", + "prisma": "4.6.1", + "superjson": "1.11.0", + "tslib": "2.4.1", + "ws": "8.11.0", + "zod": "3.19.1" + }, + "devDependencies": { + "@types/node": "18.11.9", + "@types/node-fetch": "2.6.2", + "@types/ws": "8.5.3", + "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/server/prisma/migrations/20221206140938_init/migration.sql b/apps/server/prisma/migrations/20221206140938_init/migration.sql new file mode 100644 index 000000000..462efbd29 --- /dev/null +++ b/apps/server/prisma/migrations/20221206140938_init/migration.sql @@ -0,0 +1,21 @@ +-- CreateTable +CREATE TABLE "Category" ( + "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, + "name" TEXT NOT NULL, + "budget" INTEGER NOT NULL, + "customIcon" TEXT, + "period" TEXT NOT NULL DEFAULT 'month', + "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" DATETIME NOT NULL +); + +-- CreateTable +CREATE TABLE "Transaction" ( + "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, + "amount" INTEGER NOT NULL, + "description" TEXT, + "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" DATETIME NOT NULL, + "categoryId" INTEGER NOT NULL, + CONSTRAINT "Transaction_categoryId_fkey" FOREIGN KEY ("categoryId") REFERENCES "Category" ("id") ON DELETE RESTRICT ON UPDATE CASCADE +); diff --git a/apps/server/prisma/migrations/migration_lock.toml b/apps/server/prisma/migrations/migration_lock.toml new file mode 100644 index 000000000..e5e5c4705 --- /dev/null +++ b/apps/server/prisma/migrations/migration_lock.toml @@ -0,0 +1,3 @@ +# 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/server/prisma/schema.prisma b/apps/server/prisma/schema.prisma new file mode 100644 index 000000000..e0020544b --- /dev/null +++ b/apps/server/prisma/schema.prisma @@ -0,0 +1,11 @@ +// This is your Prisma schema file, +// learn more about it in the docs: https://pris.ly/d/prisma-schema + +generator client { + provider = "prisma-client-js" +} + +datasource db { + provider = "sqlite" + url = env("DATABASE_URL") +} diff --git a/apps/server/src/config/index.ts b/apps/server/src/config/index.ts new file mode 100644 index 000000000..9b139c5bd --- /dev/null +++ b/apps/server/src/config/index.ts @@ -0,0 +1,7 @@ +import type { ServerOptions } from '../server'; + +export const serverConfig: ServerOptions = { + dev: false, + port: 2022, + prefix: '/trpc' +}; diff --git a/apps/server/src/env.js b/apps/server/src/env.js new file mode 100644 index 000000000..cbe1c25db --- /dev/null +++ b/apps/server/src/env.js @@ -0,0 +1,15 @@ +const { z } = require('zod'); + +/*eslint sort-keys: "error"*/ +const envSchema = z.object({ + NODE_ENV: z.enum(['development', 'test', 'production']), + COOLIFY_SECRET_KEY: z.string() +}); + +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/server/src/index.ts b/apps/server/src/index.ts new file mode 100644 index 000000000..8f2d2782e --- /dev/null +++ b/apps/server/src/index.ts @@ -0,0 +1,7 @@ +import { serverConfig } from './config'; +import { createServer } from './server'; + +const server = createServer(serverConfig); + +server.start(); + diff --git a/apps/server/src/prisma.ts b/apps/server/src/prisma.ts new file mode 100644 index 000000000..a384c202c --- /dev/null +++ b/apps/server/src/prisma.ts @@ -0,0 +1,21 @@ +/** + * 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; +} \ No newline at end of file diff --git a/apps/server/src/router/context.ts b/apps/server/src/router/context.ts new file mode 100644 index 000000000..bba7c2749 --- /dev/null +++ b/apps/server/src/router/context.ts @@ -0,0 +1,19 @@ +import { inferAsyncReturnType } from '@trpc/server'; +import { CreateFastifyContextOptions } from '@trpc/server/adapters/fastify'; +import jwt from 'jsonwebtoken'; +import { env } from '../env'; +export interface User { + name: string | string[]; +} + +export function createContext({ req, res }: CreateFastifyContextOptions) { + const token = req.headers.authorization; + if (token) { + const user = jwt.verify(token, env.COOLIFY_SECRET_KEY); + + console.log(user); + } + return { req, res }; +} + +export type Context = inferAsyncReturnType; diff --git a/apps/server/src/router/index.ts b/apps/server/src/router/index.ts new file mode 100644 index 000000000..cf362f41d --- /dev/null +++ b/apps/server/src/router/index.ts @@ -0,0 +1,8 @@ +import { apiRouter } from './routers/api'; +import { router } from './trpc'; + +export const appRouter = router({ + api: apiRouter, +}); + +export type AppRouter = typeof appRouter; diff --git a/apps/server/src/router/routers/api.ts b/apps/server/src/router/routers/api.ts new file mode 100644 index 000000000..685e0339a --- /dev/null +++ b/apps/server/src/router/routers/api.ts @@ -0,0 +1,18 @@ +// import { z } from 'zod'; +import { publicProcedure, router } from '../trpc'; +// import { prisma } from '../../prisma'; +import { TRPCError } from '@trpc/server'; + +export const apiRouter = router({ + getConnection: publicProcedure.query(async () => { + try { + return { success: true }; + } catch (error) { + throw new TRPCError({ + code: 'INTERNAL_SERVER_ERROR', + message: 'An unexpected error occurred, please try again later.', + cause: error + }); + } + }) +}); diff --git a/apps/server/src/router/trpc.ts b/apps/server/src/router/trpc.ts new file mode 100644 index 000000000..5b71870bc --- /dev/null +++ b/apps/server/src/router/trpc.ts @@ -0,0 +1,13 @@ +import { initTRPC } from '@trpc/server'; +import superjson from 'superjson'; +import { Context } from './context'; + +const t = initTRPC.context().create({ + transformer: superjson, + errorFormatter({ shape }) { + return shape; + }, +}); + +export const router = t.router; +export const publicProcedure = t.procedure; diff --git a/apps/server/src/server.ts b/apps/server/src/server.ts new file mode 100644 index 000000000..02a80dba8 --- /dev/null +++ b/apps/server/src/server.ts @@ -0,0 +1,58 @@ +import { fastifyTRPCPlugin } from '@trpc/server/adapters/fastify'; +import fastify from 'fastify'; +import { appRouter } from './router'; +import { createContext } from './router/context'; +import cors from '@fastify/cors'; +import * as path from 'node:path'; +import serve from '@fastify/static'; +// import { prisma } from './prisma'; + +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 } + }); + // 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.get('/api', async () => { + return { status: 'ok' }; + }); + const stop = () => server.close(); + const start = async () => { + try { + await server.listen({ host: '0.0.0.0', port }); + console.log('Server is listening on port', port); + } catch (err) { + server.log.error(err); + process.exit(1); + } + }; + + return { server, start, stop }; +} diff --git a/apps/server/tsconfig.json b/apps/server/tsconfig.json new file mode 100644 index 000000000..c0c231b4e --- /dev/null +++ b/apps/server/tsconfig.json @@ -0,0 +1,43 @@ +{ + "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/package.json b/package.json index e30a76a54..c2c5bc9d5 100644 --- a/package.json +++ b/package.json @@ -18,9 +18,14 @@ "lint": "run-p -l -n lint:*", "lint:api": "NODE_ENV=development pnpm run --filter api lint", "dev:container": "docker-compose -f docker-compose-dev.yaml up --build || docker compose -f docker-compose-dev.yaml up --build", + "dev:trpc": "NODE_ENV=development run-p -l -n dev:server dev:client", "dev": "run-p -l -n dev:api dev:ui", "dev:api": "NODE_ENV=development pnpm run --filter api dev", + "dev:server": "NODE_ENV=development pnpm run --filter server dev", + "dev:client": "NODE_ENV=development pnpm run --filter client dev", "dev:ui": "NODE_ENV=development pnpm run --filter ui dev", + "build:trpc": "NODE_ENV=production pnpm run --filter server build && pnpm run --filter client build && cp ./apps/server/package.json build/ && cd build/ && pnpm install -p .", + "start:trpc": "NODE_ENV=production node build/index.js", "build": "NODE_ENV=production run-p -n build:*", "build:api": "NODE_ENV=production pnpm run --filter api build", "build:ui": "NODE_ENV=production pnpm run --filter ui build", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ab6a85025..1c06d02dd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -153,6 +153,61 @@ importers: 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 + '@typescript-eslint/eslint-plugin': 5.44.0 + '@typescript-eslint/parser': 5.44.0 + autoprefixer: 10.4.13 + eslint: 8.28.0 + eslint-config-prettier: 8.5.0 + eslint-plugin-svelte3: 4.0.0 + js-cookie: 3.0.1 + 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 + 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 + js-cookie: 3.0.1 + server: link:../server + superjson: 1.11.0 + 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 + '@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 @@ -165,6 +220,67 @@ importers: got: 12.3.1 node-gettext: 3.0.0 + apps/server: + specifiers: + '@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 + '@prisma/client': 4.6.1 + '@trpc/client': 10.1.0 + '@trpc/server': 10.1.0 + '@types/node': 18.11.9 + '@types/node-fetch': 2.6.2 + '@types/ws': 8.5.3 + abort-controller: 3.0.0 + fastify: 4.10.2 + fastify-plugin: 4.4.0 + jsonwebtoken: 8.5.1 + node-fetch: 3.3.0 + npm-run-all: 4.1.5 + prisma: 4.6.1 + rimraf: 3.0.2 + start-server-and-test: 1.14.0 + superjson: 1.11.0 + tslib: 2.4.1 + tsx: 3.12.1 + typescript: 4.9.3 + wait-port: 1.0.4 + ws: 8.11.0 + zod: 3.19.1 + dependencies: + '@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 + '@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 + fastify: 4.10.2 + fastify-plugin: 4.4.0 + jsonwebtoken: 8.5.1 + node-fetch: 3.3.0 + prisma: 4.6.1 + superjson: 1.11.0 + tslib: 2.4.1 + ws: 8.11.0 + zod: 3.19.1 + devDependencies: + '@types/node': 18.11.9 + '@types/node-fetch': 2.6.2 + '@types/ws': 8.5.3 + 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 @@ -1286,6 +1402,27 @@ 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'} @@ -1340,6 +1477,12 @@ packages: pkg-up: 3.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/busboy/1.1.0: resolution: {integrity: sha512-Fv854f94v0CzIDllbY3i/0NJPNBRNLDawf3BTYVGCe9VrIIs3Wi7AFx24F9NzCxdf0wyx/x0Q9kEVnvDOPnlxA==} engines: {node: '>=10.17.0'} @@ -1369,7 +1512,7 @@ packages: resolution: {integrity: sha512-9l+JTUiFWSwb9dGSeR46aDWBjrAg8lJeqMjbotG5/8Ho90+qzRbt8kdSnVhLm5k6HcqXcBaBAT/6cImRhRq0VQ==} dependencies: env-schema: 5.0.0 - fastify-plugin: 4.3.0 + fastify-plugin: 4.4.0 dev: false /@fastify/error/3.0.0: @@ -1392,6 +1535,16 @@ packages: steed: 1.1.3 dev: false + /@fastify/jwt/6.5.0: + resolution: {integrity: sha512-5fR5bRXuWurP56gy/owng3BS/3e9vA0mON1XCGLsznvsudLZUdiPaK0R8Bl5gVwFAW75iFkNOp8qgnw26Csjrw==} + dependencies: + '@fastify/error': 3.0.0 + '@lukeed/ms': 2.0.0 + fast-jwt: 2.0.2 + fastify-plugin: 4.4.0 + steed: 1.1.3 + dev: false + /@fastify/multipart/7.3.0: resolution: {integrity: sha512-tbzQiRFxoADCn0G10CqiQ/nDWWcfegtwg826Pfz2h7+XvuqJhGnko0TbafrWIY7hnGD+sNCGMdiTVsxxs6zigA==} dependencies: @@ -1419,6 +1572,30 @@ packages: - supports-color dev: false + /@fastify/static/6.6.0: + resolution: {integrity: sha512-UiYSN2dUmDZ48M40xdIwY1dPwSSYD7c+wtoIQP8y7wyxCwcUtf1YT5/Q4n1uJsBF1fySvuo9njQZKlHeiKy4HQ==} + dependencies: + '@fastify/accept-negotiator': 1.0.0 + content-disposition: 0.5.4 + fastify-plugin: 4.4.0 + glob: 8.0.3 + p-limit: 3.1.0 + readable-stream: 4.1.0 + send: 0.18.0 + transitivePeerDependencies: + - 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 @@ -1429,6 +1606,16 @@ 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'} @@ -1514,6 +1701,19 @@ 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.9 + 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==} dev: true @@ -1612,6 +1812,20 @@ 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'} @@ -1633,7 +1847,6 @@ 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==} @@ -1655,6 +1868,33 @@ 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} @@ -1671,12 +1911,31 @@ packages: kleur: 4.1.5 magic-string: 0.26.7 svelte: 3.53.1 - svelte-hmr: 0.15.0_svelte@3.53.1 + svelte-hmr: 0.15.1_svelte@3.53.1 vite: 3.2.4 transitivePeerDependencies: - 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: @@ -1710,6 +1969,18 @@ 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 @@ -1739,6 +2010,10 @@ packages: 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 @@ -1779,6 +2054,13 @@ packages: resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} dev: false + /@types/node-fetch/2.6.2: + resolution: {integrity: sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==} + dependencies: + '@types/node': 18.11.9 + form-data: 3.0.1 + dev: true + /@types/node-os-utils/1.3.0: resolution: {integrity: sha512-XwVteWQx/XkfRPyaGkw8dEbrCAkoRZ73pI3XznUYIpzbCfpQB3UnDlR5TnmdhetlT889tUJGF8QWo9xrgTpsiA==} dev: true @@ -1822,6 +2104,12 @@ packages: resolution: {integrity: sha512-Jjakcv8Roqtio6w1gr0D7y6twbhx6gGgFGF5BLwajPpnOIOxFkakFhCq+LmyyeAz7BX6ULrjBOxdKaCDy+4+dQ==} dev: false + /@types/ws/8.5.3: + resolution: {integrity: sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==} + dependencies: + '@types/node': 18.11.9 + 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} @@ -2143,6 +2431,10 @@ 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'} @@ -2199,6 +2491,14 @@ 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: @@ -2910,7 +3210,6 @@ 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==} @@ -2985,6 +3284,10 @@ 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: @@ -3005,6 +3308,13 @@ 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'} @@ -3119,6 +3429,11 @@ packages: 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'} @@ -3216,6 +3531,18 @@ 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 @@ -3272,6 +3599,12 @@ 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: @@ -3445,6 +3778,18 @@ 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'} @@ -3487,6 +3832,11 @@ 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'} @@ -3521,7 +3871,11 @@ packages: dependencies: acorn-node: 1.8.2 defined: 1.0.0 - minimist: 1.2.6 + 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==} @@ -3600,11 +3954,6 @@ packages: dotenv: 8.6.0 dev: false - /dotenv/16.0.1: - resolution: {integrity: sha512-1K6hR6wtk2FviQ4kEiSjFiH5rpzEVi8WW0x96aztHVMhEspNpc4DVOUTEHtEva5VThQ8IaBX1Pe4gSzpVVUsKQ==} - engines: {node: '>=12'} - dev: false - /dotenv/16.0.2: resolution: {integrity: sha512-JvpYKUmzQhYoIFgK2MOnF3bciIZoItIIoryihy0rIA+H4Jy0FmgyKYAHCTN98P5ybGSJcIFbh6QKeJdtZd1qhA==} engines: {node: '>=12'} @@ -3628,7 +3977,6 @@ packages: /duplexer/0.1.2: resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} - dev: false /ecdsa-sig-formatter/1.0.11: resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} @@ -3707,7 +4055,7 @@ packages: resolution: {integrity: sha512-91u95Nlny+LmjF3Mk96j8k6k+GOXcFEdMUv3bWQjtM2l+KTAdW6qITiv8kHYO8vCaCScXpJTDyd1AFnCQTnYaQ==} dependencies: ajv: 8.11.0 - dotenv: 16.0.1 + dotenv: 16.0.3 dotenv-expand: 8.0.3 dev: false @@ -4163,7 +4511,6 @@ packages: split: 0.3.3 stream-combiner: 0.0.4 through: 2.3.8 - dev: false /event-target-shim/5.0.1: resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} @@ -4175,6 +4522,21 @@ packages: 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} @@ -4215,17 +4577,6 @@ packages: resolution: {integrity: sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==} dev: true - /fast-glob/3.2.11: - resolution: {integrity: sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==} - engines: {node: '>=8.6.0'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.5 - dev: true - /fast-glob/3.2.12: resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} engines: {node: '>=8.6.0'} @@ -4259,6 +4610,15 @@ packages: mnemonist: 0.39.5 dev: false + /fast-jwt/2.0.2: + resolution: {integrity: sha512-XE/gRruEjQOfqnhxosaKIdyNgwatWERQzzZEn8mgHNeUGBEklnH2iQvHYn+K20EGGbkuaLvlmCUmb2hyI/v9kA==} + engines: {node: '>=14 <20'} + dependencies: + asn1.js: 5.4.1 + ecdsa-sig-formatter: 1.0.11 + mnemonist: 0.39.5 + dev: false + /fast-levenshtein/2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} dev: true @@ -4304,6 +4664,10 @@ packages: resolution: {integrity: sha512-M3+i368lV0OYTJ5TfClIoPKEKSOF7112iiPdwgfSR0gN98BjA1Nk+c6oBHtfcVt9KiMxl+EQKHC1QNWo3ZOpYQ==} dev: false + /fastify-plugin/4.4.0: + resolution: {integrity: sha512-ovwFQG2qNy3jcCROiWpr94Hs0le+c7N/3t7m9aVwbFhkxcR/esp2xu25dP8e617HpQdmeDv+gFX4zagdUhDByw==} + dev: false + /fastify-socket.io/4.0.0_socket.io@4.5.3: resolution: {integrity: sha512-j5mgvHZpQ0Iiz9HyKwGdLOQGjFKH/6KOwx8esxCIBkIjtiQkdC8e4J1xX4JAMISLfTJOY9EHQG/1MmU/9cXaog==} peerDependencies: @@ -4446,6 +4810,18 @@ packages: mini-svg-data-uri: 1.4.4 dev: true + /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'} @@ -4456,6 +4832,15 @@ packages: 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 @@ -4482,7 +4867,6 @@ packages: /from/0.1.7: resolution: {integrity: sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==} - dev: false /fs-constants/1.0.0: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} @@ -4556,7 +4940,6 @@ packages: /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==} @@ -4566,6 +4949,10 @@ 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'} @@ -4821,6 +5208,11 @@ 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'} @@ -5087,7 +5479,6 @@ 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==} @@ -5140,6 +5531,11 @@ 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 @@ -5157,6 +5553,16 @@ 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'} @@ -5291,6 +5697,11 @@ 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'} @@ -5304,7 +5715,7 @@ packages: dependencies: cookie: 0.5.0 process-warning: 2.0.0 - set-cookie-parser: 2.4.8 + set-cookie-parser: 2.5.1 dev: false /lil-http-terminator/1.2.2: @@ -5486,13 +5897,19 @@ 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==} - dev: false /maybe-combine-errors/1.0.0: resolution: {integrity: sha512-eefp6IduNPT6fVdwPp+1NgD0PML1NU5P6j1Mj5nz1nidX8/sWY7119WL8vTAHgqfsY74TzW0w1XPgdYEKkGZ5A==} @@ -5513,7 +5930,6 @@ 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==} @@ -5529,14 +5945,12 @@ 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==} @@ -5544,6 +5958,12 @@ 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'} @@ -5602,6 +6022,7 @@ packages: /minimist/1.2.6: resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==} + dev: false /minimist/1.2.7: resolution: {integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==} @@ -5614,7 +6035,7 @@ packages: resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} hasBin: true dependencies: - minimist: 1.2.6 + minimist: 1.2.7 dev: true /mnemonist/0.39.5: @@ -5628,6 +6049,11 @@ 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==} @@ -5701,6 +6127,15 @@ packages: 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'} @@ -5785,10 +6220,17 @@ packages: minimatch: 3.1.2 pidtree: 0.3.1 read-pkg: 3.0.0 - shell-quote: 1.7.3 + shell-quote: 1.7.4 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} @@ -6111,7 +6553,6 @@ packages: resolution: {integrity: sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==} dependencies: through: 2.3.8 - dev: false /pick-deep/1.0.0: resolution: {integrity: sha512-Uy0VUtabou1sPl/vVClBFrWi4Ae/D3Vqu44FJawmm4lnduu5E16ykw8kh15fiUeLQ6lbmXQ0EMr3YIsqpLZl+A==} @@ -6184,6 +6625,12 @@ 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'} @@ -6220,6 +6667,23 @@ 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'} @@ -6259,6 +6723,16 @@ 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: @@ -6275,6 +6749,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 + /prisma/4.6.1: resolution: {integrity: sha512-BR4itMCuzrDV4tn3e2TF+nh1zIX/RVU0isKtKoN28ADeoJ9nYaMhiuRRkFd2TZN8+l/XfYzoRKyHzUFXLQhmBQ==} engines: {node: '>=14.17'} @@ -6311,7 +6791,6 @@ packages: hasBin: true dependencies: event-stream: 3.3.4 - dev: false /pseudomap/1.0.2: resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} @@ -6588,6 +7067,12 @@ 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'} @@ -6675,9 +7160,8 @@ packages: resolution: {integrity: sha512-6oGOAj9wPBKEuzJxqrN1sxMHJKbWOg7D2zNYOXaKrDC4lP6FpAw2MVuZd4okp/KqtRxkgLMweEd6HM1+c4m8Yg==} dev: false - /set-cookie-parser/2.4.8: - resolution: {integrity: sha512-edRH8mBKEWNVIVMKejNnuJxleqYE/ZSdcT8/Nem9/mmosx12pctd80s2Oy00KNZzrogMZS5mauK2/ymL1bvlvg==} - dev: false + /set-cookie-parser/2.5.1: + resolution: {integrity: sha512-1jeBGaKNGdEq4FgIrORu/N570dwoPYio8lSoYLWmX7sQ//0JY08Xh9o5pBcgmHQ/MbsYp/aZnOe1s1lIsbLprQ==} /setprototypeof/1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} @@ -6705,13 +7189,8 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - /shell-quote/1.7.3: - resolution: {integrity: sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==} - dev: true - /shell-quote/1.7.4: resolution: {integrity: sha512-8o/QEhSSRb1a5i7TFR0iM4G16Z0vYB2OQVs4G3aAFXjn3T6yEx8AZxy1PgDF7I00LZHYA3WxaSYIf5e5sAX8Rw==} - dev: false /side-channel/1.0.4: resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} @@ -6736,6 +7215,15 @@ 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'} @@ -6806,7 +7294,7 @@ packages: hasBin: true dependencies: buffer-crc32: 0.2.13 - minimist: 1.2.6 + minimist: 1.2.7 sander: 0.5.1 sourcemap-codec: 1.4.8 dev: true @@ -6821,13 +7309,26 @@ 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 /spdx-correct/3.1.1: resolution: {integrity: sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==} @@ -6855,7 +7356,6 @@ packages: resolution: {integrity: sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==} dependencies: through: 2.3.8 - dev: false /split2/4.1.0: resolution: {integrity: sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ==} @@ -6878,6 +7378,22 @@ 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'} @@ -6904,13 +7420,17 @@ packages: resolution: {integrity: sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==} dependencies: duplexer: 0.1.2 - dev: false /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'} @@ -6990,6 +7510,11 @@ 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'} @@ -7020,6 +7545,13 @@ 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'} @@ -7042,6 +7574,34 @@ 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_jgeygver3mevbte7srfft5qwby + typescript: 4.9.3 + 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 @@ -7050,7 +7610,7 @@ packages: dependencies: '@jridgewell/trace-mapping': 0.3.9 chokidar: 3.5.3 - fast-glob: 3.2.11 + fast-glob: 3.2.12 import-fresh: 3.3.0 picocolors: 1.0.0 sade: 1.8.1 @@ -7070,8 +7630,8 @@ packages: - sugarss dev: true - /svelte-hmr/0.15.0_svelte@3.53.1: - resolution: {integrity: sha512-Aw21SsyoohyVn4yiKXWPNCSW2DQNH/76kvUnE9kpt4h9hcg9tfyQc6xshx9hzgMfGF0kVx0EGD8oBMWSnATeOg==} + /svelte-hmr/0.15.1_svelte@3.53.1: + resolution: {integrity: sha512-BiKB4RZ8YSwRKCNVdNxK/GfY+r4Kjgp9jCLEy0DuqAKfmQtpL38cQK3afdpjw4sqSs4PLi3jIPJIFp259NkZtA==} engines: {node: ^12.20 || ^14.13.1 || >= 16} peerDependencies: svelte: '>=3.19.0' @@ -7079,6 +7639,59 @@ 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_mvbmsfnr3ibpjsbee6imjcb33m: resolution: {integrity: sha512-sNPBnqYD6FnmdBrUmBCaqS00RyCsCpj2BG58A1JBswNF7b0OKviwxqVrOL/CKyJrLSClrSeqQv5BXNg2RUbPOw==} engines: {node: '>= 9.11.2'} @@ -7273,6 +7886,11 @@ 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 @@ -7340,6 +7958,17 @@ packages: typescript: 4.9.3 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 @@ -7399,6 +8028,13 @@ 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'} @@ -7495,6 +8131,43 @@ 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'} @@ -7532,6 +8205,19 @@ 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'} @@ -7568,7 +8254,6 @@ packages: /yaml/2.1.3: resolution: {integrity: sha512-AacA8nRULjKMX2DvWvOAdBZMOfQlypSFkjcOcu9FalllIDJ1kvlREzcdIZmidQUqqeMv7jorHjq2HlLv/+c2lg==} engines: {node: '>= 14'} - dev: false /yn/3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} @@ -7597,6 +8282,10 @@ packages: 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'} From 9b1ede3a598e822c4276762068011c8f19783355 Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Mon, 12 Dec 2022 09:08:00 +0100 Subject: [PATCH 03/72] fix: migration file --- .../migrations/20221129121702_preview_separator/migration.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/api/prisma/migrations/20221129121702_preview_separator/migration.sql b/apps/api/prisma/migrations/20221129121702_preview_separator/migration.sql index 2fdff0eca..e0d64cdc8 100644 --- a/apps/api/prisma/migrations/20221129121702_preview_separator/migration.sql +++ b/apps/api/prisma/migrations/20221129121702_preview_separator/migration.sql @@ -25,7 +25,7 @@ CREATE TABLE "new_Setting" ( "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", "numberOfDockerImagesKeptLocally", "proxyDefaultRedirect", "sentryDSN", "updatedAt" FROM "Setting"; +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"); From 2009dc11dbe2a6fc9d57c7efb3842ded1dd091cf Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Mon, 12 Dec 2022 14:48:56 +0100 Subject: [PATCH 04/72] wip trpc --- .gitignore | 6 +- apps/api/db/dev.db.bak | Bin 0 -> 1085440 bytes apps/api/src/lib/services.ts | 84 +- apps/client/package.json | 5 +- apps/client/src/app.postcss | 280 ++- apps/client/src/lib/common.ts | 20 + .../src/lib/components/DeleteIcon.svelte | 17 + .../src/lib/components/NewResource.svelte | 155 ++ apps/client/src/lib/components/Toast.svelte | 64 + apps/client/src/lib/components/Toasts.svelte | 25 + apps/client/src/lib/components/Tooltip.svelte | 10 + .../src/lib/components/UpdateAvailable.svelte | 206 ++ .../svg/applications/ApplicationIcons.svelte | 47 + .../components/svg/applications/Astro.svelte | 25 + .../svg/applications/Compose.svelte | 9 + .../components/svg/applications/Deno.svelte | 30 + .../components/svg/applications/Docker.svelte | 9 + .../svg/applications/Eleventy.svelte | 13 + .../components/svg/applications/Gatsby.svelte | 13 + .../components/svg/applications/Heroku.svelte | 15 + .../svg/applications/Laravel.svelte | 14 + .../components/svg/applications/Nestjs.svelte | 13 + .../components/svg/applications/Nextjs.svelte | 14 + .../components/svg/applications/Nodejs.svelte | 18 + .../components/svg/applications/Nuxtjs.svelte | 24 + .../components/svg/applications/PHP.svelte | 15 + .../components/svg/applications/Python.svelte | 57 + .../components/svg/applications/React.svelte | 16 + .../components/svg/applications/Rust.svelte | 15 + .../components/svg/applications/Static.svelte | 34 + .../components/svg/applications/Svelte.svelte | 25 + .../components/svg/applications/Vuejs.svelte | 21 + .../lib/components/svg/applications/index.ts | 20 + .../svg/databases/Clickhouse.svelte | 13 + .../components/svg/databases/CouchDB.svelte | 18 + .../svg/databases/DatabaseIcons.svelte | 21 + .../components/svg/databases/EdgeDB.svelte | 22 + .../components/svg/databases/MariaDB.svelte | 17 + .../components/svg/databases/MongoDB.svelte | 90 + .../lib/components/svg/databases/MySQL.svelte | 17 + .../svg/databases/PostgreSQL.svelte | 56 + .../lib/components/svg/databases/Redis.svelte | 34 + .../src/lib/components/svg/databases/index.ts | 11 + .../svg/servers/LocalDockerIcon.svelte | 26 + .../svg/servers/RemoteDockerIcon.svelte | 16 + .../svg/services/ServiceIcons.svelte | 59 + .../components/svg/sources/GithubIcon.svelte | 11 + .../components/svg/sources/GitlabIcon.svelte | 21 + apps/client/src/lib/store.ts | 98 +- apps/client/src/routes/+error.svelte | 5 + apps/client/src/routes/+layout.svelte | 413 ++++- apps/client/src/routes/+layout.ts | 39 + apps/client/src/routes/+page.svelte | 1651 ++++++++++++++++- apps/client/src/routes/+page.ts | 16 + apps/client/src/routes/login/+page.svelte | 123 ++ apps/client/src/routes/register/+page.svelte | 146 ++ apps/client/static/favicon.png | Bin 1571 -> 144391 bytes apps/client/static/icons/appsmith.png | Bin 0 -> 4692 bytes apps/client/static/icons/appwrite.png | Bin 0 -> 14292 bytes apps/client/static/icons/compose.png | Bin 0 -> 212287 bytes apps/client/static/icons/default.png | Bin 0 -> 144391 bytes apps/client/static/icons/fider.png | Bin 0 -> 15154 bytes apps/client/static/icons/ghost.png | Bin 0 -> 40603 bytes apps/client/static/icons/gitea.svg | 1 + apps/client/static/icons/glitchtip.svg | 46 + apps/client/static/icons/grafana.png | Bin 0 -> 78275 bytes apps/client/static/icons/hasura.png | Bin 0 -> 3378 bytes apps/client/static/icons/keycloak.png | Bin 0 -> 10481 bytes apps/client/static/icons/languagetool.svg | 2 + apps/client/static/icons/lavalink.png | Bin 0 -> 28418 bytes apps/client/static/icons/meilisearch.svg | 40 + apps/client/static/icons/minio.png | Bin 0 -> 36803 bytes apps/client/static/icons/moodle.png | Bin 0 -> 9749 bytes apps/client/static/icons/n8n.svg | 1 + apps/client/static/icons/nocodb.png | Bin 0 -> 13262 bytes .../static/icons/plausibleanalytics.png | Bin 0 -> 25964 bytes apps/client/static/icons/pocketbase.svg | 9 + apps/client/static/icons/searxng.svg | 56 + apps/client/static/icons/trilium.png | Bin 0 -> 1292 bytes apps/client/static/icons/umami.svg | 78 + apps/client/static/icons/uptimekuma.svg | 154 ++ apps/client/static/icons/vaultwarden.svg | 30 + apps/client/static/icons/vscodeserver.png | Bin 0 -> 114937 bytes apps/client/static/icons/weblate.svg | 56 + apps/client/static/icons/wordpress.svg | 4 + ...ns-v19-latin-ext_latin_devanagari-500.woff | Bin 0 -> 65760 bytes ...s-v19-latin-ext_latin_devanagari-500.woff2 | Bin 0 -> 48956 bytes ...19-latin-ext_latin_devanagari-regular.woff | Bin 0 -> 66572 bytes ...9-latin-ext_latin_devanagari-regular.woff2 | Bin 0 -> 49652 bytes apps/client/tailwind.config.cjs | 77 +- apps/server/.env-template | 4 +- apps/server/package.json | 14 +- .../20220131142425_init/migration.sql | 443 +++++ .../20220210104005_redis_aol/migration.sql | 28 + .../migration.sql | 11 + .../20220217211304_dualcerts/migration.sql | 47 + .../20220219231255_prmr_secrets/migration.sql | 19 + .../migration.sql | 20 + .../20220301101928_proxyhash/migration.sql | 2 + .../migration.sql | 13 + .../20220311213422_autodeploy/migration.sql | 19 + .../20220320141424_phpmodules/migration.sql | 2 + .../migration.sql | 18 + .../20220327180323_ghost/migration.sql | 19 + .../20220402135305_python/migration.sql | 4 + .../20220402210645_meilisearch/migration.sql | 12 + .../migration.sql | 29 + .../migration.sql | 5 + .../migration.sql | 2 + .../migration.sql | 12 + .../migration.sql | 2 + .../migration.sql | 3 + .../migration.sql | 2 + .../20220425071132_umami/migration.sql | 17 + .../migration.sql | 22 + .../migration.sql | 3 + .../20220427133656_hasura/migration.sql | 16 + .../20220429202516_fider/migration.sql | 25 + .../migration.sql | 29 + .../migration.sql | 23 + .../migration.sql | 2 + .../migration.sql | 24 + .../migration.sql | 32 + .../20220517081328_traefik/migration.sql | 24 + .../migration.sql | 2 + .../migration.sql | 2 + .../migration.sql | 24 + .../20220718083646_moodle/migration.sql | 20 + .../migration.sql | 21 + .../20220721084020_ssh_key/migration.sql | 33 + .../20220722203927_ipaddress/migration.sql | 3 + .../20220725191205_architecture/migration.sql | 2 + .../20220726121333_fix_ssh_key/migration.sql | 16 + .../migration.sql | 2 + .../migration.sql | 2 + .../20220815092230_glitchtip/migration.sql | 30 + .../20220815133844_appwrite/migration.sql | 22 + .../migration.sql | 20 + .../migration.sql | 2 + .../migration.sql | 42 + .../migration.sql | 13 + .../migration.sql | 29 + .../migration.sql | 24 + .../migration.sql | 18 + .../migration.sql | 23 + .../migration.sql | 22 + .../migration.sql | 20 + .../migration.sql | 20 + .../migration.sql | 2 + .../migration.sql | 13 + .../migration.sql | 18 + .../migration.sql | 10 + .../migration.sql | 23 + .../migration.sql | 26 + .../migration.sql | 2 + .../migration.sql | 2 + .../migration.sql | 3 + .../migration.sql | 2 + .../migration.sql | 13 + .../migration.sql | 19 + .../migration.sql | 24 + .../migration.sql | 21 + .../migration.sql | 11 + .../migration.sql | 32 + .../migration.sql | 2 + .../migration.sql | 45 + .../migration.sql | 37 + .../migration.sql | 59 + .../20221128104158_do_not_track/migration.sql | 30 + .../20221128104718_fix_defaults/migration.sql | 60 + .../migration.sql | 2 + .../20221129081832_fix_defaults/migration.sql | 31 + .../migration.sql | 33 + .../migration.sql | 2 + .../migration.sql | 66 + .../migration.sql | 2 + .../migration.sql | 2 + .../20221206140938_init/migration.sql | 21 - apps/server/prisma/schema.prisma | 704 ++++++- apps/server/prisma/seed.js | 113 ++ apps/server/src/api/index.ts | 8 + .../server/src/{config/index.ts => config.ts} | 2 +- apps/server/src/env.js | 10 +- apps/server/src/lib/common.ts | 111 ++ apps/server/src/lib/dayjs.ts | 7 + apps/server/src/lib/docker.ts | 47 + apps/server/src/lib/executeCommand.ts | 188 ++ apps/server/src/lib/logging.ts | 50 + apps/server/src/lib/ssh.ts | 47 + apps/server/src/prisma.ts | 15 +- apps/server/src/router/index.ts | 8 - apps/server/src/router/routers/api.ts | 18 - apps/server/src/router/trpc.ts | 13 - apps/server/src/server.ts | 24 +- apps/server/src/{router => trpc}/context.ts | 15 +- apps/server/src/trpc/index.ts | 21 + apps/server/src/trpc/routers/applications.ts | 525 ++++++ apps/server/src/trpc/routers/auth.ts | 178 ++ apps/server/src/trpc/routers/dashboard.ts | 65 + apps/server/src/trpc/routers/index.ts | 5 + apps/server/src/trpc/routers/services.ts | 118 ++ apps/server/src/trpc/routers/settings.ts | 80 + apps/server/src/trpc/trpc.ts | 33 + apps/server/tags.json | 1 + apps/server/templates.json | 1 + package.json | 2 + pnpm-lock.yaml | 45 +- 207 files changed, 9062 insertions(+), 160 deletions(-) create mode 100644 apps/api/db/dev.db.bak create mode 100644 apps/client/src/lib/common.ts create mode 100644 apps/client/src/lib/components/DeleteIcon.svelte create mode 100644 apps/client/src/lib/components/NewResource.svelte create mode 100644 apps/client/src/lib/components/Toast.svelte create mode 100644 apps/client/src/lib/components/Toasts.svelte create mode 100644 apps/client/src/lib/components/Tooltip.svelte create mode 100644 apps/client/src/lib/components/UpdateAvailable.svelte create mode 100644 apps/client/src/lib/components/svg/applications/ApplicationIcons.svelte create mode 100644 apps/client/src/lib/components/svg/applications/Astro.svelte create mode 100644 apps/client/src/lib/components/svg/applications/Compose.svelte create mode 100644 apps/client/src/lib/components/svg/applications/Deno.svelte create mode 100644 apps/client/src/lib/components/svg/applications/Docker.svelte create mode 100644 apps/client/src/lib/components/svg/applications/Eleventy.svelte create mode 100644 apps/client/src/lib/components/svg/applications/Gatsby.svelte create mode 100644 apps/client/src/lib/components/svg/applications/Heroku.svelte create mode 100644 apps/client/src/lib/components/svg/applications/Laravel.svelte create mode 100644 apps/client/src/lib/components/svg/applications/Nestjs.svelte create mode 100644 apps/client/src/lib/components/svg/applications/Nextjs.svelte create mode 100644 apps/client/src/lib/components/svg/applications/Nodejs.svelte create mode 100644 apps/client/src/lib/components/svg/applications/Nuxtjs.svelte create mode 100644 apps/client/src/lib/components/svg/applications/PHP.svelte create mode 100644 apps/client/src/lib/components/svg/applications/Python.svelte create mode 100644 apps/client/src/lib/components/svg/applications/React.svelte create mode 100644 apps/client/src/lib/components/svg/applications/Rust.svelte create mode 100644 apps/client/src/lib/components/svg/applications/Static.svelte create mode 100644 apps/client/src/lib/components/svg/applications/Svelte.svelte create mode 100644 apps/client/src/lib/components/svg/applications/Vuejs.svelte create mode 100644 apps/client/src/lib/components/svg/applications/index.ts create mode 100644 apps/client/src/lib/components/svg/databases/Clickhouse.svelte create mode 100644 apps/client/src/lib/components/svg/databases/CouchDB.svelte create mode 100644 apps/client/src/lib/components/svg/databases/DatabaseIcons.svelte create mode 100644 apps/client/src/lib/components/svg/databases/EdgeDB.svelte create mode 100644 apps/client/src/lib/components/svg/databases/MariaDB.svelte create mode 100644 apps/client/src/lib/components/svg/databases/MongoDB.svelte create mode 100644 apps/client/src/lib/components/svg/databases/MySQL.svelte create mode 100644 apps/client/src/lib/components/svg/databases/PostgreSQL.svelte create mode 100644 apps/client/src/lib/components/svg/databases/Redis.svelte create mode 100644 apps/client/src/lib/components/svg/databases/index.ts create mode 100644 apps/client/src/lib/components/svg/servers/LocalDockerIcon.svelte create mode 100644 apps/client/src/lib/components/svg/servers/RemoteDockerIcon.svelte create mode 100644 apps/client/src/lib/components/svg/services/ServiceIcons.svelte create mode 100644 apps/client/src/lib/components/svg/sources/GithubIcon.svelte create mode 100644 apps/client/src/lib/components/svg/sources/GitlabIcon.svelte create mode 100644 apps/client/src/routes/+error.svelte create mode 100644 apps/client/src/routes/+layout.ts create mode 100644 apps/client/src/routes/+page.ts create mode 100644 apps/client/src/routes/login/+page.svelte create mode 100644 apps/client/src/routes/register/+page.svelte create mode 100644 apps/client/static/icons/appsmith.png create mode 100644 apps/client/static/icons/appwrite.png create mode 100644 apps/client/static/icons/compose.png create mode 100644 apps/client/static/icons/default.png create mode 100644 apps/client/static/icons/fider.png create mode 100644 apps/client/static/icons/ghost.png create mode 100644 apps/client/static/icons/gitea.svg create mode 100644 apps/client/static/icons/glitchtip.svg create mode 100644 apps/client/static/icons/grafana.png create mode 100644 apps/client/static/icons/hasura.png create mode 100644 apps/client/static/icons/keycloak.png create mode 100644 apps/client/static/icons/languagetool.svg create mode 100644 apps/client/static/icons/lavalink.png create mode 100644 apps/client/static/icons/meilisearch.svg create mode 100644 apps/client/static/icons/minio.png create mode 100644 apps/client/static/icons/moodle.png create mode 100644 apps/client/static/icons/n8n.svg create mode 100644 apps/client/static/icons/nocodb.png create mode 100644 apps/client/static/icons/plausibleanalytics.png create mode 100644 apps/client/static/icons/pocketbase.svg create mode 100644 apps/client/static/icons/searxng.svg create mode 100644 apps/client/static/icons/trilium.png create mode 100644 apps/client/static/icons/umami.svg create mode 100644 apps/client/static/icons/uptimekuma.svg create mode 100644 apps/client/static/icons/vaultwarden.svg create mode 100644 apps/client/static/icons/vscodeserver.png create mode 100644 apps/client/static/icons/weblate.svg create mode 100644 apps/client/static/icons/wordpress.svg create mode 100644 apps/client/static/poppins-v19-latin-ext_latin_devanagari-500.woff create mode 100644 apps/client/static/poppins-v19-latin-ext_latin_devanagari-500.woff2 create mode 100644 apps/client/static/poppins-v19-latin-ext_latin_devanagari-regular.woff create mode 100644 apps/client/static/poppins-v19-latin-ext_latin_devanagari-regular.woff2 create mode 100644 apps/server/prisma/migrations/20220131142425_init/migration.sql create mode 100644 apps/server/prisma/migrations/20220210104005_redis_aol/migration.sql create mode 100644 apps/server/prisma/migrations/20220212142309_unique_secret_by_application/migration.sql create mode 100644 apps/server/prisma/migrations/20220217211304_dualcerts/migration.sql create mode 100644 apps/server/prisma/migrations/20220219231255_prmr_secrets/migration.sql create mode 100644 apps/server/prisma/migrations/20220220141136_public_portrange/migration.sql create mode 100644 apps/server/prisma/migrations/20220301101928_proxyhash/migration.sql create mode 100644 apps/server/prisma/migrations/20220304141408_service_secrets/migration.sql create mode 100644 apps/server/prisma/migrations/20220311213422_autodeploy/migration.sql create mode 100644 apps/server/prisma/migrations/20220320141424_phpmodules/migration.sql create mode 100644 apps/server/prisma/migrations/20220322135800_persistent_storage/migration.sql create mode 100644 apps/server/prisma/migrations/20220327180323_ghost/migration.sql create mode 100644 apps/server/prisma/migrations/20220402135305_python/migration.sql create mode 100644 apps/server/prisma/migrations/20220402210645_meilisearch/migration.sql create mode 100644 apps/server/prisma/migrations/20220405151428_wordpress_sftp/migration.sql create mode 100644 apps/server/prisma/migrations/20220407220809_unique_storage_fix/migration.sql create mode 100644 apps/server/prisma/migrations/20220408070805_added_expose_port/migration.sql create mode 100644 apps/server/prisma/migrations/20220418214843_persistent_storage_services/migration.sql create mode 100644 apps/server/prisma/migrations/20220419203408_multiply_dockerfile_locations/migration.sql create mode 100644 apps/server/prisma/migrations/20220420202031_deno_configurations/migration.sql create mode 100644 apps/server/prisma/migrations/20220420210057_branch_for_builds/migration.sql create mode 100644 apps/server/prisma/migrations/20220425071132_umami/migration.sql create mode 100644 apps/server/prisma/migrations/20220425075326_auto_update_coolify/migration.sql create mode 100644 apps/server/prisma/migrations/20220426125053_select_base_image/migration.sql create mode 100644 apps/server/prisma/migrations/20220427133656_hasura/migration.sql create mode 100644 apps/server/prisma/migrations/20220429202516_fider/migration.sql create mode 100644 apps/server/prisma/migrations/20220429214112_fider_correction/migration.sql create mode 100644 apps/server/prisma/migrations/20220430111953_ssl_dns_check_settings/migration.sql create mode 100644 apps/server/prisma/migrations/20220430124553_expose_port_for_services/migration.sql create mode 100644 apps/server/prisma/migrations/20220509130501_custom_plausible_script/migration.sql create mode 100644 apps/server/prisma/migrations/20220510081125_custom_wordpress_db/migration.sql create mode 100644 apps/server/prisma/migrations/20220517081328_traefik/migration.sql create mode 100644 apps/server/prisma/migrations/20220519095648_minio_apifqdn/migration.sql create mode 100644 apps/server/prisma/migrations/20220708132655_deployment_type_for_applications/migration.sql create mode 100644 apps/server/prisma/migrations/20220712083523_custom_port_git_sources/migration.sql create mode 100644 apps/server/prisma/migrations/20220718083646_moodle/migration.sql create mode 100644 apps/server/prisma/migrations/20220718114551_remote_docker_engine/migration.sql create mode 100644 apps/server/prisma/migrations/20220721084020_ssh_key/migration.sql create mode 100644 apps/server/prisma/migrations/20220722203927_ipaddress/migration.sql create mode 100644 apps/server/prisma/migrations/20220725191205_architecture/migration.sql create mode 100644 apps/server/prisma/migrations/20220726121333_fix_ssh_key/migration.sql create mode 100644 apps/server/prisma/migrations/20220806090621_fqdn_not_unique_anymore/migration.sql create mode 100644 apps/server/prisma/migrations/20220806102340_rde_ssh_local_port/migration.sql create mode 100644 apps/server/prisma/migrations/20220815092230_glitchtip/migration.sql create mode 100644 apps/server/prisma/migrations/20220815133844_appwrite/migration.sql create mode 100644 apps/server/prisma/migrations/20220816133447_bot_deployments/migration.sql create mode 100644 apps/server/prisma/migrations/20220817082342_custom_dns_servers/migration.sql create mode 100644 apps/server/prisma/migrations/20220818093615_public_repositories/migration.sql create mode 100644 apps/server/prisma/migrations/20220823070532_service_searxng/migration.sql create mode 100644 apps/server/prisma/migrations/20220825064811_concurrent_build_settings/migration.sql create mode 100644 apps/server/prisma/migrations/20220825072007_build_queue_improvements/migration.sql create mode 100644 apps/server/prisma/migrations/20220831095714_service_weblate/migration.sql create mode 100644 apps/server/prisma/migrations/20220902115640_service_taiga/migration.sql create mode 100644 apps/server/prisma/migrations/20220905062318_database_branching/migration.sql create mode 100644 apps/server/prisma/migrations/20220905113241_prisma_migration/migration.sql create mode 100644 apps/server/prisma/migrations/20220905115321_application_connected_database/migration.sql create mode 100644 apps/server/prisma/migrations/20220906120112_enable_api_debug_logging/migration.sql create mode 100644 apps/server/prisma/migrations/20220907092244_database_secrets/migration.sql create mode 100644 apps/server/prisma/migrations/20220913092100_preview_applications/migration.sql create mode 100644 apps/server/prisma/migrations/20220922064605_custom_certificates/migration.sql create mode 100644 apps/server/prisma/migrations/20220923122227_custom_ssl_for_applications/migration.sql create mode 100644 apps/server/prisma/migrations/20220928083348_system_wide_git_sources/migration.sql create mode 100644 apps/server/prisma/migrations/20221002084246_no_unique_appid_on_previews/migration.sql create mode 100644 apps/server/prisma/migrations/20221002091630_forked_previews/migration.sql create mode 100644 apps/server/prisma/migrations/20221005120323_initial_docker_compose/migration.sql create mode 100644 apps/server/prisma/migrations/20221005132352_docker_compose_configuration/migration.sql create mode 100644 apps/server/prisma/migrations/20221017134342_standardized_service_configs/migration.sql create mode 100644 apps/server/prisma/migrations/20221018090939_service_peristent_volumes_predefined/migration.sql create mode 100644 apps/server/prisma/migrations/20221021112429_serivce_settings_extended/migration.sql create mode 100644 apps/server/prisma/migrations/20221021185630_service_template_version/migration.sql create mode 100644 apps/server/prisma/migrations/20221026115123_service_persistent_unique/migration.sql create mode 100644 apps/server/prisma/migrations/20221028074301_wordpress_optional_fields/migration.sql create mode 100644 apps/server/prisma/migrations/20221104092223_default_redirect_proxy/migration.sql create mode 100644 apps/server/prisma/migrations/20221114093217_application_storage_path_migration/migration.sql create mode 100644 apps/server/prisma/migrations/20221123122143_remote_haproxy_from_db/migration.sql create mode 100644 apps/server/prisma/migrations/20221123133429_docker_registries/migration.sql create mode 100644 apps/server/prisma/migrations/20221128104158_do_not_track/migration.sql create mode 100644 apps/server/prisma/migrations/20221128104718_fix_defaults/migration.sql create mode 100644 apps/server/prisma/migrations/20221128105615_custom_sentry/migration.sql create mode 100644 apps/server/prisma/migrations/20221129081832_fix_defaults/migration.sql create mode 100644 apps/server/prisma/migrations/20221129121702_preview_separator/migration.sql create mode 100644 apps/server/prisma/migrations/20221129130036_keep_local_docker_images/migration.sql create mode 100644 apps/server/prisma/migrations/20221130142058_reconfigure_docker_registries/migration.sql create mode 100644 apps/server/prisma/migrations/20221201115801_simple_dockerfile_deployment/migration.sql create mode 100644 apps/server/prisma/migrations/20221201133847_push_image_to_docker_registry/migration.sql delete mode 100644 apps/server/prisma/migrations/20221206140938_init/migration.sql create mode 100644 apps/server/prisma/seed.js create mode 100644 apps/server/src/api/index.ts rename apps/server/src/{config/index.ts => config.ts} (65%) create mode 100644 apps/server/src/lib/common.ts create mode 100644 apps/server/src/lib/dayjs.ts create mode 100644 apps/server/src/lib/docker.ts create mode 100644 apps/server/src/lib/executeCommand.ts create mode 100644 apps/server/src/lib/logging.ts create mode 100644 apps/server/src/lib/ssh.ts delete mode 100644 apps/server/src/router/index.ts delete mode 100644 apps/server/src/router/routers/api.ts delete mode 100644 apps/server/src/router/trpc.ts rename apps/server/src/{router => trpc}/context.ts (56%) create mode 100644 apps/server/src/trpc/index.ts create mode 100644 apps/server/src/trpc/routers/applications.ts create mode 100644 apps/server/src/trpc/routers/auth.ts create mode 100644 apps/server/src/trpc/routers/dashboard.ts create mode 100644 apps/server/src/trpc/routers/index.ts create mode 100644 apps/server/src/trpc/routers/services.ts create mode 100644 apps/server/src/trpc/routers/settings.ts create mode 100644 apps/server/src/trpc/trpc.ts create mode 100644 apps/server/tags.json create mode 100644 apps/server/templates.json diff --git a/.gitignore b/.gitignore index 410aba9ee..40773d23f 100644 --- a/.gitignore +++ b/.gitignore @@ -16,4 +16,8 @@ apps/backup/backups/* logs others/certificates backups/* -!backups/.gitkeep \ No newline at end of file +!backups/.gitkeep + +# Trpc +apps/server/db/*.db +apps/server/db/*.db-journal \ No newline at end of file diff --git a/apps/api/db/dev.db.bak b/apps/api/db/dev.db.bak new file mode 100644 index 0000000000000000000000000000000000000000..2a6385b110683c20ff316bfef2b27510e32371fc GIT binary patch literal 1085440 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

  • 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 X=JN=B(SyzW*AFWTKVP5U|39~1AKbQ+ literal 0 HcmV?d00001 diff --git a/apps/api/src/lib/services.ts b/apps/api/src/lib/services.ts index b423cbe9c..19e3094eb 100644 --- a/apps/api/src/lib/services.ts +++ b/apps/api/src/lib/services.ts @@ -1,51 +1,47 @@ -import { isARM, isDev } from "./common"; +import { isARM, isDev } from './common'; import fs from 'fs/promises'; 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 => d.arch !== 'amd64') - } - return jsonData; - } catch (error) { - return [] - } finally { - await open?.close() - } + 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) => d.arch !== 'amd64'); + } + return jsonData; + } catch (error) { + return []; + } finally { + await open?.close(); + } } 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; + 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 [] - - } - - + 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 []; + } } diff --git a/apps/client/package.json b/apps/client/package.json index 0ac71ab15..2f067f30a 100644 --- a/apps/client/package.json +++ b/apps/client/package.json @@ -37,9 +37,12 @@ }, "type": "module", "dependencies": { - "js-cookie": "3.0.1", "@trpc/client": "10.1.0", "@trpc/server": "10.1.0", + "cuid": "2.1.8", + "daisyui": "2.41.0", + "flowbite-svelte": "0.28.0", + "js-cookie": "3.0.1", "server": "workspace:*", "superjson": "1.11.0" } diff --git a/apps/client/src/app.postcss b/apps/client/src/app.postcss index d32a3b615..67ad7e2d9 100644 --- a/apps/client/src/app.postcss +++ b/apps/client/src/app.postcss @@ -3,12 +3,282 @@ @tailwind components; @tailwind utilities; -html { - @apply bg-black text-white; +@font-face { + font-family: 'Poppins'; + font-style: normal; + font-weight: 400; + src: local(''), url('/poppins-v19-latin-ext_latin_devanagari-regular.woff2') format('woff2'), + url('/poppins-v19-latin-ext_latin_devanagari-regular.woff') format('woff'); } -input { - @apply bg-black border; +@font-face { + font-family: 'Poppins'; + font-style: normal; + font-weight: 500; + src: local(''), url('/poppins-v19-latin-ext_latin_devanagari-500.woff2') format('woff2'), + url('/poppins-v19-latin-ext_latin_devanagari-500.woff') format('woff'); } + button { - @apply border px-2 p-1 bg-green-500; + @apply text-sm !important; +} +html { + @apply h-full min-h-full overflow-y-scroll; +} +body { + @apply min-h-screen overflow-x-hidden bg-coolblack text-sm text-white scrollbar-w-1 scrollbar-thumb-coollabs scrollbar-track-coolgray-200; +} + +input, +.input { + @apply h-12 w-96 rounded border border-transparent bg-coolgray-200 p-2 text-xs tracking-tight text-white placeholder-stone-600 outline-none transition duration-150 hover:bg-coolgray-500 focus:bg-coolgray-500 disabled:border disabled:border-dashed disabled:border-coolgray-200 disabled:bg-transparent disabled:bg-coolblack md:text-sm; +} +textarea { + @apply min-w-[14rem] rounded border border-transparent bg-coolgray-200 p-2 text-xs tracking-tight text-white placeholder-stone-600 outline-none transition duration-150 hover:bg-coolgray-500 focus:bg-coolgray-500 disabled:border disabled:border-dashed disabled:border-coolgray-200 disabled:bg-transparent md:text-sm; +} + +#svelte .custom-select-wrapper .selectContainer.disabled input { + @apply placeholder:text-stone-600; +} + +#svelte .custom-select-wrapper .selectContainer input { + @apply text-white; +} + +#svelte .custom-select-wrapper .selectContainer { + @apply h-12 rounded bg-coolgray-200 p-2 px-0 text-xs tracking-tight outline-none transition duration-150 hover:bg-coolgray-500 focus:bg-coolgray-500 md:text-sm; +} + +#svelte .listContainer { + @apply bg-coolgray-400 text-white scrollbar-w-2 scrollbar-thumb-green-500 scrollbar-track-coolgray-200; +} +#svelte .selectedItem { + @apply pl-2; +} + +#svelte .item.hover { + @apply bg-coollabs text-white !important; +} +#svelte .item.active { + @apply bg-coolgray-100 text-white; +} + +select { + @apply h-12 w-96 rounded bg-coolgray-200 p-2 text-xs font-bold tracking-tight text-white placeholder-stone-600 outline-none transition duration-150 hover:bg-coolgray-500 focus:bg-coolgray-500 disabled:text-stone-600 md:text-sm; +} +.custom-select-wrapper { + --background: rgb(32 32 32); + --inputColor: white; + --multiItemPadding: 0; + --multiSelectPadding: 0 0.5rem 0 0.5rem; + --border: none; + --placeholderColor: rgb(87 83 78); + --listBackground: rgb(32 32 32); + --itemColor: white; + --itemHoverBG: rgb(107 22 237); + --multiItemBG: rgb(32 32 32); + --multiClearHoverBG: transparent; + --multiClearHoverFill: rgb(239 68 68); + --multiItemActiveBG: transparent; + --multiClearBG: transparent; + --clearSelectFocusColor: white; + --clearSelectHoverColor: rgb(239 68 68); + --multiItemBorderRadius: 0.25rem; + --listShadow: none; +} + +label { + @apply inline-block; +} +.btn { + @apply text-white text-base min-w-fit no-animation; +} + +a { + @apply underline hover:text-white; +} + +.content { + @apply p-2 px-4; +} + +.title { + @apply text-lg lg:text-2xl font-bold; +} +.subtitle { + @apply text-lg lg:text-xl font-bold text-indigo-300; +} +.label { + @apply text-sm leading-6 font-semibold text-sky-500 dark:text-sky-400; +} +.card { + @apply border bg-coolgray-100 border-coolgray-200 rounded p-2 space-y-2 sticky top-4 mb-2 items-center; +} +.icon-holder { + overflow: hidden; + height: 30px; + border-radius: 5px; + margin-right: 8px; + background: linear-gradient(0deg, #999, #ddd); +} +.instance-status-running { + box-shadow: 1px 4px 5px #3df721; +} +.instance-status-stopped { + box-shadow: 1px 4px 5px rgb(110, 191, 225); +} +.instance-status-error { + box-shadow: 1px 4px 5px #fb00ff; +} +.instance-status-degraded { + box-shadow: 1px 4px 5px #f7b121; +} +.badge-status-healthy, +.badge-status-running { + @apply text-green-500; +} +.badge-status-degraded { + @apply text-green-500; +} +.badge-status-stopped { + @apply text-sky-500; +} +.delete-button { + @apply bg-red-600; +} +.delete-button:hover { + @apply bg-red-500; +} +/* Interchange menu position */ +.menu-left { + display: flex; + flex-direction: row; +} +.menu-left .menu-bar { + display: flex; + flex-direction: column; +} +.menu-left .menu-bar > * { + display: flex; + flex-direction: column; +} +.menu-top { + display: flex; + flex-direction: column; +} +.menu-top .menu-bar { + display: flex; + flex-direction: row; +} +.menu-top .menu-bar > * { + display: flex; + flex-direction: row; +} + +.nav-main { + @apply fixed top-0 left-0 min-h-screen w-16 min-w-[4rem] overflow-hidden border-r border-stone-800 bg-coolgray-200 scrollbar-w-1 scrollbar-thumb-coollabs scrollbar-track-coolgray-200 xl:overflow-visible; +} + +.nav-side { + @apply absolute right-0 top-0 z-50 m-5 flex flex-wrap items-center justify-end space-x-2 bg-coolblack/40 text-white; +} + +.add-icon { + @apply rounded p-1 transition duration-200; +} + +.icons { + @apply rounded p-2 transition duration-200 hover:bg-coolgray-500 disabled:bg-coolblack disabled:text-coolgray-500 !important; +} + +.arrow-right-applications { + @apply -ml-6 px-2 font-bold text-green-500; +} + +.border-gradient { + border-bottom: 2px solid transparent; + -o-border-image: linear-gradient( + 0.25turn, + rgba(255, 249, 34), + rgba(255, 0, 128), + rgba(56, 2, 155, 0) + ); + border-image: linear-gradient( + 0.25turn, + rgba(255, 249, 34), + rgba(255, 0, 128), + rgba(56, 2, 155, 0) + ); + border-image-slice: 1; +} +.border-gradient-full { + border: 4px solid transparent; + -o-border-image: linear-gradient( + 0.25turn, + rgba(255, 249, 34), + rgba(255, 0, 128), + rgba(56, 2, 155, 0) + ); + border-image: linear-gradient( + 0.25turn, + rgba(255, 249, 34), + rgba(255, 0, 128), + rgba(56, 2, 155, 0) + ); + border-image-slice: 1; +} + +.box-selection { + @apply min-w-[16rem] justify-center rounded border-transparent bg-coolgray-200 p-6 hover:border-transparent hover:bg-coolgray-400; +} + +.lds-heart { + animation: lds-heart 1.2s infinite cubic-bezier(0.215, 0.61, 0.355, 1); +} +@keyframes lds-heart { + 0% { + transform: scale(1); + } + 5% { + transform: scale(1.2); + } + 39% { + transform: scale(0.85); + } + 45% { + transform: scale(1); + } + 60% { + transform: scale(0.95); + } + 100% { + transform: scale(0.9); + } +} + +.sub-menu { + @apply w-48 text-base font-bold hover:bg-coolgray-500 rounded p-2 hover:text-white text-stone-200 cursor-pointer; +} + +.sub-menu-active { + @apply bg-coolgray-500 text-white; +} + +.table tbody td, +.table tbody th, +.table thead th { + background-color: transparent; +} +.table * { + border: none; +} + +.header { + @apply flex flex-row z-10 w-full py-5 px-5; +} +.burger { + @apply block m-[2px] h-[3px] w-5 rounded; +} + +.bg-coollabs-gradient { + @apply bg-gradient-to-r from-purple-500 via-pink-500 to-red-500; } diff --git a/apps/client/src/lib/common.ts b/apps/client/src/lib/common.ts new file mode 100644 index 000000000..ab3b55370 --- /dev/null +++ b/apps/client/src/lib/common.ts @@ -0,0 +1,20 @@ +import { addToast } from './store'; + +export const asyncSleep = (delay: number) => new Promise((resolve) => setTimeout(resolve, delay)); + +export function errorNotification(error: any | { message: string }): void { + if (error instanceof Error) { + addToast({ + message: error.message, + type: 'error' + }); + } else { + addToast({ + message: error, + type: 'error' + }); + } +} +export function getRndInteger(min: number, max: number) { + return Math.floor(Math.random() * (max - min + 1)) + min; +} diff --git a/apps/client/src/lib/components/DeleteIcon.svelte b/apps/client/src/lib/components/DeleteIcon.svelte new file mode 100644 index 000000000..f04b3952c --- /dev/null +++ b/apps/client/src/lib/components/DeleteIcon.svelte @@ -0,0 +1,17 @@ + + + + + + + + diff --git a/apps/client/src/lib/components/NewResource.svelte b/apps/client/src/lib/components/NewResource.svelte new file mode 100644 index 000000000..b540f3d12 --- /dev/null +++ b/apps/client/src/lib/components/NewResource.svelte @@ -0,0 +1,155 @@ + + + + diff --git a/apps/client/src/lib/components/Toast.svelte b/apps/client/src/lib/components/Toast.svelte new file mode 100644 index 000000000..bb34929cd --- /dev/null +++ b/apps/client/src/lib/components/Toast.svelte @@ -0,0 +1,64 @@ + + + +
    dispatch('click')} + on:mouseover={() => dispatch('pause')} + on:focus={() => dispatch('pause')} + on:mouseout={() => dispatch('resume')} + on:blur={() => dispatch('resume')} + class={` flex flex-row justify-center alert shadow-lg text-white hover:scale-105 transition-all duration-100 cursor-pointer rounded ${success()}`} + class:alert-error={type === 'error'} + class:alert-info={type === 'info'} +> + {#if type === 'success'} + + {:else if type === 'error'} + + {:else if type === 'info'} + + {/if} + +
    diff --git a/apps/client/src/lib/components/Toasts.svelte b/apps/client/src/lib/components/Toasts.svelte new file mode 100644 index 000000000..929189bcb --- /dev/null +++ b/apps/client/src/lib/components/Toasts.svelte @@ -0,0 +1,25 @@ + + +{#if $toasts.length > 0} +
    + +
    +{/if} + + diff --git a/apps/client/src/lib/components/Tooltip.svelte b/apps/client/src/lib/components/Tooltip.svelte new file mode 100644 index 000000000..e0591a9d4 --- /dev/null +++ b/apps/client/src/lib/components/Tooltip.svelte @@ -0,0 +1,10 @@ + + + diff --git a/apps/client/src/lib/components/UpdateAvailable.svelte b/apps/client/src/lib/components/UpdateAvailable.svelte new file mode 100644 index 000000000..bda1f02cc --- /dev/null +++ b/apps/client/src/lib/components/UpdateAvailable.svelte @@ -0,0 +1,206 @@ + + +
    + {#if $appSession.teamId === '0'} + {#if $isUpdateAvailable} + + New Version Available! + {/if} + {/if} +
    diff --git a/apps/client/src/lib/components/svg/applications/ApplicationIcons.svelte b/apps/client/src/lib/components/svg/applications/ApplicationIcons.svelte new file mode 100644 index 000000000..387653c87 --- /dev/null +++ b/apps/client/src/lib/components/svg/applications/ApplicationIcons.svelte @@ -0,0 +1,47 @@ + + +{#if application.buildPack?.toLowerCase() === 'rust'} + +{:else if application.buildPack?.toLowerCase() === 'node'} + +{:else if application.buildPack?.toLowerCase() === 'react'} + +{:else if application.buildPack?.toLowerCase() === 'svelte'} + +{:else if application.buildPack?.toLowerCase() === 'vuejs'} + +{:else if application.buildPack?.toLowerCase() === 'php'} + +{:else if application.buildPack?.toLowerCase() === 'python'} + +{:else if application.buildPack?.toLowerCase() === 'static'} + +{:else if application.buildPack?.toLowerCase() === 'nestjs'} + +{:else if application.buildPack?.toLowerCase() === 'nuxtjs'} + +{:else if application.buildPack?.toLowerCase() === 'nextjs'} + +{:else if application.buildPack?.toLowerCase() === 'gatsby'} + +{:else if application.buildPack?.toLowerCase() === 'docker'} + +{:else if application.buildPack?.toLowerCase() === 'astro'} + +{:else if application.buildPack?.toLowerCase() === 'eleventy'} + +{:else if application.buildPack?.toLowerCase() === 'deno'} + +{:else if application.buildPack?.toLowerCase() === 'laravel'} + +{:else if application.buildPack?.toLowerCase() === 'heroku'} + +{:else if application.buildPack?.toLowerCase() === 'compose'} + +{:else if application.simpleDockerfile} + +{/if} diff --git a/apps/client/src/lib/components/svg/applications/Astro.svelte b/apps/client/src/lib/components/svg/applications/Astro.svelte new file mode 100644 index 000000000..2344372ab --- /dev/null +++ b/apps/client/src/lib/components/svg/applications/Astro.svelte @@ -0,0 +1,25 @@ + + + + + + diff --git a/apps/client/src/lib/components/svg/applications/Compose.svelte b/apps/client/src/lib/components/svg/applications/Compose.svelte new file mode 100644 index 000000000..f0482e776 --- /dev/null +++ b/apps/client/src/lib/components/svg/applications/Compose.svelte @@ -0,0 +1,9 @@ + + +docker compose logo diff --git a/apps/client/src/lib/components/svg/applications/Deno.svelte b/apps/client/src/lib/components/svg/applications/Deno.svelte new file mode 100644 index 000000000..25eee8132 --- /dev/null +++ b/apps/client/src/lib/components/svg/applications/Deno.svelte @@ -0,0 +1,30 @@ + + + diff --git a/apps/client/src/lib/components/svg/applications/Docker.svelte b/apps/client/src/lib/components/svg/applications/Docker.svelte new file mode 100644 index 000000000..74ba0ebf0 --- /dev/null +++ b/apps/client/src/lib/components/svg/applications/Docker.svelte @@ -0,0 +1,9 @@ + + + + + + + diff --git a/apps/client/src/lib/components/svg/applications/Eleventy.svelte b/apps/client/src/lib/components/svg/applications/Eleventy.svelte new file mode 100644 index 000000000..b2d8d6122 --- /dev/null +++ b/apps/client/src/lib/components/svg/applications/Eleventy.svelte @@ -0,0 +1,13 @@ + + + + + diff --git a/apps/client/src/lib/components/svg/applications/Gatsby.svelte b/apps/client/src/lib/components/svg/applications/Gatsby.svelte new file mode 100644 index 000000000..d67a63417 --- /dev/null +++ b/apps/client/src/lib/components/svg/applications/Gatsby.svelte @@ -0,0 +1,13 @@ + + + + + diff --git a/apps/client/src/lib/components/svg/applications/Heroku.svelte b/apps/client/src/lib/components/svg/applications/Heroku.svelte new file mode 100644 index 000000000..dff845bc2 --- /dev/null +++ b/apps/client/src/lib/components/svg/applications/Heroku.svelte @@ -0,0 +1,15 @@ + + + + + diff --git a/apps/client/src/lib/components/svg/applications/Laravel.svelte b/apps/client/src/lib/components/svg/applications/Laravel.svelte new file mode 100644 index 000000000..d13694a8c --- /dev/null +++ b/apps/client/src/lib/components/svg/applications/Laravel.svelte @@ -0,0 +1,14 @@ + + +Logomark diff --git a/apps/client/src/lib/components/svg/applications/Nestjs.svelte b/apps/client/src/lib/components/svg/applications/Nestjs.svelte new file mode 100644 index 000000000..ac0f8af3f --- /dev/null +++ b/apps/client/src/lib/components/svg/applications/Nestjs.svelte @@ -0,0 +1,13 @@ + + + + + diff --git a/apps/client/src/lib/components/svg/applications/Nextjs.svelte b/apps/client/src/lib/components/svg/applications/Nextjs.svelte new file mode 100644 index 000000000..9ed0227d1 --- /dev/null +++ b/apps/client/src/lib/components/svg/applications/Nextjs.svelte @@ -0,0 +1,14 @@ + + + + + diff --git a/apps/client/src/lib/components/svg/applications/Nodejs.svelte b/apps/client/src/lib/components/svg/applications/Nodejs.svelte new file mode 100644 index 000000000..93140f08f --- /dev/null +++ b/apps/client/src/lib/components/svg/applications/Nodejs.svelte @@ -0,0 +1,18 @@ + + + diff --git a/apps/client/src/lib/components/svg/applications/Nuxtjs.svelte b/apps/client/src/lib/components/svg/applications/Nuxtjs.svelte new file mode 100644 index 000000000..cb2a66ff4 --- /dev/null +++ b/apps/client/src/lib/components/svg/applications/Nuxtjs.svelte @@ -0,0 +1,24 @@ + + + + + + + + + diff --git a/apps/client/src/lib/components/svg/applications/PHP.svelte b/apps/client/src/lib/components/svg/applications/PHP.svelte new file mode 100644 index 000000000..d52ab0dd5 --- /dev/null +++ b/apps/client/src/lib/components/svg/applications/PHP.svelte @@ -0,0 +1,15 @@ + + + + + diff --git a/apps/client/src/lib/components/svg/applications/Python.svelte b/apps/client/src/lib/components/svg/applications/Python.svelte new file mode 100644 index 000000000..17abb0f6d --- /dev/null +++ b/apps/client/src/lib/components/svg/applications/Python.svelte @@ -0,0 +1,57 @@ + + + + + diff --git a/apps/client/src/lib/components/svg/applications/React.svelte b/apps/client/src/lib/components/svg/applications/React.svelte new file mode 100644 index 000000000..c0867ffc8 --- /dev/null +++ b/apps/client/src/lib/components/svg/applications/React.svelte @@ -0,0 +1,16 @@ + + + + + diff --git a/apps/client/src/lib/components/svg/applications/Rust.svelte b/apps/client/src/lib/components/svg/applications/Rust.svelte new file mode 100644 index 000000000..97bcee903 --- /dev/null +++ b/apps/client/src/lib/components/svg/applications/Rust.svelte @@ -0,0 +1,15 @@ + + + + + diff --git a/apps/client/src/lib/components/svg/applications/Static.svelte b/apps/client/src/lib/components/svg/applications/Static.svelte new file mode 100644 index 000000000..14cbb0ce8 --- /dev/null +++ b/apps/client/src/lib/components/svg/applications/Static.svelte @@ -0,0 +1,34 @@ + + + diff --git a/apps/client/src/lib/components/svg/applications/Svelte.svelte b/apps/client/src/lib/components/svg/applications/Svelte.svelte new file mode 100644 index 000000000..cfa96c59d --- /dev/null +++ b/apps/client/src/lib/components/svg/applications/Svelte.svelte @@ -0,0 +1,25 @@ + + + + + + diff --git a/apps/client/src/lib/components/svg/applications/Vuejs.svelte b/apps/client/src/lib/components/svg/applications/Vuejs.svelte new file mode 100644 index 000000000..5ead6229d --- /dev/null +++ b/apps/client/src/lib/components/svg/applications/Vuejs.svelte @@ -0,0 +1,21 @@ + + + + + diff --git a/apps/client/src/lib/components/svg/applications/index.ts b/apps/client/src/lib/components/svg/applications/index.ts new file mode 100644 index 000000000..7bbe7b55b --- /dev/null +++ b/apps/client/src/lib/components/svg/applications/index.ts @@ -0,0 +1,20 @@ +//@ts-nocheck +export { default as Rust } from './Rust.svelte'; +export { default as Nodejs } from './Nodejs.svelte'; +export { default as React } from './React.svelte'; +export { default as Svelte } from './Svelte.svelte'; +export { default as Vuejs } from './Vuejs.svelte'; +export { default as Php } from './PHP.svelte'; +export { default as Python } from './Python.svelte'; +export { default as Static } from './Static.svelte'; +export { default as Nestjs } from './Nestjs.svelte'; +export { default as Nuxtjs } from './Nuxtjs.svelte'; +export { default as Nextjs } from './Nextjs.svelte'; +export { default as Gatsby } from './Gatsby.svelte'; +export { default as Docker } from './Docker.svelte'; +export { default as Astro } from './Astro.svelte'; +export { default as Eleventy } from './Eleventy.svelte'; +export { default as Deno } from './Deno.svelte'; +export { default as Laravel } from './Laravel.svelte'; +export { default as Heroku } from './Heroku.svelte'; +export { default as Compose } from './Compose.svelte'; diff --git a/apps/client/src/lib/components/svg/databases/Clickhouse.svelte b/apps/client/src/lib/components/svg/databases/Clickhouse.svelte new file mode 100644 index 000000000..dd237a48c --- /dev/null +++ b/apps/client/src/lib/components/svg/databases/Clickhouse.svelte @@ -0,0 +1,13 @@ + + + diff --git a/apps/client/src/lib/components/svg/databases/CouchDB.svelte b/apps/client/src/lib/components/svg/databases/CouchDB.svelte new file mode 100644 index 000000000..411c4928d --- /dev/null +++ b/apps/client/src/lib/components/svg/databases/CouchDB.svelte @@ -0,0 +1,18 @@ + + + diff --git a/apps/client/src/lib/components/svg/databases/DatabaseIcons.svelte b/apps/client/src/lib/components/svg/databases/DatabaseIcons.svelte new file mode 100644 index 000000000..4a00860af --- /dev/null +++ b/apps/client/src/lib/components/svg/databases/DatabaseIcons.svelte @@ -0,0 +1,21 @@ + + +{#if type === 'mysql'} + +{:else if type === 'postgresql'} + +{:else if type === 'mongodb'} + +{:else if type === 'mariadb'} + +{:else if type === 'redis'} + +{:else if type === 'couchdb'} + +{:else if type === 'edgedb'} + +{/if} diff --git a/apps/client/src/lib/components/svg/databases/EdgeDB.svelte b/apps/client/src/lib/components/svg/databases/EdgeDB.svelte new file mode 100644 index 000000000..57fdebed5 --- /dev/null +++ b/apps/client/src/lib/components/svg/databases/EdgeDB.svelte @@ -0,0 +1,22 @@ + + + diff --git a/apps/client/src/lib/components/svg/databases/MariaDB.svelte b/apps/client/src/lib/components/svg/databases/MariaDB.svelte new file mode 100644 index 000000000..5bf504bcc --- /dev/null +++ b/apps/client/src/lib/components/svg/databases/MariaDB.svelte @@ -0,0 +1,17 @@ + + + + + diff --git a/apps/client/src/lib/components/svg/databases/MongoDB.svelte b/apps/client/src/lib/components/svg/databases/MongoDB.svelte new file mode 100644 index 000000000..fbb261aa2 --- /dev/null +++ b/apps/client/src/lib/components/svg/databases/MongoDB.svelte @@ -0,0 +1,90 @@ + + + + + diff --git a/apps/client/src/lib/components/svg/databases/MySQL.svelte b/apps/client/src/lib/components/svg/databases/MySQL.svelte new file mode 100644 index 000000000..095093214 --- /dev/null +++ b/apps/client/src/lib/components/svg/databases/MySQL.svelte @@ -0,0 +1,17 @@ + + + diff --git a/apps/client/src/lib/components/svg/databases/PostgreSQL.svelte b/apps/client/src/lib/components/svg/databases/PostgreSQL.svelte new file mode 100644 index 000000000..3021508a6 --- /dev/null +++ b/apps/client/src/lib/components/svg/databases/PostgreSQL.svelte @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + diff --git a/apps/client/src/lib/components/svg/databases/Redis.svelte b/apps/client/src/lib/components/svg/databases/Redis.svelte new file mode 100644 index 000000000..24a7dc797 --- /dev/null +++ b/apps/client/src/lib/components/svg/databases/Redis.svelte @@ -0,0 +1,34 @@ + + + diff --git a/apps/client/src/lib/components/svg/databases/index.ts b/apps/client/src/lib/components/svg/databases/index.ts new file mode 100644 index 000000000..e200b5311 --- /dev/null +++ b/apps/client/src/lib/components/svg/databases/index.ts @@ -0,0 +1,11 @@ +//@ts-nocheck +export { default as Clickhouse } from './Clickhouse.svelte'; +export { default as CouchDB } from './CouchDB.svelte'; +export { default as MariaDB } from './MariaDB.svelte'; +export { default as MongoDB } from './MongoDB.svelte'; +export { default as MySQL } from './MySQL.svelte'; +export { default as PostgreSQL } from './PostgreSQL.svelte'; +export { default as Redis } from './Redis.svelte'; +export { default as EdgeDB } from './EdgeDB.svelte'; + + diff --git a/apps/client/src/lib/components/svg/servers/LocalDockerIcon.svelte b/apps/client/src/lib/components/svg/servers/LocalDockerIcon.svelte new file mode 100644 index 000000000..f3ab3be56 --- /dev/null +++ b/apps/client/src/lib/components/svg/servers/LocalDockerIcon.svelte @@ -0,0 +1,26 @@ + + + + + + + + + + + + + diff --git a/apps/client/src/lib/components/svg/servers/RemoteDockerIcon.svelte b/apps/client/src/lib/components/svg/servers/RemoteDockerIcon.svelte new file mode 100644 index 000000000..1d00a6900 --- /dev/null +++ b/apps/client/src/lib/components/svg/servers/RemoteDockerIcon.svelte @@ -0,0 +1,16 @@ + + + + + + + diff --git a/apps/client/src/lib/components/svg/services/ServiceIcons.svelte b/apps/client/src/lib/components/svg/services/ServiceIcons.svelte new file mode 100644 index 000000000..7f146e3fb --- /dev/null +++ b/apps/client/src/lib/components/svg/services/ServiceIcons.svelte @@ -0,0 +1,59 @@ + + +{#if name} + {`Icon +{/if} diff --git a/apps/client/src/lib/components/svg/sources/GithubIcon.svelte b/apps/client/src/lib/components/svg/sources/GithubIcon.svelte new file mode 100644 index 000000000..b56210177 --- /dev/null +++ b/apps/client/src/lib/components/svg/sources/GithubIcon.svelte @@ -0,0 +1,11 @@ + + + diff --git a/apps/client/src/lib/components/svg/sources/GitlabIcon.svelte b/apps/client/src/lib/components/svg/sources/GitlabIcon.svelte new file mode 100644 index 000000000..3e8c8a84c --- /dev/null +++ b/apps/client/src/lib/components/svg/sources/GitlabIcon.svelte @@ -0,0 +1,21 @@ + + + diff --git a/apps/client/src/lib/store.ts b/apps/client/src/lib/store.ts index c58c5921a..0022e6c93 100644 --- a/apps/client/src/lib/store.ts +++ b/apps/client/src/lib/store.ts @@ -1,11 +1,12 @@ import { writable, readable, type Writable, type Readable } from 'svelte/store'; import superjson from 'superjson'; -import type { AppRouter } from 'server/src/router'; +import type { AppRouter, PrismaPermission } from 'server/src/trpc'; import { createTRPCProxyClient, httpBatchLink } from '@trpc/client'; import { browser, dev } from '$app/environment'; import Cookies from 'js-cookie'; -const serverBaseUrl = dev ? `http://${browser && window.location.hostname}:2022` : ''; +import cuid from 'cuid'; +export const serverBaseUrl = dev ? `http://${browser && window.location.hostname}:2022` : ''; export let token: string = Cookies.get('token') || ''; export const t = createTRPCProxyClient({ transformer: superjson, @@ -20,3 +21,96 @@ export const t = createTRPCProxyClient({ }) ] }); + +interface AppSession { + isRegistrationEnabled: boolean; + token?: string; + ipv4: string | null; + ipv6: string | null; + version: string | null; + userId: string | null; + teamId: string | null; + permission: string; + isAdmin: boolean; + whiteLabeled: boolean; + whiteLabeledDetails: { + icon: string | null; + }; + tokens: { + github: string | null; + gitlab: string | null; + }; + pendingInvitations: Array; +} + +export const appSession: Writable = writable({ + isRegistrationEnabled: false, + ipv4: null, + ipv6: null, + version: null, + userId: null, + teamId: null, + permission: 'read', + isAdmin: false, + whiteLabeled: false, + whiteLabeledDetails: { + icon: null + }, + tokens: { + github: null, + gitlab: null + }, + pendingInvitations: [] +}); + +interface AddToast { + type?: 'info' | 'success' | 'error'; + message: string; + timeout?: number | undefined; +} +export const toasts: any = writable([]); + +export const dismissToast = (id: string) => { + toasts.update((all: any) => all.filter((t: any) => t.id !== id)); +}; +export const pauseToast = (id: string) => { + toasts.update((all: any) => { + const index = all.findIndex((t: any) => t.id === id); + if (index > -1) clearTimeout(all[index].timeoutInterval); + return all; + }); +}; +export const resumeToast = (id: string) => { + toasts.update((all: any) => { + const index = all.findIndex((t: any) => t.id === id); + if (index > -1) { + all[index].timeoutInterval = setTimeout(() => { + dismissToast(id); + }, all[index].timeout); + } + return all; + }); +}; + +export const addToast = (toast: AddToast) => { + const id = cuid(); + const defaults = { + id, + type: 'info', + timeout: 2000 + }; + let t: any = { ...defaults, ...toast }; + if (t.timeout) t.timeoutInterval = setTimeout(() => dismissToast(id), t.timeout); + toasts.update((all: any) => [t, ...all]); +}; + +export const features = readable({ + beta: browser && window.localStorage.getItem('beta') === 'true', + latestVersion: browser && window.localStorage.getItem('latestVersion') +}); + +export const updateLoading: Writable = writable(false); +export const isUpdateAvailable: Writable = writable(false); +export const latestVersion: Writable = writable('latest'); +export const loginEmail: Writable = writable(); +export const search: any = writable(''); diff --git a/apps/client/src/routes/+error.svelte b/apps/client/src/routes/+error.svelte new file mode 100644 index 000000000..e77b92cd8 --- /dev/null +++ b/apps/client/src/routes/+error.svelte @@ -0,0 +1,5 @@ + + +

    {$page.error.message}

    diff --git a/apps/client/src/routes/+layout.svelte b/apps/client/src/routes/+layout.svelte index 64e89a8d2..0664797ca 100644 --- a/apps/client/src/routes/+layout.svelte +++ b/apps/client/src/routes/+layout.svelte @@ -1,7 +1,416 @@ -
    - + + {#if !$appSession.whiteLabeled} + Coolify + + {:else if $appSession.whiteLabeledDetails.icon} + Coolify + + {/if} + + +
    + +
    + {#if $appSession.userId} + IAM + Settings + Documentation + Logout + + {#if $appSession.whiteLabeled} + Powered by Coolify + {/if} + {/if} + +
    +
    + +
    +
    +
    +
    diff --git a/apps/client/src/routes/+layout.ts b/apps/client/src/routes/+layout.ts new file mode 100644 index 000000000..127c1bc08 --- /dev/null +++ b/apps/client/src/routes/+layout.ts @@ -0,0 +1,39 @@ +import { error } from '@sveltejs/kit'; +import { t } 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); + const baseSettings = await t.settings.getBaseSettings.query(); + try { + if (pathname === '/login' || pathname === '/register') { + return { + ...baseSettings + }; + } + const settings = await t.settings.getInstanceSettings.query(); + if (settings.data.token) { + Cookies.set('token', settings.data.token); + } + return { + ...baseSettings, + ...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/client/src/routes/+page.svelte b/apps/client/src/routes/+page.svelte index 952613f4d..b3e1c2879 100644 --- a/apps/client/src/routes/+page.svelte +++ b/apps/client/src/routes/+page.svelte @@ -1,10 +1,1651 @@ -
    hello
    + +
    + {#if applications.length !== 0 || destinations.length !== 0 || databases.length !== 0 || services.length !== 0 || gitSources.length !== 0 || destinations.length !== 0} +
    + + + + + +
    +
    +
    + +
    doSearch('')} + > + + + + + +
    + + doSearch()} + /> +
    + +
    + {/if} + {#if (filtered.applications.length > 0 && applications.length > 0) || filtered.otherApplications.length > 0} +
    +

    Applications

    + + {#if foundUnconfiguredApplication} + + {/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

    + + {#if foundUnconfiguredService} + + {/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

    + + {#if foundUnconfiguredDatabase} + + {/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 filtered.gitSources.length > 0} + {#each filtered.gitSources as source} + {#key source.id} + + + {/if} + {#if filtered.otherGitSources.length > 0} + {#if filtered.gitSources.length > 0} +
    + {/if} + {/if} + {#if filtered.otherGitSources.length > 0} +
    + {#each filtered.otherGitSources as source} + {#key source.id} + + + {/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.

    + +
    +
    +
    + {/if} +
    +
    diff --git a/apps/client/src/routes/+page.ts b/apps/client/src/routes/+page.ts new file mode 100644 index 000000000..00c21903a --- /dev/null +++ b/apps/client/src/routes/+page.ts @@ -0,0 +1,16 @@ +import { error } from '@sveltejs/kit'; +import { t } 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 }) => { + try { + return await t.dashboard.resources.query(); + } catch (err) { + throw error(500, { + message: 'An unexpected error occurred, please try again later.' + }); + } +}; diff --git a/apps/client/src/routes/login/+page.svelte b/apps/client/src/routes/login/+page.svelte new file mode 100644 index 000000000..9ee7a3054 --- /dev/null +++ b/apps/client/src/routes/login/+page.svelte @@ -0,0 +1,123 @@ + + + + Login + + +
    + +
    +
    + {#if $appSession.whiteLabeledDetails.icon} +
    + Icon for white labeled version of Coolify +
    + {:else} +
    +
    + Coolify icon +
    +
    +
    +

    Coolify

    +
    + {/if} +
    +
    +
    +

    Welcome back

    +
    Please login to continue.
    +
    +
    + + + +
    + + {#if $appSession.isRegistrationEnabled} + + {: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/client/src/routes/register/+page.svelte b/apps/client/src/routes/register/+page.svelte new file mode 100644 index 000000000..2bf9931d8 --- /dev/null +++ b/apps/client/src/routes/register/+page.svelte @@ -0,0 +1,146 @@ + + +
    + +
    +
    + +
    goto('/')}> + + + + + + +
    +
    + {#if $appSession.whiteLabeledDetails.icon} +
    + Icon for white labeled version of Coolify +
    + {:else} +
    +
    + Coolify icon +
    +
    +
    +

    Coolify

    +
    + {/if} +
    +
    +
    +
    +

    Get started

    +
    Enter the required fields to complete the registration.
    +
    +
    + + + + +
    + +
    +
    + {#if userCount === 0} +
    "First user will be admin."
    + {/if} +
    +
    +
    diff --git a/apps/client/static/favicon.png b/apps/client/static/favicon.png index 825b9e65af7c104cfb07089bb28659393b4f2097..2c4482801f8cb97fa73bf0c6912f612452dab62b 100644 GIT binary patch literal 144391 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

    dq&po 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
    r@rHcu{$W6l(~e4EQvYA3CbE6%uA>C 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 FZ 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
  • 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%0Dnbx83%aD$7%|f$xjvxJQHaAwDR2`dKX7Bb=L2; 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℘PkntV>^C@)`81EU=aHs`7oN>3WH_EeOc zz3X9-qP9AkMD6ct?#uZ0?_Sb{2guo7r6;pl_@1N!w9Vv1eTXUe_=!>Vd?UNvWmGbh zjj=G08+^`B+&~{y!jK+R`qsiX^CAs$Ck8;~3PWMAqSPHbYwLa@kL%4pt@2-{c~6}l zhZL4QX~na*6S==%8KY#fSys^{)O$lZ{$*OIT3^Yx$2s?PryI4Ngt13=k*T5XC+j2z z)c4h`?&1%A(Wh1}K8{=xH01RFSbI>O_w3p|E`E!_ zyxHAj=O`C^;JQGeWWJVY<*1Et)Cw9E{(D%EBQ6=+`tqJY+WQ9UNyN&e!f(mdg=eTA z2{~IVGl|-9B<%!xjhdBT_`GM;5&J-@ei>OZ=fJ3dDNscU$x_=az-9!69Whp zUWPLDh@LyYVZrjET7GGGU4NRGZbB@=?FC@lS#i|Dv-!$gvNl-ogMKal&~{c>2oB*E zud7?<4GA~IRxI%viMOCmh_muEnSG`n6^s}e8O2x%LD$C$K6Ev8w{-5D`PWlG@dN8U zv7MiJU8e$g2Y}t7YjZDxKX`tS^@K#UAtlrTYU>r{*$WPH2Vl8{)&0)AA$ zAYE{Ex-A?woUIa8Cj?-6{$X&z$PRfx5LPGGJ9jNytIUB)C0o1+TSea|Q1l1^vbQiN zfKZoK?GTViEilZrO-D2}FP^>fEq1XFL~fkvD|}=a*iHy)b50p_w#t@9PO!-}boc|A zhOn7y00lrzyKqrHA-k+N{_BTpc;Hj0ypvW%YMl&YRt59G9_@-U^#<*gVwPFpvHL!R znY{I@P^rx@Ew8SChkwhySlcrH_C3hoRl}`bz58Wr>kfDVp!Rz6Mhj+*aWfAM4drn4 zooxyH(|lu2{pC}@NP&~c!GqU#czX8z*J7`3J}&AKW<7m^tsPnL_;D}4BUkf5j01Dz z>{zLx)^*1i2IT^T8msEv!7Z|HZO`d$etSI3p)4Im1juLdsCYVdN(@cZGPM4r8Dap`ki*^b@Bm~q9FN#(`Eso|1 zCG9Z@B^=b%yibXaGS-+S7r~+_hpBTaCx1A`AAi-~4F(}(U{>$%TE~aMZ=|OI$QjWN zKsd|eA-SYXkoD$#l>*+v@KpqDNeT&r4K}_BKoZON+xmGSQ?mQ%In@8Y;jjQj%mIiF zSO{Cd{7=&McpCu3HlV@Gc+obGJi6Vt_FfayiU^m2!L%BH#=-8?a85pgmGS#Y`so}2 zQ6nF@=Uexb1`vhCX?_**^-diO7%A0jan=jL50(I#|UST)L1T z0LlUU>)$T+yQ4KajnvvF(`l~MZOfqn_{5xH+Vb`uu%y*ZTf6gE3a?>mZvOS?8Q_9U zT$>cmGy+w~UTIwD4}}H<1+1<5}`2W-O|K&D$|2fohPM4H6OI&E70bbYijIY$_ HINkXl(3Az@-61Jmi|+hA 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 literal 0 HcmV?d00001 diff --git a/apps/client/static/icons/ghost.png b/apps/client/static/icons/ghost.png new file mode 100644 index 0000000000000000000000000000000000000000..f4e300654755c1be032d48b50b31b97773898982 GIT binary patch literal 40603 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�?(ACo^uJ)6nbHKk65tyYOH0FZ+%ZvT+C|vfQ;rZn zN#=hTn4gGajFMWNFa}!5&9z|Ev6JVA(_%8WBLQdRE!Fvgxz1W@DT^y|D?aGTkueNP zp`+aswghvIjq1{HYhh^)k{MayV9MneiIh=vN^isx{<1poWVTRKP9G^ z=UGFjM04-%E4SBM%r??sb%UNyWF|`lBrVw!CR@Ln2P6KgAOGY+H1nCq8)?;(wvDph z4{KZ#q^V_M3u7C-mtA%SWh{r;(ZAPs(X-?HB3l-BvqtHfE|`3>y-F8nSE7<3HrCWA zB=g1jk4~0&)7!Ayx9hv_0E#;mIC|K-M(ZCBwS(dMrdILi7^NrulsxNAWKCbK57rx; z{4V_q5Mbx8Hg^47EYs#CBuiL0b|br^xiN>k=ZM;ZcMC>unYMet=U)AI$U7G!7uUKD zdHHHqWX$lV2vjzgk{WkR@6MJmoQ;fw*-~$}pgF0#!$oGTfWL-t;%A?Jfj!{aj#sY~ z5ADA|4@?l|ov8#MI8W@?4>){$7_!fDkRX4s)_)3=*SiiXg!Qsk|5w?xBX3#yPe1TbzOYa~coqO&BBDycpMHgMsFt7cOu;}J5nds0e;L{Tca^9MT zn1Fl7 zJR|rx=>^UVxv?N$g+r1Ib^+WQCefc4qG=Ey3CguZi70T8*6>kEps63}{BHp0#Md;lR}0Txyfi zV!C_=zc|bi{KC802gps*I>;C>b)dwBn5Xx#N&Zv~V$bcv0+mFg&U||YF(lTxATi6z z{X8R|J^E% z8Xg>FdbOL%xfDLTt9-uoZ2HXydcdw>Tv?v@ljz?|Qwv0`{U z*Gc5YWT1AH`=f5kN?o(gX0uIYE-ggB!OM^?>+4RrKf4ExXcM?OD{XpL7)naq>cfCk z6mRg%a$oDdJfwNGra!*tgW}mmV6GuN3JZp-Vbt-7LH^@cEM&?Y@uQ+zmB!!nc_*6| z0~-wKz z`g@*nZ2DBRhzI68ecZ;#om}tJl9qki2ImE=owA{x&wYQd*YHAvtFcOyKU6|RZSfys ze{E^pb)zXAl3<^i*$23-UU5WjwkTz7(#IlKp<U8a>n#B1%6K(x#DHtszdhtQInC|zJddEHA zo;AY>3r3n73tc`ZRjb#?NE<<^re`;{fcd{=HNS$xF;d5)(Qox7|M^(IzkRCBvas29 zX3H_9@LafztB09;U{YD7d6ehvTORBwzo)MJ*m}5HNb{QyEz3 z#YNV$G4TUIu2vO3OX=+6gHX97(CYE9TF;at=quJ9HUL^T3?FxeKBmmi8e#u#onHzC zJe*Nnad}T!>0^Y7f0{fya#}aK2z<@+J`#wkD-k~!tQ#zdy|1yD@*}=QH+`%A^++c; zhA)`^_3kkTM`I1_+9O-25h8&-p^uY|5kL~B9V#lT&`8L9w+FthZPcM9lhdRJW--WW zF1{f12HkRbJbpcp(wQynh`3`KT#m-T9CH_XN>@YfL2Fmul37;w`Zr1y7Qe4+6 zaX`SG8-cw;06?#By(-9T!DTbr9Lj9@Mj!A;W(2Vt(KfQiwJy+9CdFTJ$zwT->CsyN z>8sk18-b7EVzkWq4dzizymo?Ek2>qh-~oioJW>W&d&5ybI*cbkdV^E{cqVAcZ<5l# zsotX*jl?ys)4d-&2J_oz>a8l;<_x9HesyuTWuNN!%JB2y#>MmNSpMx4{hfHsbLM5d z&~S!Lg>{Bq##gil-Cif{F*W+UX271?d|Ow>DG!`%xM&T{2V3$7lC#@p^WJ*x`6;Y3 zg^jAR7k!+QMIF?qvBCbWSqxTr+ynij9j~K_exePf-WBC2=?REe_g?~@aRX)6JgfN6fiPYyGvm@FL&t=O3o;_&NeGua{+hfB*Wk^NDHn0M(~ln;^jm@t92`fj^rV@Pmr_ z+aSI7Xx6pw%huoGTev5_0*m6@Ju6yO|E;JC{1*%+7{hdCYrsama*N8ID?CZd3QeS| zCGG6~A|vml8aHiyMT*lcxFmokk|F1cM?Q^lPj-6&BPM_^LSo8tP>#wJvE z#p&N?9FZSK!7>=|!6Q-{SGltCpFd({FgoKZ!FSG+onYUJ3@a+;&v-RXZ$ixyxsxw* zK#%iD5*zgy6##zjFB(P|!}yncD}AQH^2Lk3inw>t7AJE|8IYP*Pw&fncg1?T3v0xw zp}yx4RVjtSo5l|!m$AUo_ZbJacRsT1JqCLlp)p-(Fn)eFgIcRn-Zn<>2r&uaIlI7V zBgOeo7NLi<49n^hLUGaUhx_K(HjW~0(Xrl{quZlOZmP8}CZK^ZmAhz$9%k>}b;59Y z@%s>6n?F1_Ydnh8uJig2&e$h0*C4grh)bWO!{H&A z_OoerGo)3YRX>i_pffCg0YOj+zbXey*N>jeewohR+)3NOXc&^D^J5)Bd^4v2BS z$(TIsGj*p}?p$&tWcCX3#`Db@@Vok0AT@OrG$GWvi)o)4x3FzotO?PJ$Mt;99egsy zBr*)g^xEudo{m_;!!(>Kw_Wh2Us9O`b>^BN`!Nq00@5MS%`QWz?wWnO`H6(L&vuaF zUmcFf<%^7o{M$FuBQ4a8OM}gO{x0^cR3H5D%8)*DXqlGf^i4WJ<3l`z#>qmFR3@0< zkxXWi#*1Jh>8*>a-9ChAMCHuCh1I$0niYNU>c=ai6Zz<*7?Yl5^(O(ljTmhr zpOmih8DL`yE^G5Wz%_g#R#D#w#@9)B!!*}(pB{GN7QU*q&Mj&h7ZLb-0UO<>=Q9^T zow|3rfOaCPnoMoK(kN^lYR-TP$+m~!*55pM*w7@(_GEiv$(#y#ay@OyPL2eTh$wSX z92(YswIJ++eEQE8?K4zAs%NR(9$kO_apo@QlhB4I@_nxxMk4KZq41d@->wwDJ*(mL zp)71_fFgw91}x~0tFJ?mqrpsCr!r=W;v(kP*#Q4Ku%udJ_+@GB8f41*qCloRJhmeTtW!)ZdVH#9tDyiYV#iOcZa zpOrs>8!o9uS;?b(cY_ni53Lqm|Lv}&)n8Z+53@`x-e)(W|8_rCd+JU5+kD$QvV7CH zDHvjaKPe>?js5qO9+a1yWud=gzYJ+RqcnB^*i(8Pp6e#YV z;6;nHK=9()A^`#v3)CQxpoL&96uprGMT@lsf;$u|DehW=-sR=_6W;xHKJ7KXxz5hc zoSm~N0;_2ZwLO;@QScL}JqhgWA*^Njx?H%INpST*XJ==2OwmBW|M!eZ?cOI3S->N6 zN7FF}3OxU>_|APd3~f$d5T6)wYFT{sn~k;=`B&We$!#9GF>rUQaY2e*29r?=AO9yJ z_UfnPiSVPRKMvPIW*MCd1RtmHJ60%Br~1t5vE!raMv0@ymX8qml>OM38vneXrD<#E z&bOST*%kNcD!c3bISZlzsi!`h>8!E$X(p4_xv-j346*AB`hWoPnkF5zNP{DB^K9i9 zm#k@e8v&uuJo*6MCmzHlgySNjyts+E`s9|vjWbsx+gj1^VJRhr+V0GdQL5S-`R&*k z5cScVn!TDF8EwoxtOR#VTV$1}byfl*Gab4Or^H{6Sx>u6zI_(j0(_*?nt#jtdv_4m zTX>VaIg)JocInizL6w<#78}5-R!F3;eVaux_|!pRGu1hY+ClH25W#5Il%jbRFoFkS zxw#EN^jt{U^{|=d<(waj!_+s=Izj}N%CzjXcjD%hovYxEK;dpKLGXcsZ*TH5KfY@& zeB8V-p(QqGWoa$9aSZhrtoCXNC(`mPG?Hq2s^EV9q^Y?C7j)*@Tt;NT6>%$mZKCxS?(`Wf9y-@g$_kTqE z7j%5f?<&(4s`$#(jH`miwsJqWRYO1W_|MWkGKv~+#-#P;)uS}8i0r=gv?o)C_04^K zvvYQJ2{-_E`66ZQ%5$(|+HsU64LunoL$v-ilLFIiWzZbhp-fCUa{NAjVeY#wMgO>} zmP|uo)^@7xw?`6diT`YzMvlhFb`U69kQ>6?${I#lFIf(EGW3xXE?-%@)X)%n)IAh~{Yz7B``X-`9pzSE3lH|TuNixRDb88p zd%ftIy|>p^6^%cM`)iwXYNnkq8%`l;BK093NOz#>gx)HqjiBp=_5K45-c3MTHk_e% zWZmiq)LDs}<2KI;^xx1m*5tz$DEKcjya2A3sq3Nqf?R|Q`?`$hUS z2k_E6#eEH%5X?l91?AtvqNm$Z^b*GpT*$suQ(xK~kRFX?|1#@vsBxqcw%gL_z!$!I zn1O2@Vv(%!t-Cit=1*&nfcFi)Vx|R#rEi+KVFSKPS0#I$R}t~}krj34`Rhj=e5dDD z9qFHP!cU`(-qp0J+!;$mqIVtrig%U)O)sWQov+6?ek!!Z;=P(8u3s?_fqTp&NX;Q# z$Xbg1X(KLr8AQ$gCJ)M_=K|;TL&Gko7YRgw^LYB?eCJIMmY7ipP)>p&IGH09#x(7M zV!&8VP_jpbus502>inQ75a8sJzc!V!UTOke2?NB7cn}aZpubDeW{$fo_TWN?WN`Va zB6v*IezBvnS+QnavrLHP4K2Kq@n<9P1-X3>2kTH9WgM2s7ym6gsiC1cN8i5r^zycf zvOP#7l`dz95Y(@FUDoqgHNN&*RzpbbZm-0VQrv>5>k5oa$$N1FMr7^%^jn~-On)WG z59O0~as$_EEPq$7WS8$hX&X2nYZ^+zm&c_y%*Ehu8^Kv!8Bz$$juuD$AEs;^fVF8-8SKlhM5h zWW-$a9@Tp$+~&&Dq^IRxP-?^;e0Y*ub%8S9vAELB z#sg$il<-J=3yEu;@XWh*?(ipKy$P3|Jl6LR)icsw`Wod5KV8_);gP?}Aw7AI82Ml) znc{Txo&K9o>4nr`jO4`v0Fw29?6j~A!5!ZkGS`>IsirhI&67dX6NKX`g#?-)RviY?No4k{w1pJ{$Z(vMBMI{_jTR5cJfDbW{}VBKP#Y4##d@ zEcJ8NIS+1>JzCbFGZD~=f+%LbSXvDyH~@#ZfCGcUl&|?E%k=>NZkvg=Y#k!gSNApE zLgt9JHUCiRzXPFB>`Lx-YYauUB^-X9QLdzn^tOgowcfI(Y};Dhfi$V0&+L~#WNN^I z+*Ny0-z~zm3SWUc|JGoi`0w5`+pl7=#jX1vRiehMGLakEw7GeJj;@4iGlKi~z=sQy zpV@O*T$UO_>iYa$>u1lQfpVc3H{sLILppL&V%vMGE9yV|$SxgLapYnK3}My$fEuLs zqN8g5wirpjwBX}FVZrZs^QdU(SMX5l^Ta;aWK3 zt2ToWveov!y%3gzNS~rU@G3v!Pxw zC4D~eiC42jAPopn;AQT(r9byrdc0JU<|IWo5wfQOa0rumqD#^r(pq3OvCo4)7v>}= zK3jByy9lBDmAGQvD|#cOmR-s*TD>h2!}U|=Q@*5mdL0am{|cWfZX1;W@Q3L94A}d^ z-G@A%ZKdx%H- z0D6jcm!u>fMMpZ^sk&w%Rz~978+oBD_7Z%Rp$ESY#mM4)MNqW)SaM4LNT#l|89yOK z5vPa6x~;FOHvzXA?|l86feuTxE3_T{@kUpYHl@H#MUGOLDKj9-kn)4}ovc&7qS#Gnpb_uc4iC9;lj@7i zt%~S`@ZS`5-S!+y2a+_k0?M!DfW@Sks5(7bZGN&QPR&)L+|+SB zTN;%*`>=U1v?8Ls-g|q4O25TXG}e%*t11cx?Jy|O1gja9L{iw)_SG4Xo=8JG3J&2s z=ge7+6~+P4TDoy#htl1fFg`C^P9jy>^47Q(OwX>UcJzW%iW)&a&yz)v8m}97Y;`x^ z6q%st*~*OcpmWV9^z}Ig4f@ z!#{aGHINH}4uKx^+H&{^b)o^LGYHMcv=pr>EAqGPauhXqDoj z1@VY^p;wBBnKEVoya_P?OO!f$v8UWhNg!twVV_C7k*K{Ummh|Bs!*iWEqxpKg~vDgRJUJZuN@?y(Vxx+2= zc?}t}CNu-(&Q6&a<5I)IalfQwIAkUQ9U)<-nx@C`bM2*R6w>D1n?Ru9x>PEg1P zjB#+ZNqmYE%c&?5kl8r-@a3mm{oz|+j5yVrQD0Qmfwx>YRRJe*t->Ff||m zEIYUd%a_K-yDDD}$6TqAJ-T-I-*j!Uvc2itZ+5^klBV(WMDMN|q|xLPqZ!CgDXdR% z>R(oL`jkAgoxBCB^4jfx=vE~<$Q-;NwfS4N^D*bmFD@b%s`nO2)xyA1<<9SBJ2BV& z^SWr>5clp%u9lU01QJ1IE))Hrn`^Z*QFg#mE1kuadusME$Ay{+#IFN;cb{yD#}cLn zGdY~>9_hBy+W?yymFt-mq~6Sov1QaS19+(xgGj|m#jq8Y&<+AeuN<#Tib!2dR@75% zaJB*4bGhm;iMe$XKxZrsS7j%WaUI12zsGv@OqpO#_7g=YqDX->WGq-k?Y)OeF?7F& z-uOh4^@>s7IFuKvH5sjo;klCYvO7@b=yUs#6reo&>u*D+EkVxyz~$X>0Pfn=%YOtoZkB_r%j_&*-silKM0Bn=o#aag>Epdcc_ewY7IWqhDMd@dUxo zp2B&o=HZ?2dSZwzACssRlySWj2T6fWyvs~A2GK)&MJBg)YsW0%=KJuU?mMkXNT~pk z6hD{J{UdoOY;s@M0h>f*K~$FxFqn4qICht2Wef|a=_=5okho%AE8GqVA@-ye^!lq= zH!N+l0R_4WX}8%zvl`O6Jehi{Sd^WAdQ>R)1Gj=v;^trGb3DphiiXjJBda$`*?__3 z@tWZ|BcgT9g9tjJuyz>(g*&DE06+d0xrQZ5)HYdv_}=`QGhmI9s!Kl3ffX0pOi8I# z(~7)vTG#+{kj}E7XrUimu;@E^(4fo?)78CV&6h5-Z^UITvqQ8_gcV-V(_S+mn)k>Zk9^92({J+%YG$lJ6p^Vyo z*=|C0JB7`5j2KQwO&6ZBI+)*K2>l#xg#oa7_(R)B;eR+SK-Lxv2j;;qOE}&cA-J2c g|F2lE@wz470(LelyTkqNcAf$r>6mC&YdXdKA7Owk3IG5A literal 0 HcmV?d00001 diff --git a/apps/client/static/icons/gitea.svg b/apps/client/static/icons/gitea.svg new file mode 100644 index 000000000..87c7c82db --- /dev/null +++ b/apps/client/static/icons/gitea.svg @@ -0,0 +1 @@ + diff --git a/apps/client/static/icons/glitchtip.svg b/apps/client/static/icons/glitchtip.svg new file mode 100644 index 000000000..2ae389aae --- /dev/null +++ b/apps/client/static/icons/glitchtip.svg @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/apps/client/static/icons/grafana.png b/apps/client/static/icons/grafana.png new file mode 100644 index 0000000000000000000000000000000000000000..c8659494f8776488ff1ee7202d1a75222db8372e GIT binary patch literal 78275 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≥e5~Q)~NIc%k`s(ZE#(*A;3q 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

    y;k)I_-Wd>$frg~P8Xw8NY7UI@iN>#oS`KEK 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 z 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 W{}0Y{8z3khJ`LjNN~zf$ko-T0k{+G_ literal 0 HcmV?d00001 diff --git a/apps/client/static/icons/hasura.png b/apps/client/static/icons/hasura.png new file mode 100644 index 0000000000000000000000000000000000000000..30490401ea79ebd23678ddcce01ee592554e1acc GIT binary patch literal 3378 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 \ No newline at end of file diff --git a/apps/client/static/icons/lavalink.png b/apps/client/static/icons/lavalink.png new file mode 100644 index 0000000000000000000000000000000000000000..114458bf28106dd9a0856a629e61a096c9ac9ef6 GIT binary patch literal 28418 zcmV)lK%c*fP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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 z 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 diff --git a/apps/client/static/icons/minio.png b/apps/client/static/icons/minio.png new file mode 100644 index 0000000000000000000000000000000000000000..d1b32be9ed6ec6712b5542da1344d6946b955c47 GIT binary patch literal 36803 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 b`4ISjy02fxjUgPI00000NkvXXu0mjfYlgFu literal 0 HcmV?d00001 diff --git a/apps/client/static/icons/moodle.png b/apps/client/static/icons/moodle.png new file mode 100644 index 0000000000000000000000000000000000000000..a5cec5be7cab4afda7116412efdbef3603dd5dd2 GIT binary patch literal 9749 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 literal 0 HcmV?d00001 diff --git a/apps/client/static/icons/n8n.svg b/apps/client/static/icons/n8n.svg new file mode 100644 index 000000000..262a6e7a6 --- /dev/null +++ b/apps/client/static/icons/n8n.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/client/static/icons/nocodb.png b/apps/client/static/icons/nocodb.png new file mode 100644 index 0000000000000000000000000000000000000000..dec31a6dd889029be38a8c05cf9441f10b7e9d3a GIT binary patch literal 13262 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 literal 0 HcmV?d00001 diff --git a/apps/client/static/icons/pocketbase.svg b/apps/client/static/icons/pocketbase.svg new file mode 100644 index 000000000..5b5de956b --- /dev/null +++ b/apps/client/static/icons/pocketbase.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/client/static/icons/searxng.svg b/apps/client/static/icons/searxng.svg new file mode 100644 index 000000000..c0dd11b43 --- /dev/null +++ b/apps/client/static/icons/searxng.svg @@ -0,0 +1,56 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/apps/client/static/icons/trilium.png b/apps/client/static/icons/trilium.png new file mode 100644 index 0000000000000000000000000000000000000000..249aceef343049d5d73990698d6213adc601de95 GIT binary patch literal 1292 zcmV+n1@roeP)EX>4Tx04R}tkv&MmKpe$i(@Onlaj=7kLx$>PK~%(1t5Adrp;l;o12rOiLp`5<5%ypW>NMI35kRU=q6(y8mBSx!EiiH&I$2<6kT)#vvg=bb;{@U#SB#pQP7X zTJ#9$-v%zOTbi;5TgF}~)6010qNS#tmY z4c7nw4c7reD4Tcy000McNlirueSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00QJmL_t(o!|j+&Xw*OyfWM7xErklLC`6J&sV7$yREq5$ zR)mTocJU&G;17tW+M^)GgMw>81i_Xb#lJlW?IC#Z;=u^9)T&T5B6twpXe|CzD79*T z^fD`HNH*KG%_8=l^5(sH^Ucf5n@M0<{xL}`^#GY%ax<_8Xac?gj{(Eb?1|WbGP&eB z;2F>u;rbHTX=t{)WI&l*au{e?V7DniH8lHkVv%7cfw~gizXW8kOIk#jI}tD+fMWuL z0GRiNX7`6?$kF9i;2e+!B;X0qqh#H|02m3F4GCofyMfn0RoHljW+w=8aCEsBI3Cbv zD=^^bGC;SIb^AQFT*x@hKo5|QNbsL*N#2Y&y8J5y#xK2&E+6*joj&_lG2;>7Kt!w# zL$k-{0Xe$d13VCIJb12BucimQ$;*95H#D%sh=4UB{X2k%Ks7L7X!aT4T}0pZVlYLI4o8=*5?*DEl69v=9ZCWB zL;OYz%`WLU39Zyh)=dGcfltK>v?ywGz*FBMp8+lcQmHTtI$RxH-Uf7tU3gE)x`X+2 zDj~|nK2dYltEM$uk^4|Sol-;vz7Es_`-Q1mHLaO)<5vB}WD3W@1yK^br}(OJgGyy) zXSDFFnwIS|*XPrz`dER0O%e7>u>s}Nsa++w9f~tUZ9YIbz^6J+pf^7K=we=j%K^IS z(@$3vNHwi#@s&`JmB8gnW(aWw@yd3e{v%c()wCvk5G~>oUy!$PX9(4_h5^;n)Z}@7 z6+4iCa#Yhw0JnUm(TV_hz&Zuk32~zwTK + Created by potrace 1.11, written by Peter Selinger 2001-2013 + + + + diff --git a/apps/client/static/icons/uptimekuma.svg b/apps/client/static/icons/uptimekuma.svg new file mode 100644 index 000000000..e67bc836a --- /dev/null +++ b/apps/client/static/icons/uptimekuma.svg @@ -0,0 +1,154 @@ + diff --git a/apps/client/static/icons/vaultwarden.svg b/apps/client/static/icons/vaultwarden.svg new file mode 100644 index 000000000..15433d8ed --- /dev/null +++ b/apps/client/static/icons/vaultwarden.svg @@ -0,0 +1,30 @@ + + + + + diff --git a/apps/client/static/icons/vscodeserver.png b/apps/client/static/icons/vscodeserver.png new file mode 100644 index 0000000000000000000000000000000000000000..37a084767a4432f1e2d317bedd1057660372d31e GIT binary patch literal 114937 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 diff --git a/apps/client/static/icons/wordpress.svg b/apps/client/static/icons/wordpress.svg new file mode 100644 index 000000000..31149e2ba --- /dev/null +++ b/apps/client/static/icons/wordpress.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/apps/client/static/poppins-v19-latin-ext_latin_devanagari-500.woff b/apps/client/static/poppins-v19-latin-ext_latin_devanagari-500.woff new file mode 100644 index 0000000000000000000000000000000000000000..d5e713b46131dd0659f4e1ad34d366f8d9798778 GIT binary patch literal 65760 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%0A>Zi=)mbn1ep&IlPlZ*4G62$K@C_FRdXA3*Z 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 literal 0 HcmV?d00001 diff --git a/apps/client/static/poppins-v19-latin-ext_latin_devanagari-regular.woff b/apps/client/static/poppins-v19-latin-ext_latin_devanagari-regular.woff new file mode 100644 index 0000000000000000000000000000000000000000..ccce523febc97ab824233ac8e1f0c9e94edb5d9c GIT binary patch literal 66572 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 Zr{dgX1#iSjMJ&SwnhtXP4x*9CWdOx4YNr4I literal 0 HcmV?d00001 diff --git a/apps/client/static/poppins-v19-latin-ext_latin_devanagari-regular.woff2 b/apps/client/static/poppins-v19-latin-ext_latin_devanagari-regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..7457692a2805f573989133708a7caf7790daf247 GIT binary patch literal 49652 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 R`UU>IDIILO2RmAdodm%|(NF*Y literal 0 HcmV?d00001 diff --git a/apps/client/tailwind.config.cjs b/apps/client/tailwind.config.cjs index 0f5280a69..cab4ddbb7 100644 --- a/apps/client/tailwind.config.cjs +++ b/apps/client/tailwind.config.cjs @@ -1,11 +1,76 @@ -const config = { - content: ['./src/**/*.{html,js,svelte,ts}'], +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: {} }, - - plugins: [] + darkMode: 'class', + plugins: [ + require('tailwindcss-scrollbar'), + require('daisyui'), + require('@tailwindcss/typography') + ] }; - -module.exports = config; diff --git a/apps/server/.env-template b/apps/server/.env-template index a45f8578c..d038e068c 100644 --- a/apps/server/.env-template +++ b/apps/server/.env-template @@ -1,2 +1,4 @@ NODE_ENV="development" -DATABASE_URL="file:../db/dev.db" \ No newline at end of file + +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/server/package.json b/apps/server/package.json index 0621bd01b..3ce4e8afa 100644 --- a/apps/server/package.json +++ b/apps/server/package.json @@ -16,7 +16,6 @@ "db:migrate": "DATABASE_URL=file:../db/migration.db prisma migrate dev --skip-seed --name" }, "dependencies": { - "jsonwebtoken": "8.5.1", "@fastify/autoload": "5.6.0", "@fastify/cors": "8.2.0", "@fastify/env": "4.1.0", @@ -27,18 +26,31 @@ "@trpc/client": "10.1.0", "@trpc/server": "10.1.0", "abort-controller": "3.0.0", + "bcryptjs": "2.4.3", + "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-port-reachable": "4.0.0", + "jsonwebtoken": "8.5.1", "node-fetch": "3.3.0", "prisma": "4.6.1", + "shell-quote": "^1.7.4", + "ssh-config": "4.1.6", "superjson": "1.11.0", "tslib": "2.4.1", + "unique-names-generator": "4.7.1", "ws": "8.11.0", "zod": "3.19.1" }, "devDependencies": { + "@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", "npm-run-all": "4.1.5", "rimraf": "3.0.2", diff --git a/apps/server/prisma/migrations/20220131142425_init/migration.sql b/apps/server/prisma/migrations/20220131142425_init/migration.sql new file mode 100644 index 000000000..6607a48b5 --- /dev/null +++ b/apps/server/prisma/migrations/20220131142425_init/migration.sql @@ -0,0 +1,443 @@ +-- 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/server/prisma/migrations/20220210104005_redis_aol/migration.sql b/apps/server/prisma/migrations/20220210104005_redis_aol/migration.sql new file mode 100644 index 000000000..8a7e41098 --- /dev/null +++ b/apps/server/prisma/migrations/20220210104005_redis_aol/migration.sql @@ -0,0 +1,28 @@ +-- 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/server/prisma/migrations/20220212142309_unique_secret_by_application/migration.sql b/apps/server/prisma/migrations/20220212142309_unique_secret_by_application/migration.sql new file mode 100644 index 000000000..da4aa8e7c --- /dev/null +++ b/apps/server/prisma/migrations/20220212142309_unique_secret_by_application/migration.sql @@ -0,0 +1,11 @@ +/* + 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/server/prisma/migrations/20220217211304_dualcerts/migration.sql b/apps/server/prisma/migrations/20220217211304_dualcerts/migration.sql new file mode 100644 index 000000000..a6ea0a57d --- /dev/null +++ b/apps/server/prisma/migrations/20220217211304_dualcerts/migration.sql @@ -0,0 +1,47 @@ +-- 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/server/prisma/migrations/20220219231255_prmr_secrets/migration.sql b/apps/server/prisma/migrations/20220219231255_prmr_secrets/migration.sql new file mode 100644 index 000000000..728fcae36 --- /dev/null +++ b/apps/server/prisma/migrations/20220219231255_prmr_secrets/migration.sql @@ -0,0 +1,19 @@ +-- 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/server/prisma/migrations/20220220141136_public_portrange/migration.sql b/apps/server/prisma/migrations/20220220141136_public_portrange/migration.sql new file mode 100644 index 000000000..6423e9761 --- /dev/null +++ b/apps/server/prisma/migrations/20220220141136_public_portrange/migration.sql @@ -0,0 +1,20 @@ +-- 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/server/prisma/migrations/20220301101928_proxyhash/migration.sql b/apps/server/prisma/migrations/20220301101928_proxyhash/migration.sql new file mode 100644 index 000000000..87845b38b --- /dev/null +++ b/apps/server/prisma/migrations/20220301101928_proxyhash/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "Setting" ADD COLUMN "proxyHash" TEXT; diff --git a/apps/server/prisma/migrations/20220304141408_service_secrets/migration.sql b/apps/server/prisma/migrations/20220304141408_service_secrets/migration.sql new file mode 100644 index 000000000..baa0c3f54 --- /dev/null +++ b/apps/server/prisma/migrations/20220304141408_service_secrets/migration.sql @@ -0,0 +1,13 @@ +-- 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/server/prisma/migrations/20220311213422_autodeploy/migration.sql b/apps/server/prisma/migrations/20220311213422_autodeploy/migration.sql new file mode 100644 index 000000000..d534d9372 --- /dev/null +++ b/apps/server/prisma/migrations/20220311213422_autodeploy/migration.sql @@ -0,0 +1,19 @@ +-- 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/server/prisma/migrations/20220320141424_phpmodules/migration.sql b/apps/server/prisma/migrations/20220320141424_phpmodules/migration.sql new file mode 100644 index 000000000..6a17ff8a3 --- /dev/null +++ b/apps/server/prisma/migrations/20220320141424_phpmodules/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "Application" ADD COLUMN "phpModules" TEXT; diff --git a/apps/server/prisma/migrations/20220322135800_persistent_storage/migration.sql b/apps/server/prisma/migrations/20220322135800_persistent_storage/migration.sql new file mode 100644 index 000000000..d26ae3f8b --- /dev/null +++ b/apps/server/prisma/migrations/20220322135800_persistent_storage/migration.sql @@ -0,0 +1,18 @@ +-- 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/server/prisma/migrations/20220327180323_ghost/migration.sql b/apps/server/prisma/migrations/20220327180323_ghost/migration.sql new file mode 100644 index 000000000..3c1cec36f --- /dev/null +++ b/apps/server/prisma/migrations/20220327180323_ghost/migration.sql @@ -0,0 +1,19 @@ +-- 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/server/prisma/migrations/20220402135305_python/migration.sql b/apps/server/prisma/migrations/20220402135305_python/migration.sql new file mode 100644 index 000000000..0c253d539 --- /dev/null +++ b/apps/server/prisma/migrations/20220402135305_python/migration.sql @@ -0,0 +1,4 @@ +-- 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/server/prisma/migrations/20220402210645_meilisearch/migration.sql b/apps/server/prisma/migrations/20220402210645_meilisearch/migration.sql new file mode 100644 index 000000000..9e832b107 --- /dev/null +++ b/apps/server/prisma/migrations/20220402210645_meilisearch/migration.sql @@ -0,0 +1,12 @@ +-- 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/server/prisma/migrations/20220405151428_wordpress_sftp/migration.sql b/apps/server/prisma/migrations/20220405151428_wordpress_sftp/migration.sql new file mode 100644 index 000000000..6c3c4b907 --- /dev/null +++ b/apps/server/prisma/migrations/20220405151428_wordpress_sftp/migration.sql @@ -0,0 +1,29 @@ +-- 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/server/prisma/migrations/20220407220809_unique_storage_fix/migration.sql b/apps/server/prisma/migrations/20220407220809_unique_storage_fix/migration.sql new file mode 100644 index 000000000..9b645cc3b --- /dev/null +++ b/apps/server/prisma/migrations/20220407220809_unique_storage_fix/migration.sql @@ -0,0 +1,5 @@ +-- DropIndex +DROP INDEX "ApplicationPersistentStorage_path_key"; + +-- DropIndex +DROP INDEX "ApplicationPersistentStorage_applicationId_key"; diff --git a/apps/server/prisma/migrations/20220408070805_added_expose_port/migration.sql b/apps/server/prisma/migrations/20220408070805_added_expose_port/migration.sql new file mode 100644 index 000000000..a23afd64a --- /dev/null +++ b/apps/server/prisma/migrations/20220408070805_added_expose_port/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "Application" ADD COLUMN "exposePort" INTEGER; diff --git a/apps/server/prisma/migrations/20220418214843_persistent_storage_services/migration.sql b/apps/server/prisma/migrations/20220418214843_persistent_storage_services/migration.sql new file mode 100644 index 000000000..f85fd31df --- /dev/null +++ b/apps/server/prisma/migrations/20220418214843_persistent_storage_services/migration.sql @@ -0,0 +1,12 @@ +-- 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/server/prisma/migrations/20220419203408_multiply_dockerfile_locations/migration.sql b/apps/server/prisma/migrations/20220419203408_multiply_dockerfile_locations/migration.sql new file mode 100644 index 000000000..ce32f0844 --- /dev/null +++ b/apps/server/prisma/migrations/20220419203408_multiply_dockerfile_locations/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "Application" ADD COLUMN "dockerFileLocation" TEXT; diff --git a/apps/server/prisma/migrations/20220420202031_deno_configurations/migration.sql b/apps/server/prisma/migrations/20220420202031_deno_configurations/migration.sql new file mode 100644 index 000000000..9d0e832dc --- /dev/null +++ b/apps/server/prisma/migrations/20220420202031_deno_configurations/migration.sql @@ -0,0 +1,3 @@ +-- AlterTable +ALTER TABLE "Application" ADD COLUMN "denoMainFile" TEXT; +ALTER TABLE "Application" ADD COLUMN "denoOptions" TEXT; diff --git a/apps/server/prisma/migrations/20220420210057_branch_for_builds/migration.sql b/apps/server/prisma/migrations/20220420210057_branch_for_builds/migration.sql new file mode 100644 index 000000000..8cd8e653d --- /dev/null +++ b/apps/server/prisma/migrations/20220420210057_branch_for_builds/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "Build" ADD COLUMN "branch" TEXT; diff --git a/apps/server/prisma/migrations/20220425071132_umami/migration.sql b/apps/server/prisma/migrations/20220425071132_umami/migration.sql new file mode 100644 index 000000000..259fb76cd --- /dev/null +++ b/apps/server/prisma/migrations/20220425071132_umami/migration.sql @@ -0,0 +1,17 @@ +-- 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/server/prisma/migrations/20220425075326_auto_update_coolify/migration.sql b/apps/server/prisma/migrations/20220425075326_auto_update_coolify/migration.sql new file mode 100644 index 000000000..a102973ee --- /dev/null +++ b/apps/server/prisma/migrations/20220425075326_auto_update_coolify/migration.sql @@ -0,0 +1,22 @@ +-- 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/server/prisma/migrations/20220426125053_select_base_image/migration.sql b/apps/server/prisma/migrations/20220426125053_select_base_image/migration.sql new file mode 100644 index 000000000..37209d82f --- /dev/null +++ b/apps/server/prisma/migrations/20220426125053_select_base_image/migration.sql @@ -0,0 +1,3 @@ +-- AlterTable +ALTER TABLE "Application" ADD COLUMN "baseBuildImage" TEXT; +ALTER TABLE "Application" ADD COLUMN "baseImage" TEXT; diff --git a/apps/server/prisma/migrations/20220427133656_hasura/migration.sql b/apps/server/prisma/migrations/20220427133656_hasura/migration.sql new file mode 100644 index 000000000..c679ad0fb --- /dev/null +++ b/apps/server/prisma/migrations/20220427133656_hasura/migration.sql @@ -0,0 +1,16 @@ +-- 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/server/prisma/migrations/20220429202516_fider/migration.sql b/apps/server/prisma/migrations/20220429202516_fider/migration.sql new file mode 100644 index 000000000..a6d31a24d --- /dev/null +++ b/apps/server/prisma/migrations/20220429202516_fider/migration.sql @@ -0,0 +1,25 @@ +-- 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/server/prisma/migrations/20220429214112_fider_correction/migration.sql b/apps/server/prisma/migrations/20220429214112_fider_correction/migration.sql new file mode 100644 index 000000000..429524f72 --- /dev/null +++ b/apps/server/prisma/migrations/20220429214112_fider_correction/migration.sql @@ -0,0 +1,29 @@ +-- 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/server/prisma/migrations/20220430111953_ssl_dns_check_settings/migration.sql b/apps/server/prisma/migrations/20220430111953_ssl_dns_check_settings/migration.sql new file mode 100644 index 000000000..cf57379ca --- /dev/null +++ b/apps/server/prisma/migrations/20220430111953_ssl_dns_check_settings/migration.sql @@ -0,0 +1,23 @@ +-- 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/server/prisma/migrations/20220430124553_expose_port_for_services/migration.sql b/apps/server/prisma/migrations/20220430124553_expose_port_for_services/migration.sql new file mode 100644 index 000000000..fdbab5713 --- /dev/null +++ b/apps/server/prisma/migrations/20220430124553_expose_port_for_services/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "Service" ADD COLUMN "exposePort" INTEGER; diff --git a/apps/server/prisma/migrations/20220509130501_custom_plausible_script/migration.sql b/apps/server/prisma/migrations/20220509130501_custom_plausible_script/migration.sql new file mode 100644 index 000000000..6c8c28ff4 --- /dev/null +++ b/apps/server/prisma/migrations/20220509130501_custom_plausible_script/migration.sql @@ -0,0 +1,24 @@ +-- 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/server/prisma/migrations/20220510081125_custom_wordpress_db/migration.sql b/apps/server/prisma/migrations/20220510081125_custom_wordpress_db/migration.sql new file mode 100644 index 000000000..5a1cd301c --- /dev/null +++ b/apps/server/prisma/migrations/20220510081125_custom_wordpress_db/migration.sql @@ -0,0 +1,32 @@ +-- 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/server/prisma/migrations/20220517081328_traefik/migration.sql b/apps/server/prisma/migrations/20220517081328_traefik/migration.sql new file mode 100644 index 000000000..a83281fa4 --- /dev/null +++ b/apps/server/prisma/migrations/20220517081328_traefik/migration.sql @@ -0,0 +1,24 @@ +-- 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/server/prisma/migrations/20220519095648_minio_apifqdn/migration.sql b/apps/server/prisma/migrations/20220519095648_minio_apifqdn/migration.sql new file mode 100644 index 000000000..a44712864 --- /dev/null +++ b/apps/server/prisma/migrations/20220519095648_minio_apifqdn/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "Minio" ADD COLUMN "apiFqdn" TEXT; diff --git a/apps/server/prisma/migrations/20220708132655_deployment_type_for_applications/migration.sql b/apps/server/prisma/migrations/20220708132655_deployment_type_for_applications/migration.sql new file mode 100644 index 000000000..2776d1b88 --- /dev/null +++ b/apps/server/prisma/migrations/20220708132655_deployment_type_for_applications/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "Application" ADD COLUMN "deploymentType" TEXT; diff --git a/apps/server/prisma/migrations/20220712083523_custom_port_git_sources/migration.sql b/apps/server/prisma/migrations/20220712083523_custom_port_git_sources/migration.sql new file mode 100644 index 000000000..f702291b2 --- /dev/null +++ b/apps/server/prisma/migrations/20220712083523_custom_port_git_sources/migration.sql @@ -0,0 +1,24 @@ +-- 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/server/prisma/migrations/20220718083646_moodle/migration.sql b/apps/server/prisma/migrations/20220718083646_moodle/migration.sql new file mode 100644 index 000000000..eaed14a4a --- /dev/null +++ b/apps/server/prisma/migrations/20220718083646_moodle/migration.sql @@ -0,0 +1,20 @@ +-- 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/server/prisma/migrations/20220718114551_remote_docker_engine/migration.sql b/apps/server/prisma/migrations/20220718114551_remote_docker_engine/migration.sql new file mode 100644 index 000000000..e80df22f2 --- /dev/null +++ b/apps/server/prisma/migrations/20220718114551_remote_docker_engine/migration.sql @@ -0,0 +1,21 @@ +-- 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/server/prisma/migrations/20220721084020_ssh_key/migration.sql b/apps/server/prisma/migrations/20220721084020_ssh_key/migration.sql new file mode 100644 index 000000000..8323af409 --- /dev/null +++ b/apps/server/prisma/migrations/20220721084020_ssh_key/migration.sql @@ -0,0 +1,33 @@ +-- 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/server/prisma/migrations/20220722203927_ipaddress/migration.sql b/apps/server/prisma/migrations/20220722203927_ipaddress/migration.sql new file mode 100644 index 000000000..21d45ada3 --- /dev/null +++ b/apps/server/prisma/migrations/20220722203927_ipaddress/migration.sql @@ -0,0 +1,3 @@ +-- AlterTable +ALTER TABLE "Setting" ADD COLUMN "ipv4" TEXT; +ALTER TABLE "Setting" ADD COLUMN "ipv6" TEXT; diff --git a/apps/server/prisma/migrations/20220725191205_architecture/migration.sql b/apps/server/prisma/migrations/20220725191205_architecture/migration.sql new file mode 100644 index 000000000..2e0ff3e01 --- /dev/null +++ b/apps/server/prisma/migrations/20220725191205_architecture/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "Setting" ADD COLUMN "arch" TEXT; diff --git a/apps/server/prisma/migrations/20220726121333_fix_ssh_key/migration.sql b/apps/server/prisma/migrations/20220726121333_fix_ssh_key/migration.sql new file mode 100644 index 000000000..e6e47b197 --- /dev/null +++ b/apps/server/prisma/migrations/20220726121333_fix_ssh_key/migration.sql @@ -0,0 +1,16 @@ +-- 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/server/prisma/migrations/20220806090621_fqdn_not_unique_anymore/migration.sql b/apps/server/prisma/migrations/20220806090621_fqdn_not_unique_anymore/migration.sql new file mode 100644 index 000000000..f1eab666b --- /dev/null +++ b/apps/server/prisma/migrations/20220806090621_fqdn_not_unique_anymore/migration.sql @@ -0,0 +1,2 @@ +-- DropIndex +DROP INDEX "Application_fqdn_key"; diff --git a/apps/server/prisma/migrations/20220806102340_rde_ssh_local_port/migration.sql b/apps/server/prisma/migrations/20220806102340_rde_ssh_local_port/migration.sql new file mode 100644 index 000000000..ae4c39846 --- /dev/null +++ b/apps/server/prisma/migrations/20220806102340_rde_ssh_local_port/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "DestinationDocker" ADD COLUMN "sshLocalPort" INTEGER; diff --git a/apps/server/prisma/migrations/20220815092230_glitchtip/migration.sql b/apps/server/prisma/migrations/20220815092230_glitchtip/migration.sql new file mode 100644 index 000000000..dba98ab82 --- /dev/null +++ b/apps/server/prisma/migrations/20220815092230_glitchtip/migration.sql @@ -0,0 +1,30 @@ +-- 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/server/prisma/migrations/20220815133844_appwrite/migration.sql b/apps/server/prisma/migrations/20220815133844_appwrite/migration.sql new file mode 100644 index 000000000..ec61dc434 --- /dev/null +++ b/apps/server/prisma/migrations/20220815133844_appwrite/migration.sql @@ -0,0 +1,22 @@ +-- 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/server/prisma/migrations/20220816133447_bot_deployments/migration.sql b/apps/server/prisma/migrations/20220816133447_bot_deployments/migration.sql new file mode 100644 index 000000000..3d6d92d0e --- /dev/null +++ b/apps/server/prisma/migrations/20220816133447_bot_deployments/migration.sql @@ -0,0 +1,20 @@ +-- 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/server/prisma/migrations/20220817082342_custom_dns_servers/migration.sql b/apps/server/prisma/migrations/20220817082342_custom_dns_servers/migration.sql new file mode 100644 index 000000000..03588b549 --- /dev/null +++ b/apps/server/prisma/migrations/20220817082342_custom_dns_servers/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "Setting" ADD COLUMN "DNSServers" TEXT; diff --git a/apps/server/prisma/migrations/20220818093615_public_repositories/migration.sql b/apps/server/prisma/migrations/20220818093615_public_repositories/migration.sql new file mode 100644 index 000000000..7f08c29fd --- /dev/null +++ b/apps/server/prisma/migrations/20220818093615_public_repositories/migration.sql @@ -0,0 +1,42 @@ +-- 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/server/prisma/migrations/20220823070532_service_searxng/migration.sql b/apps/server/prisma/migrations/20220823070532_service_searxng/migration.sql new file mode 100644 index 000000000..81ecc81c8 --- /dev/null +++ b/apps/server/prisma/migrations/20220823070532_service_searxng/migration.sql @@ -0,0 +1,13 @@ +-- 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/server/prisma/migrations/20220825064811_concurrent_build_settings/migration.sql b/apps/server/prisma/migrations/20220825064811_concurrent_build_settings/migration.sql new file mode 100644 index 000000000..1535c2bf7 --- /dev/null +++ b/apps/server/prisma/migrations/20220825064811_concurrent_build_settings/migration.sql @@ -0,0 +1,29 @@ +-- 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/server/prisma/migrations/20220825072007_build_queue_improvements/migration.sql b/apps/server/prisma/migrations/20220825072007_build_queue_improvements/migration.sql new file mode 100644 index 000000000..78c51fc15 --- /dev/null +++ b/apps/server/prisma/migrations/20220825072007_build_queue_improvements/migration.sql @@ -0,0 +1,24 @@ +-- 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/server/prisma/migrations/20220831095714_service_weblate/migration.sql b/apps/server/prisma/migrations/20220831095714_service_weblate/migration.sql new file mode 100644 index 000000000..c985b4ae2 --- /dev/null +++ b/apps/server/prisma/migrations/20220831095714_service_weblate/migration.sql @@ -0,0 +1,18 @@ +-- 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/server/prisma/migrations/20220902115640_service_taiga/migration.sql b/apps/server/prisma/migrations/20220902115640_service_taiga/migration.sql new file mode 100644 index 000000000..3035dd8ef --- /dev/null +++ b/apps/server/prisma/migrations/20220902115640_service_taiga/migration.sql @@ -0,0 +1,23 @@ +-- 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/server/prisma/migrations/20220905062318_database_branching/migration.sql b/apps/server/prisma/migrations/20220905062318_database_branching/migration.sql new file mode 100644 index 000000000..d828a4c66 --- /dev/null +++ b/apps/server/prisma/migrations/20220905062318_database_branching/migration.sql @@ -0,0 +1,22 @@ +-- 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/server/prisma/migrations/20220905113241_prisma_migration/migration.sql b/apps/server/prisma/migrations/20220905113241_prisma_migration/migration.sql new file mode 100644 index 000000000..324bcfff0 --- /dev/null +++ b/apps/server/prisma/migrations/20220905113241_prisma_migration/migration.sql @@ -0,0 +1,20 @@ +/* + 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/server/prisma/migrations/20220905115321_application_connected_database/migration.sql b/apps/server/prisma/migrations/20220905115321_application_connected_database/migration.sql new file mode 100644 index 000000000..576c23bdf --- /dev/null +++ b/apps/server/prisma/migrations/20220905115321_application_connected_database/migration.sql @@ -0,0 +1,20 @@ +-- 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/server/prisma/migrations/20220906120112_enable_api_debug_logging/migration.sql b/apps/server/prisma/migrations/20220906120112_enable_api_debug_logging/migration.sql new file mode 100644 index 000000000..05fb3e285 --- /dev/null +++ b/apps/server/prisma/migrations/20220906120112_enable_api_debug_logging/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "Setting" ADD COLUMN "isAPIDebuggingEnabled" BOOLEAN DEFAULT false; diff --git a/apps/server/prisma/migrations/20220907092244_database_secrets/migration.sql b/apps/server/prisma/migrations/20220907092244_database_secrets/migration.sql new file mode 100644 index 000000000..53ff2d19e --- /dev/null +++ b/apps/server/prisma/migrations/20220907092244_database_secrets/migration.sql @@ -0,0 +1,13 @@ +-- 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/server/prisma/migrations/20220913092100_preview_applications/migration.sql b/apps/server/prisma/migrations/20220913092100_preview_applications/migration.sql new file mode 100644 index 000000000..0ec1aafa0 --- /dev/null +++ b/apps/server/prisma/migrations/20220913092100_preview_applications/migration.sql @@ -0,0 +1,18 @@ +-- 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/server/prisma/migrations/20220922064605_custom_certificates/migration.sql b/apps/server/prisma/migrations/20220922064605_custom_certificates/migration.sql new file mode 100644 index 000000000..804913038 --- /dev/null +++ b/apps/server/prisma/migrations/20220922064605_custom_certificates/migration.sql @@ -0,0 +1,10 @@ +-- 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/server/prisma/migrations/20220923122227_custom_ssl_for_applications/migration.sql b/apps/server/prisma/migrations/20220923122227_custom_ssl_for_applications/migration.sql new file mode 100644 index 000000000..b9261a955 --- /dev/null +++ b/apps/server/prisma/migrations/20220923122227_custom_ssl_for_applications/migration.sql @@ -0,0 +1,23 @@ +-- 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/server/prisma/migrations/20220928083348_system_wide_git_sources/migration.sql b/apps/server/prisma/migrations/20220928083348_system_wide_git_sources/migration.sql new file mode 100644 index 000000000..a3657504d --- /dev/null +++ b/apps/server/prisma/migrations/20220928083348_system_wide_git_sources/migration.sql @@ -0,0 +1,26 @@ +-- 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/server/prisma/migrations/20221002084246_no_unique_appid_on_previews/migration.sql b/apps/server/prisma/migrations/20221002084246_no_unique_appid_on_previews/migration.sql new file mode 100644 index 000000000..031f842cb --- /dev/null +++ b/apps/server/prisma/migrations/20221002084246_no_unique_appid_on_previews/migration.sql @@ -0,0 +1,2 @@ +-- DropIndex +DROP INDEX "PreviewApplication_applicationId_key"; diff --git a/apps/server/prisma/migrations/20221002091630_forked_previews/migration.sql b/apps/server/prisma/migrations/20221002091630_forked_previews/migration.sql new file mode 100644 index 000000000..2312c011b --- /dev/null +++ b/apps/server/prisma/migrations/20221002091630_forked_previews/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "Build" ADD COLUMN "sourceRepository" TEXT; diff --git a/apps/server/prisma/migrations/20221005120323_initial_docker_compose/migration.sql b/apps/server/prisma/migrations/20221005120323_initial_docker_compose/migration.sql new file mode 100644 index 000000000..bb93e1aaf --- /dev/null +++ b/apps/server/prisma/migrations/20221005120323_initial_docker_compose/migration.sql @@ -0,0 +1,3 @@ +-- AlterTable +ALTER TABLE "Application" ADD COLUMN "dockerComposeFile" TEXT; +ALTER TABLE "Application" ADD COLUMN "dockerComposeFileLocation" TEXT; diff --git a/apps/server/prisma/migrations/20221005132352_docker_compose_configuration/migration.sql b/apps/server/prisma/migrations/20221005132352_docker_compose_configuration/migration.sql new file mode 100644 index 000000000..e7368dc1a --- /dev/null +++ b/apps/server/prisma/migrations/20221005132352_docker_compose_configuration/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "Application" ADD COLUMN "dockerComposeConfiguration" TEXT; diff --git a/apps/server/prisma/migrations/20221017134342_standardized_service_configs/migration.sql b/apps/server/prisma/migrations/20221017134342_standardized_service_configs/migration.sql new file mode 100644 index 000000000..837017435 --- /dev/null +++ b/apps/server/prisma/migrations/20221017134342_standardized_service_configs/migration.sql @@ -0,0 +1,13 @@ +-- 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/server/prisma/migrations/20221018090939_service_peristent_volumes_predefined/migration.sql b/apps/server/prisma/migrations/20221018090939_service_peristent_volumes_predefined/migration.sql new file mode 100644 index 000000000..c7b935eb7 --- /dev/null +++ b/apps/server/prisma/migrations/20221018090939_service_peristent_volumes_predefined/migration.sql @@ -0,0 +1,19 @@ +-- 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/server/prisma/migrations/20221021112429_serivce_settings_extended/migration.sql b/apps/server/prisma/migrations/20221021112429_serivce_settings_extended/migration.sql new file mode 100644 index 000000000..b2eddcfd9 --- /dev/null +++ b/apps/server/prisma/migrations/20221021112429_serivce_settings_extended/migration.sql @@ -0,0 +1,24 @@ +/* + 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/server/prisma/migrations/20221021185630_service_template_version/migration.sql b/apps/server/prisma/migrations/20221021185630_service_template_version/migration.sql new file mode 100644 index 000000000..f716a2340 --- /dev/null +++ b/apps/server/prisma/migrations/20221021185630_service_template_version/migration.sql @@ -0,0 +1,21 @@ +-- 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/server/prisma/migrations/20221026115123_service_persistent_unique/migration.sql b/apps/server/prisma/migrations/20221026115123_service_persistent_unique/migration.sql new file mode 100644 index 000000000..dae80a76a --- /dev/null +++ b/apps/server/prisma/migrations/20221026115123_service_persistent_unique/migration.sql @@ -0,0 +1,11 @@ +/* + 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/server/prisma/migrations/20221028074301_wordpress_optional_fields/migration.sql b/apps/server/prisma/migrations/20221028074301_wordpress_optional_fields/migration.sql new file mode 100644 index 000000000..217039d97 --- /dev/null +++ b/apps/server/prisma/migrations/20221028074301_wordpress_optional_fields/migration.sql @@ -0,0 +1,32 @@ +-- 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/server/prisma/migrations/20221104092223_default_redirect_proxy/migration.sql b/apps/server/prisma/migrations/20221104092223_default_redirect_proxy/migration.sql new file mode 100644 index 000000000..8584fe25c --- /dev/null +++ b/apps/server/prisma/migrations/20221104092223_default_redirect_proxy/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "Setting" ADD COLUMN "proxyDefaultRedirect" TEXT; diff --git a/apps/server/prisma/migrations/20221114093217_application_storage_path_migration/migration.sql b/apps/server/prisma/migrations/20221114093217_application_storage_path_migration/migration.sql new file mode 100644 index 000000000..6913c8b00 --- /dev/null +++ b/apps/server/prisma/migrations/20221114093217_application_storage_path_migration/migration.sql @@ -0,0 +1,45 @@ +-- 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/server/prisma/migrations/20221123122143_remote_haproxy_from_db/migration.sql b/apps/server/prisma/migrations/20221123122143_remote_haproxy_from_db/migration.sql new file mode 100644 index 000000000..1acf261a5 --- /dev/null +++ b/apps/server/prisma/migrations/20221123122143_remote_haproxy_from_db/migration.sql @@ -0,0 +1,37 @@ +/* + 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/server/prisma/migrations/20221123133429_docker_registries/migration.sql b/apps/server/prisma/migrations/20221123133429_docker_registries/migration.sql new file mode 100644 index 000000000..abebc5514 --- /dev/null +++ b/apps/server/prisma/migrations/20221123133429_docker_registries/migration.sql @@ -0,0 +1,59 @@ +-- 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/server/prisma/migrations/20221128104158_do_not_track/migration.sql b/apps/server/prisma/migrations/20221128104158_do_not_track/migration.sql new file mode 100644 index 000000000..9cf26d8a8 --- /dev/null +++ b/apps/server/prisma/migrations/20221128104158_do_not_track/migration.sql @@ -0,0 +1,30 @@ +-- 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/server/prisma/migrations/20221128104718_fix_defaults/migration.sql b/apps/server/prisma/migrations/20221128104718_fix_defaults/migration.sql new file mode 100644 index 000000000..c1152cdc3 --- /dev/null +++ b/apps/server/prisma/migrations/20221128104718_fix_defaults/migration.sql @@ -0,0 +1,60 @@ +-- 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/server/prisma/migrations/20221128105615_custom_sentry/migration.sql b/apps/server/prisma/migrations/20221128105615_custom_sentry/migration.sql new file mode 100644 index 000000000..00857eb0d --- /dev/null +++ b/apps/server/prisma/migrations/20221128105615_custom_sentry/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "Setting" ADD COLUMN "sentryDSN" TEXT; diff --git a/apps/server/prisma/migrations/20221129081832_fix_defaults/migration.sql b/apps/server/prisma/migrations/20221129081832_fix_defaults/migration.sql new file mode 100644 index 000000000..96f6de3fb --- /dev/null +++ b/apps/server/prisma/migrations/20221129081832_fix_defaults/migration.sql @@ -0,0 +1,31 @@ +-- 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/server/prisma/migrations/20221129121702_preview_separator/migration.sql b/apps/server/prisma/migrations/20221129121702_preview_separator/migration.sql new file mode 100644 index 000000000..e0d64cdc8 --- /dev/null +++ b/apps/server/prisma/migrations/20221129121702_preview_separator/migration.sql @@ -0,0 +1,33 @@ +-- 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/server/prisma/migrations/20221129130036_keep_local_docker_images/migration.sql b/apps/server/prisma/migrations/20221129130036_keep_local_docker_images/migration.sql new file mode 100644 index 000000000..aa8136ed8 --- /dev/null +++ b/apps/server/prisma/migrations/20221129130036_keep_local_docker_images/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "Application" ADD COLUMN "gitCommitHash" TEXT; diff --git a/apps/server/prisma/migrations/20221130142058_reconfigure_docker_registries/migration.sql b/apps/server/prisma/migrations/20221130142058_reconfigure_docker_registries/migration.sql new file mode 100644 index 000000000..c77afb687 --- /dev/null +++ b/apps/server/prisma/migrations/20221130142058_reconfigure_docker_registries/migration.sql @@ -0,0 +1,66 @@ +/* + 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/server/prisma/migrations/20221201115801_simple_dockerfile_deployment/migration.sql b/apps/server/prisma/migrations/20221201115801_simple_dockerfile_deployment/migration.sql new file mode 100644 index 000000000..b3406e59e --- /dev/null +++ b/apps/server/prisma/migrations/20221201115801_simple_dockerfile_deployment/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "Application" ADD COLUMN "simpleDockerfile" TEXT; diff --git a/apps/server/prisma/migrations/20221201133847_push_image_to_docker_registry/migration.sql b/apps/server/prisma/migrations/20221201133847_push_image_to_docker_registry/migration.sql new file mode 100644 index 000000000..9f85d3518 --- /dev/null +++ b/apps/server/prisma/migrations/20221201133847_push_image_to_docker_registry/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "Application" ADD COLUMN "dockerRegistryImageName" TEXT; diff --git a/apps/server/prisma/migrations/20221206140938_init/migration.sql b/apps/server/prisma/migrations/20221206140938_init/migration.sql deleted file mode 100644 index 462efbd29..000000000 --- a/apps/server/prisma/migrations/20221206140938_init/migration.sql +++ /dev/null @@ -1,21 +0,0 @@ --- CreateTable -CREATE TABLE "Category" ( - "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, - "name" TEXT NOT NULL, - "budget" INTEGER NOT NULL, - "customIcon" TEXT, - "period" TEXT NOT NULL DEFAULT 'month', - "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" DATETIME NOT NULL -); - --- CreateTable -CREATE TABLE "Transaction" ( - "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, - "amount" INTEGER NOT NULL, - "description" TEXT, - "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" DATETIME NOT NULL, - "categoryId" INTEGER NOT NULL, - CONSTRAINT "Transaction_categoryId_fkey" FOREIGN KEY ("categoryId") REFERENCES "Category" ("id") ON DELETE RESTRICT ON UPDATE CASCADE -); diff --git a/apps/server/prisma/schema.prisma b/apps/server/prisma/schema.prisma index e0020544b..54eefc504 100644 --- a/apps/server/prisma/schema.prisma +++ b/apps/server/prisma/schema.prisma @@ -1,11 +1,705 @@ -// This is your Prisma schema file, -// learn more about it in the docs: https://pris.ly/d/prisma-schema - generator client { - provider = "prisma-client-js" + provider = "prisma-client-js" + binaryTargets = ["native"] } datasource db { provider = "sqlite" - url = env("DATABASE_URL") + 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) + 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) + 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/server/prisma/seed.js b/apps/server/prisma/seed.js new file mode 100644 index 000000000..3d4b16a28 --- /dev/null +++ b/apps/server/prisma/seed.js @@ -0,0 +1,113 @@ +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/server/src/api/index.ts b/apps/server/src/api/index.ts new file mode 100644 index 000000000..b47d8358c --- /dev/null +++ b/apps/server/src/api/index.ts @@ -0,0 +1,8 @@ +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/server/src/config/index.ts b/apps/server/src/config.ts similarity index 65% rename from apps/server/src/config/index.ts rename to apps/server/src/config.ts index 9b139c5bd..e45c2a4bd 100644 --- a/apps/server/src/config/index.ts +++ b/apps/server/src/config.ts @@ -1,4 +1,4 @@ -import type { ServerOptions } from '../server'; +import type { ServerOptions } from './server'; export const serverConfig: ServerOptions = { dev: false, diff --git a/apps/server/src/env.js b/apps/server/src/env.js index cbe1c25db..f69754110 100644 --- a/apps/server/src/env.js +++ b/apps/server/src/env.js @@ -1,9 +1,17 @@ +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_SECRET_KEY: z.string() + 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); diff --git a/apps/server/src/lib/common.ts b/apps/server/src/lib/common.ts new file mode 100644 index 000000000..77b73b284 --- /dev/null +++ b/apps/server/src/lib/common.ts @@ -0,0 +1,111 @@ +import type { Permission, Setting, Team, TeamInvitation, User } from '@prisma/client'; +import { prisma } from '../prisma'; +import bcrypt from 'bcryptjs'; +import crypto from 'crypto'; +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'; + +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 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, end) { + 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) => 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; +} diff --git a/apps/server/src/lib/dayjs.ts b/apps/server/src/lib/dayjs.ts new file mode 100644 index 000000000..9ff5b0a1a --- /dev/null +++ b/apps/server/src/lib/dayjs.ts @@ -0,0 +1,7 @@ +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/server/src/lib/docker.ts b/apps/server/src/lib/docker.ts new file mode 100644 index 000000000..27bf380a3 --- /dev/null +++ b/apps/server/src/lib/docker.ts @@ -0,0 +1,47 @@ +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 + }; + +} \ No newline at end of file diff --git a/apps/server/src/lib/executeCommand.ts b/apps/server/src/lib/executeCommand.ts new file mode 100644 index 000000000..198c4046c --- /dev/null +++ b/apps/server/src/lib/executeCommand.ts @@ -0,0 +1,188 @@ +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 { 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; + 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) { + 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}`); + } + 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: any[] = []; + 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 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 saveBuildLog(log); + } + } + } + }); + subprocess.on('exit', async (code) => { + if (code === 0) { + resolve('success'); + } else { + if (!debug) { + for (const log of logs) { + await 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); + } +} + +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/server/src/lib/logging.ts b/apps/server/src/lib/logging.ts new file mode 100644 index 000000000..c8f460402 --- /dev/null +++ b/apps/server/src/lib/logging.ts @@ -0,0 +1,50 @@ +import { prisma } from '../prisma'; +import { encrypt, generateTimestamp, isDev } from './common'; +import { day } from './dayjs'; + +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 ? '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/server/src/lib/ssh.ts b/apps/server/src/lib/ssh.ts new file mode 100644 index 000000000..77cbf7307 --- /dev/null +++ b/apps/server/src/lib/ssh.ts @@ -0,0 +1,47 @@ +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/server/src/prisma.ts b/apps/server/src/prisma.ts index a384c202c..e315eae42 100644 --- a/apps/server/src/prisma.ts +++ b/apps/server/src/prisma.ts @@ -6,16 +6,15 @@ import { env } from './env'; import { PrismaClient } from '@prisma/client'; const prismaGlobal = global as typeof global & { - prisma?: PrismaClient; + prisma?: PrismaClient; }; export const prisma: PrismaClient = - prismaGlobal.prisma || - new PrismaClient({ - log: - env.NODE_ENV === 'development' ? ['query', 'error', 'warn'] : ['error'], - }); + prismaGlobal.prisma || + new PrismaClient({ + log: env.NODE_ENV === 'developments' ? ['query', 'error', 'warn'] : ['error'] + }); if (env.NODE_ENV !== 'production') { - prismaGlobal.prisma = prisma; -} \ No newline at end of file + prismaGlobal.prisma = prisma; +} diff --git a/apps/server/src/router/index.ts b/apps/server/src/router/index.ts deleted file mode 100644 index cf362f41d..000000000 --- a/apps/server/src/router/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { apiRouter } from './routers/api'; -import { router } from './trpc'; - -export const appRouter = router({ - api: apiRouter, -}); - -export type AppRouter = typeof appRouter; diff --git a/apps/server/src/router/routers/api.ts b/apps/server/src/router/routers/api.ts deleted file mode 100644 index 685e0339a..000000000 --- a/apps/server/src/router/routers/api.ts +++ /dev/null @@ -1,18 +0,0 @@ -// import { z } from 'zod'; -import { publicProcedure, router } from '../trpc'; -// import { prisma } from '../../prisma'; -import { TRPCError } from '@trpc/server'; - -export const apiRouter = router({ - getConnection: publicProcedure.query(async () => { - try { - return { success: true }; - } catch (error) { - throw new TRPCError({ - code: 'INTERNAL_SERVER_ERROR', - message: 'An unexpected error occurred, please try again later.', - cause: error - }); - } - }) -}); diff --git a/apps/server/src/router/trpc.ts b/apps/server/src/router/trpc.ts deleted file mode 100644 index 5b71870bc..000000000 --- a/apps/server/src/router/trpc.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { initTRPC } from '@trpc/server'; -import superjson from 'superjson'; -import { Context } from './context'; - -const t = initTRPC.context().create({ - transformer: superjson, - errorFormatter({ shape }) { - return shape; - }, -}); - -export const router = t.router; -export const publicProcedure = t.procedure; diff --git a/apps/server/src/server.ts b/apps/server/src/server.ts index 02a80dba8..9a8748fe3 100644 --- a/apps/server/src/server.ts +++ b/apps/server/src/server.ts @@ -1,10 +1,11 @@ import { fastifyTRPCPlugin } from '@trpc/server/adapters/fastify'; import fastify from 'fastify'; -import { appRouter } from './router'; -import { createContext } from './router/context'; +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'; const isDev = process.env['NODE_ENV'] === 'development'; @@ -23,7 +24,16 @@ export function createServer(opts: ServerOptions) { server.register(cors); server.register(fastifyTRPCPlugin, { prefix, - trpcOptions: { router: appRouter, createContext } + 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) { @@ -40,14 +50,16 @@ export function createServer(opts: ServerOptions) { return reply.status(200).sendFile('index.html'); }); } - server.get('/api', async () => { - return { status: 'ok' }; + 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('Server is listening on port', port); + console.log('Coolify server is listening on port', port, 'at 0.0.0.0 🚀'); } catch (err) { server.log.error(err); process.exit(1); diff --git a/apps/server/src/router/context.ts b/apps/server/src/trpc/context.ts similarity index 56% rename from apps/server/src/router/context.ts rename to apps/server/src/trpc/context.ts index bba7c2749..8c7631f8d 100644 --- a/apps/server/src/router/context.ts +++ b/apps/server/src/trpc/context.ts @@ -3,17 +3,20 @@ import { CreateFastifyContextOptions } from '@trpc/server/adapters/fastify'; import jwt from 'jsonwebtoken'; import { env } from '../env'; export interface User { - name: string | string[]; + userId: string; + teamId: string; + permission: string; + isAdmin: boolean; + iat: number; } -export function createContext({ req, res }: CreateFastifyContextOptions) { +export function createContext({ req }: CreateFastifyContextOptions) { const token = req.headers.authorization; + let user: User | null = null; if (token) { - const user = jwt.verify(token, env.COOLIFY_SECRET_KEY); - - console.log(user); + user = jwt.verify(token, env.COOLIFY_SECRET_KEY) as User; } - return { req, res }; + return { user }; } export type Context = inferAsyncReturnType; diff --git a/apps/server/src/trpc/index.ts b/apps/server/src/trpc/index.ts new file mode 100644 index 000000000..4eddbb785 --- /dev/null +++ b/apps/server/src/trpc/index.ts @@ -0,0 +1,21 @@ +import { router } from './trpc'; +import type { Permission } from '@prisma/client'; + +import { + settingsRouter, + authRouter, + dashboardRouter, + applicationsRouter, + servicesRouter +} from './routers'; + +export const appRouter = router({ + settings: settingsRouter, + auth: authRouter, + dashboard: dashboardRouter, + applications: applicationsRouter, + services: servicesRouter +}); + +export type AppRouter = typeof appRouter; +export type PrismaPermission = Permission; diff --git a/apps/server/src/trpc/routers/applications.ts b/apps/server/src/trpc/routers/applications.ts new file mode 100644 index 000000000..3a37d70e8 --- /dev/null +++ b/apps/server/src/trpc/routers/applications.ts @@ -0,0 +1,525 @@ +import { z } from 'zod'; +import { privateProcedure, router } from '../trpc'; +import { decrypt, isARM, listSettings } from '../../lib/common'; +import { prisma } from '../../prisma'; +import { executeCommand } from '../../lib/executeCommand'; +import { checkContainer } from '../../lib/docker'; + +export const applicationsRouter = router({ + 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.' }; + } + 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; + }) +}); + +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/server/src/trpc/routers/auth.ts b/apps/server/src/trpc/routers/auth.ts new file mode 100644 index 000000000..1c431995c --- /dev/null +++ b/apps/server/src/trpc/routers/auth.ts @@ -0,0 +1,178 @@ +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/server/src/trpc/routers/dashboard.ts b/apps/server/src/trpc/routers/dashboard.ts new file mode 100644 index 000000000..273018dc1 --- /dev/null +++ b/apps/server/src/trpc/routers/dashboard.ts @@ -0,0 +1,65 @@ +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/server/src/trpc/routers/index.ts b/apps/server/src/trpc/routers/index.ts new file mode 100644 index 000000000..3dea86e15 --- /dev/null +++ b/apps/server/src/trpc/routers/index.ts @@ -0,0 +1,5 @@ +export * from './auth'; +export * from './dashboard'; +export * from './settings'; +export * from './applications'; +export * from './services'; diff --git a/apps/server/src/trpc/routers/services.ts b/apps/server/src/trpc/routers/services.ts new file mode 100644 index 000000000..1e5a805ed --- /dev/null +++ b/apps/server/src/trpc/routers/services.ts @@ -0,0 +1,118 @@ +import { z } from 'zod'; +import { privateProcedure, router } from '../trpc'; +import { decrypt, getTemplates, listSettings } from '../../lib/common'; +import { prisma } from '../../prisma'; +import { executeCommand } from '../../lib/executeCommand'; +import { checkContainer } from '../../lib/docker'; + +export const servicesRouter = router({ + 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) => 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; + }) +}); + +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/server/src/trpc/routers/settings.ts b/apps/server/src/trpc/routers/settings.ts new file mode 100644 index 000000000..e06de54a9 --- /dev/null +++ b/apps/server/src/trpc/routers/settings.ts @@ -0,0 +1,80 @@ +// 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/server/src/trpc/trpc.ts b/apps/server/src/trpc/trpc.ts new file mode 100644 index 000000000..503bd522e --- /dev/null +++ b/apps/server/src/trpc/trpc.ts @@ -0,0 +1,33 @@ +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).use(logger); +export const publicProcedure = t.procedure.use(logger); diff --git a/apps/server/tags.json b/apps/server/tags.json new file mode 100644 index 000000000..0d84f6caa --- /dev/null +++ b/apps/server/tags.json @@ -0,0 +1 @@ +[{"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/server/templates.json b/apps/server/templates.json new file mode 100644 index 000000000..256cca609 --- /dev/null +++ b/apps/server/templates.json @@ -0,0 +1 @@ +[{"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":"warningtrue"},{"location":"/etc/clickhouse-server/config.d/logging.xml","content":"00"},{"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":"warningtrue"},{"location":"/etc/clickhouse-server/config.d/logging.xml","content":"00"},{"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/package.json b/package.json index c2c5bc9d5..d1a77ef05 100644 --- a/package.json +++ b/package.json @@ -8,8 +8,10 @@ "oc": "opencollective-setup", "translate": "pnpm run --filter i18n-converter translate", "db:studio": "pnpm run --filter api db:studio", + "db:studio:trpc": "pnpm run --filter server db:studio", "db:studio:container": "docker exec coolify pnpm run --filter api db:studio", "db:push": "pnpm run --filter api db:push", + "db:push:trpc": "pnpm run --filter server db:push", "db:seed": "pnpm run --filter api db:seed", "db:migrate": "pnpm run --filter api db:migrate", "db:migrate:container": "docker exec coolify pnpm run --filter api db:migrate", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1c06d02dd..4482f8b63 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -163,9 +163,12 @@ importers: '@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 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 postcss: 8.4.19 postcss-load-config: 4.0.1 @@ -183,6 +186,9 @@ importers: 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 + flowbite-svelte: 0.28.0 js-cookie: 3.0.1 server: link:../server superjson: 1.11.0 @@ -231,22 +237,34 @@ importers: '@prisma/client': 4.6.1 '@trpc/client': 10.1.0 '@trpc/server': 10.1.0 + '@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 + bcryptjs: 2.4.3 + 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-port-reachable: 4.0.0 jsonwebtoken: 8.5.1 node-fetch: 3.3.0 npm-run-all: 4.1.5 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 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 @@ -261,18 +279,30 @@ importers: '@trpc/client': 10.1.0_@trpc+server@10.1.0 '@trpc/server': 10.1.0 abort-controller: 3.0.0 + bcryptjs: 2.4.3 + 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-port-reachable: 4.0.0 jsonwebtoken: 8.5.1 node-fetch: 3.3.0 prisma: 4.6.1 + shell-quote: 1.7.4 + ssh-config: 4.1.6 superjson: 1.11.0 tslib: 2.4.1 + unique-names-generator: 4.7.1 ws: 8.11.0 zod: 3.19.1 devDependencies: + '@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 npm-run-all: 4.1.5 rimraf: 3.0.2 @@ -1716,7 +1746,6 @@ packages: /@popperjs/core/2.11.6: resolution: {integrity: sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==} - dev: true /@prisma/client/4.6.1_prisma@4.6.1: resolution: {integrity: sha512-M1+NNrMzqaOIxT7PBGcTs3IZo7d1EW/+gVQd4C4gUgWBDGgD9AcIeZnUSidgWClmpMSgVUdnVORjsWWGUameYA==} @@ -2040,6 +2069,12 @@ packages: 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.9 + dev: true + /@types/keyv/3.1.4: resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} dependencies: @@ -2100,6 +2135,10 @@ 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 @@ -3454,7 +3493,6 @@ packages: /classnames/2.3.2: resolution: {integrity: sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==} - dev: true /clean-stack/4.2.0: resolution: {integrity: sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==} @@ -4801,14 +4839,12 @@ 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 - dev: true /follow-redirects/1.15.2_debug@4.3.2: resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} @@ -5997,7 +6033,6 @@ 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==} From 2007ba0c3b96e33ca1081ab0f91e31b43e3443f9 Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Mon, 12 Dec 2022 14:52:56 +0100 Subject: [PATCH 05/72] fix: build commands --- package.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index d1a77ef05..c90d5eff7 100644 --- a/package.json +++ b/package.json @@ -8,10 +8,10 @@ "oc": "opencollective-setup", "translate": "pnpm run --filter i18n-converter translate", "db:studio": "pnpm run --filter api db:studio", - "db:studio:trpc": "pnpm run --filter server db:studio", + "db:studio-trpc": "pnpm run --filter server db:studio", "db:studio:container": "docker exec coolify pnpm run --filter api db:studio", "db:push": "pnpm run --filter api db:push", - "db:push:trpc": "pnpm run --filter server db:push", + "db:push-trpc": "pnpm run --filter server db:push", "db:seed": "pnpm run --filter api db:seed", "db:migrate": "pnpm run --filter api db:migrate", "db:migrate:container": "docker exec coolify pnpm run --filter api db:migrate", @@ -20,14 +20,14 @@ "lint": "run-p -l -n lint:*", "lint:api": "NODE_ENV=development pnpm run --filter api lint", "dev:container": "docker-compose -f docker-compose-dev.yaml up --build || docker compose -f docker-compose-dev.yaml up --build", - "dev:trpc": "NODE_ENV=development run-p -l -n dev:server dev:client", + "dev-trpc": "NODE_ENV=development run-p -l -n dev:server dev:client", "dev": "run-p -l -n dev:api dev:ui", "dev:api": "NODE_ENV=development pnpm run --filter api dev", "dev:server": "NODE_ENV=development pnpm run --filter server dev", "dev:client": "NODE_ENV=development pnpm run --filter client dev", "dev:ui": "NODE_ENV=development pnpm run --filter ui dev", - "build:trpc": "NODE_ENV=production pnpm run --filter server build && pnpm run --filter client build && cp ./apps/server/package.json build/ && cd build/ && pnpm install -p .", - "start:trpc": "NODE_ENV=production node build/index.js", + "build-trpc": "NODE_ENV=production pnpm run --filter server build && pnpm run --filter client build && cp ./apps/server/package.json build/ && cd build/ && pnpm install -p .", + "start-trpc": "NODE_ENV=production node build/index.js", "build": "NODE_ENV=production run-p -n build:*", "build:api": "NODE_ENV=production pnpm run --filter api build", "build:ui": "NODE_ENV=production pnpm run --filter ui build", From 4ad7e1f8e661c92af57e2b4a00e3765d8873332a Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Mon, 12 Dec 2022 16:04:41 +0100 Subject: [PATCH 06/72] wip --- apps/client/package.json | 1 + apps/client/src/lib/store.ts | 4 +- apps/client/src/routes/+layout.svelte | 4 +- apps/client/src/routes/+page.svelte | 40 ++-- apps/client/tsconfig.json | 11 +- apps/server/package.json | 1 + apps/server/src/env.js | 2 +- apps/server/src/lib/common.ts | 29 ++- apps/server/src/lib/docker.ts | 101 ++++++++-- apps/server/src/lib/executeCommand.ts | 25 +-- apps/server/src/lib/logging.ts | 16 +- apps/server/src/prisma.ts | 2 +- apps/server/{ => src}/tags.json | 0 apps/server/{ => src}/templates.json | 0 apps/server/src/trpc/context.ts | 4 +- apps/server/src/trpc/index.ts | 6 +- apps/server/src/trpc/routers/applications.ts | 196 +++++++++++++------ apps/server/src/trpc/routers/databases.ts | 84 ++++++++ apps/server/src/trpc/routers/index.ts | 1 + apps/server/src/trpc/routers/services.ts | 183 +++++++++++------ pnpm-lock.yaml | 8 + 21 files changed, 520 insertions(+), 198 deletions(-) rename apps/server/{ => src}/tags.json (100%) rename apps/server/{ => src}/templates.json (100%) create mode 100644 apps/server/src/trpc/routers/databases.ts diff --git a/apps/client/package.json b/apps/client/package.json index 2f067f30a..b9fda399a 100644 --- a/apps/client/package.json +++ b/apps/client/package.json @@ -17,6 +17,7 @@ "@playwright/test": "1.28.1", "@sveltejs/adapter-static": "1.0.0-next.48", "@sveltejs/kit": "1.0.0-next.572", + "@types/js-cookie": "3.0.2", "@typescript-eslint/eslint-plugin": "5.44.0", "@typescript-eslint/parser": "5.44.0", "autoprefixer": "10.4.13", diff --git a/apps/client/src/lib/store.ts b/apps/client/src/lib/store.ts index 0022e6c93..0b08d624e 100644 --- a/apps/client/src/lib/store.ts +++ b/apps/client/src/lib/store.ts @@ -1,6 +1,6 @@ -import { writable, readable, type Writable, type Readable } from 'svelte/store'; +import { writable, readable, type Writable } from 'svelte/store'; import superjson from 'superjson'; -import type { AppRouter, PrismaPermission } from 'server/src/trpc'; +import type { AppRouter } from 'server/src/trpc'; import { createTRPCProxyClient, httpBatchLink } from '@trpc/client'; import { browser, dev } from '$app/environment'; import Cookies from 'js-cookie'; diff --git a/apps/client/src/routes/+layout.svelte b/apps/client/src/routes/+layout.svelte index 0664797ca..d219cd63a 100644 --- a/apps/client/src/routes/+layout.svelte +++ b/apps/client/src/routes/+layout.svelte @@ -6,7 +6,7 @@ import { appSession } from '$lib/store'; import Tooltip from '$lib/components/Tooltip.svelte'; import { page } from '$app/stores'; - import UpdateAvailable from '$lib/components/UpdateAvailable.svelte'; + // import UpdateAvailable from '$lib/components/UpdateAvailable.svelte'; import Cookies from 'js-cookie'; import { errorNotification } from '$lib/common'; import Toasts from '$lib/components/Toasts.svelte'; @@ -346,7 +346,7 @@ IAM {#if $appSession.pendingInvitations.length > 0} {pendingInvitations.length}{$appSession.pendingInvitations.length} {/if} diff --git a/apps/client/src/routes/+page.svelte b/apps/client/src/routes/+page.svelte index b3e1c2879..71163b87e 100644 --- a/apps/client/src/routes/+page.svelte +++ b/apps/client/src/routes/+page.svelte @@ -2,6 +2,18 @@ import type { PageData } from './$types'; export let data: PageData; + import { dev } from '$app/environment'; + import { onMount } from 'svelte'; + + import { asyncSleep, errorNotification, getRndInteger } from '$lib/common'; + import { appSession, search, t } from '$lib/store'; + + import ApplicationsIcons from '$lib/components/svg/applications/ApplicationIcons.svelte'; + import DatabaseIcons from '$lib/components/svg/databases/DatabaseIcons.svelte'; + import ServiceIcons from '$lib/components/svg/services/ServiceIcons.svelte'; + import NewResource from '$lib/components/NewResource.svelte'; + import DeleteIcon from '$lib/components/DeleteIcon.svelte'; + const { applications, foundUnconfiguredApplication, @@ -14,17 +26,6 @@ settings } = data; let filtered: any = setInitials(); - import { asyncSleep, errorNotification, getRndInteger } from '$lib/common'; - import { appSession, search, t } from '$lib/store'; - - import ApplicationsIcons from '$lib/components/svg/applications/ApplicationIcons.svelte'; - import DatabaseIcons from '$lib/components/svg/databases/DatabaseIcons.svelte'; - import ServiceIcons from '$lib/components/svg/services/ServiceIcons.svelte'; - import { dev } from '$app/environment'; - import NewResource from '$lib/components/NewResource.svelte'; - import { onMount } from 'svelte'; - import DeleteIcon from '$lib/components/DeleteIcon.svelte'; - let numberOfGetStatus = 0; let status: any = {}; let noInitialStatus: any = { @@ -155,7 +156,7 @@ let isRunning = false; let isDegraded = false; if (buildPack || simpleDockerfile) { - const response = await t.applications.status.query({ id }) + const response = await t.applications.status.query({ id }); if (response.length === 0) { isRunning = false; } else if (response.length === 1) { @@ -177,7 +178,7 @@ } } } else if (typeof dualCerts !== 'undefined') { - const response = await t.services.status.query({ id }) + const response = await t.services.status.query({ id }); if (Object.keys(response).length === 0) { isRunning = false; } else { @@ -197,7 +198,7 @@ } } } else { - const response = await get(`/databases/${id}/status`); + const response = await t.databases.status.query({ id }); isRunning = response.isRunning; } @@ -381,7 +382,7 @@ 'Are you sure? This will delete all UNCONFIGURED applications and their data.' ); if (sure) { - // await post(`/applications/cleanup/unconfigured`, {}); + await t.applications.cleanup.query(); return window.location.reload(); } } catch (error) { @@ -394,7 +395,7 @@ 'Are you sure? This will delete all UNCONFIGURED services and their data.' ); if (sure) { - // await post(`/services/cleanup/unconfigured`, {}); + await t.services.cleanup.query(); return window.location.reload(); } } catch (error) { @@ -407,7 +408,7 @@ 'Are you sure? This will delete all UNCONFIGURED databases and their data.' ); if (sure) { - // await post(`/databases/cleanup/unconfigured`, {}); + await t.databases.cleanup.query(); return window.location.reload(); } } catch (error) { @@ -418,7 +419,7 @@ try { const sure = confirm('Are you sure? This will delete this application!'); if (sure) { - // await del(`/applications/${id}`, { force: true }); + await t.applications.delete.mutate({ id, force: true }); return window.location.reload(); } } catch (error) { @@ -429,6 +430,7 @@ try { const sure = confirm('Are you sure? This will delete this service!'); if (sure) { + await t.services.delete.mutate({ id }); // await del(`/services/${id}`, {}); return window.location.reload(); } @@ -440,7 +442,7 @@ try { const sure = confirm('Are you sure? This will delete this database!'); if (sure) { - // await del(`/databases/${id}`, { force: true }); + await t.databases.delete.mutate({ id, force: true }); return window.location.reload(); } } catch (error) { diff --git a/apps/client/tsconfig.json b/apps/client/tsconfig.json index b959b7dc5..dc270e7f0 100644 --- a/apps/client/tsconfig.json +++ b/apps/client/tsconfig.json @@ -1,5 +1,6 @@ { "extends": "./.svelte-kit/tsconfig.json", + "exclude": ["node_modules/*", ".svelte-kit/*", "public/*"], "compilerOptions": { "allowJs": true, "checkJs": true, @@ -10,12 +11,8 @@ "sourceMap": true, "strict": false, "paths": { - "$lib": [ - "src/lib" - ], - "$lib/*": [ - "src/lib/*" - ], + "$lib": ["src/lib"], + "$lib/*": ["src/lib/*"] } } -} \ No newline at end of file +} diff --git a/apps/server/package.json b/apps/server/package.json index 3ce4e8afa..2ae9cbb50 100644 --- a/apps/server/package.json +++ b/apps/server/package.json @@ -51,6 +51,7 @@ "@types/node": "18.11.9", "@types/node-fetch": "2.6.2", "@types/shell-quote": "^1.7.1", + "@types/bcryptjs": "^2.4.2", "@types/ws": "8.5.3", "npm-run-all": "4.1.5", "rimraf": "3.0.2", diff --git a/apps/server/src/env.js b/apps/server/src/env.js index f69754110..fece0be52 100644 --- a/apps/server/src/env.js +++ b/apps/server/src/env.js @@ -1,5 +1,5 @@ const dotenv = require('dotenv'); -const isDev = process.env.NODE_ENV === 'development'; +// const isDev = process.env.NODE_ENV === 'development'; // dotenv.config({ path: isDev ? '../../.env' : '.env' }); dotenv.config(); const { z } = require('zod'); diff --git a/apps/server/src/lib/common.ts b/apps/server/src/lib/common.ts index 77b73b284..f6eb14199 100644 --- a/apps/server/src/lib/common.ts +++ b/apps/server/src/lib/common.ts @@ -68,8 +68,8 @@ export const decrypt = (hashString: string) => { return false; }; -export function generateRangeArray(start, end) { - return Array.from({ length: end - start }, (v, k) => k + start); +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')}`; @@ -94,7 +94,7 @@ export async function getTemplates() { let data = await open.readFile({ encoding: 'utf-8' }); let jsonData = JSON.parse(data); if (isARM(process.arch)) { - jsonData = jsonData.filter((d) => d.arch !== 'amd64'); + jsonData = jsonData.filter((d: { arch: string }) => d.arch !== 'amd64'); } return jsonData; } catch (error) { @@ -109,3 +109,26 @@ export function isARM(arch: string) { } 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 } }); +} diff --git a/apps/server/src/lib/docker.ts b/apps/server/src/lib/docker.ts index 27bf380a3..85eb78e30 100644 --- a/apps/server/src/lib/docker.ts +++ b/apps/server/src/lib/docker.ts @@ -1,31 +1,39 @@ -import { executeCommand } from "./executeCommand"; +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 } }> { +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}` + command: `docker inspect --format '{{json .State}}' ${container}` }); - containerFound = true + containerFound = true; const parsedStdout = JSON.parse(stdout); const status = parsedStdout.Status; const isRunning = status === 'running'; - const isRestarting = status === 'restarting' - const isExited = status === 'exited' + const isRestarting = status === 'restarting'; + const isExited = status === 'exited'; if (status === 'created') { await executeCommand({ dockerId, - command: - `docker rm ${container}` + command: `docker rm ${container}` }); } if (remove && status === 'exited') { await executeCommand({ dockerId, - command: - `docker rm ${container}` + command: `docker rm ${container}` }); } @@ -43,5 +51,74 @@ export async function checkContainer({ dockerId, container, remove = false }: { return { found: false }; +} -} \ No newline at end of file +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; + } +} diff --git a/apps/server/src/lib/executeCommand.ts b/apps/server/src/lib/executeCommand.ts index 198c4046c..8a3bf4afa 100644 --- a/apps/server/src/lib/executeCommand.ts +++ b/apps/server/src/lib/executeCommand.ts @@ -6,7 +6,7 @@ import sshConfig from 'ssh-config'; import { getFreeSSHLocalPort } from './ssh'; import { env } from '../env'; -import { saveBuildLog } from './logging'; +import { BuildLog, saveBuildLog } from './logging'; import { decrypt } from './common'; export async function executeCommand({ @@ -31,23 +31,26 @@ export async function executeCommand({ 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); + const dockerCommand = parsedCommand[0]?.toString(); + const dockerArgs = parsedCommand.slice(1).toString(); - if (dockerId) { + 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; + let { + remoteEngine, + remoteIpAddress, + engine = 'unix:///var/run/docker.sock' + } = 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'); @@ -73,12 +76,12 @@ export async function executeCommand({ } const logs: any[] = []; if (subprocess && subprocess.stdout && subprocess.stderr) { - subprocess.stdout.on('data', async (data) => { + 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 = { + const log: BuildLog = { line: `${line.replace('\n', '')}`, buildId, applicationId @@ -90,7 +93,7 @@ export async function executeCommand({ } } }); - subprocess.stderr.on('data', async (data) => { + subprocess.stderr.on('data', async (data: string) => { const stderr = data.toString(); const array = stderr.split('\n'); for (const line of array) { @@ -107,7 +110,7 @@ export async function executeCommand({ } } }); - subprocess.on('exit', async (code) => { + subprocess.on('exit', async (code: number) => { if (code === 0) { resolve('success'); } else { diff --git a/apps/server/src/lib/logging.ts b/apps/server/src/lib/logging.ts index c8f460402..bb4dde7a0 100644 --- a/apps/server/src/lib/logging.ts +++ b/apps/server/src/lib/logging.ts @@ -2,15 +2,13 @@ import { prisma } from '../prisma'; import { encrypt, generateTimestamp, isDev } from './common'; import { day } from './dayjs'; -export const saveBuildLog = async ({ - line, - buildId, - applicationId -}: { - line: string; - buildId: string; - applicationId: string; -}): Promise => { +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'); diff --git a/apps/server/src/prisma.ts b/apps/server/src/prisma.ts index e315eae42..7c818b869 100644 --- a/apps/server/src/prisma.ts +++ b/apps/server/src/prisma.ts @@ -12,7 +12,7 @@ const prismaGlobal = global as typeof global & { export const prisma: PrismaClient = prismaGlobal.prisma || new PrismaClient({ - log: env.NODE_ENV === 'developments' ? ['query', 'error', 'warn'] : ['error'] + log: env.NODE_ENV === 'development' ? ['query', 'error', 'warn'] : ['error'] }); if (env.NODE_ENV !== 'production') { diff --git a/apps/server/tags.json b/apps/server/src/tags.json similarity index 100% rename from apps/server/tags.json rename to apps/server/src/tags.json diff --git a/apps/server/templates.json b/apps/server/src/templates.json similarity index 100% rename from apps/server/templates.json rename to apps/server/src/templates.json diff --git a/apps/server/src/trpc/context.ts b/apps/server/src/trpc/context.ts index 8c7631f8d..e1e64c29f 100644 --- a/apps/server/src/trpc/context.ts +++ b/apps/server/src/trpc/context.ts @@ -1,5 +1,5 @@ -import { inferAsyncReturnType } from '@trpc/server'; -import { CreateFastifyContextOptions } from '@trpc/server/adapters/fastify'; +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 { diff --git a/apps/server/src/trpc/index.ts b/apps/server/src/trpc/index.ts index 4eddbb785..a5bc3e969 100644 --- a/apps/server/src/trpc/index.ts +++ b/apps/server/src/trpc/index.ts @@ -6,7 +6,8 @@ import { authRouter, dashboardRouter, applicationsRouter, - servicesRouter + servicesRouter, + databasesRouter } from './routers'; export const appRouter = router({ @@ -14,7 +15,8 @@ export const appRouter = router({ auth: authRouter, dashboard: dashboardRouter, applications: applicationsRouter, - services: servicesRouter + services: servicesRouter, + databases: databasesRouter }); export type AppRouter = typeof appRouter; diff --git a/apps/server/src/trpc/routers/applications.ts b/apps/server/src/trpc/routers/applications.ts index 3a37d70e8..3277b43cc 100644 --- a/apps/server/src/trpc/routers/applications.ts +++ b/apps/server/src/trpc/routers/applications.ts @@ -1,72 +1,44 @@ import { z } from 'zod'; import { privateProcedure, router } from '../trpc'; -import { decrypt, isARM, listSettings } from '../../lib/common'; +import { decrypt, isARM } from '../../lib/common'; import { prisma } from '../../prisma'; import { executeCommand } from '../../lib/executeCommand'; -import { checkContainer } from '../../lib/docker'; +import { checkContainer, removeContainer } from '../../lib/docker'; export const applicationsRouter = router({ - 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.' }; - } - 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 - } - }); + 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; } - } - } 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, + name: containerObj.Names, status: { isRunning, isExited, @@ -75,8 +47,108 @@ export const applicationsRouter = router({ }); } } + } 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; + } + 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 || + !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.applicationPersistentStorage.deleteMany({ + where: { applicationId: application.id } + }); + await prisma.applicationConnectedDatabase.deleteMany({ + where: { applicationId: application.id } + }); + await prisma.application.deleteMany({ where: { id: application.id } }); + } + } + return {}; + }), + 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 } }); + 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/server/src/trpc/routers/databases.ts b/apps/server/src/trpc/routers/databases.ts new file mode 100644 index 000000000..8d4d8a0ee --- /dev/null +++ b/apps/server/src/trpc/routers/databases.ts @@ -0,0 +1,84 @@ +import { z } from 'zod'; +import { privateProcedure, router } from '../trpc'; +import { decrypt } from '../../lib/common'; +import { prisma } from '../../prisma'; +import { executeCommand } from '../../lib/executeCommand'; +import { stopDatabaseContainer, stopTcpHttpProxy } from '../../lib/docker'; + +export const databasesRouter = router({ + 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 { + 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() })) + .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/server/src/trpc/routers/index.ts b/apps/server/src/trpc/routers/index.ts index 3dea86e15..0e16e9c41 100644 --- a/apps/server/src/trpc/routers/index.ts +++ b/apps/server/src/trpc/routers/index.ts @@ -3,3 +3,4 @@ export * from './dashboard'; export * from './settings'; export * from './applications'; export * from './services'; +export * from './databases'; diff --git a/apps/server/src/trpc/routers/services.ts b/apps/server/src/trpc/routers/services.ts index 1e5a805ed..6368d60f1 100644 --- a/apps/server/src/trpc/routers/services.ts +++ b/apps/server/src/trpc/routers/services.ts @@ -1,82 +1,135 @@ import { z } from 'zod'; import { privateProcedure, router } from '../trpc'; -import { decrypt, getTemplates, listSettings } from '../../lib/common'; +import { decrypt, getTemplates, removeService } from '../../lib/common'; import { prisma } from '../../prisma'; import { executeCommand } from '../../lib/executeCommand'; -import { checkContainer } from '../../lib/docker'; export const servicesRouter = router({ - 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) => 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; - } + 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, - isRunning, - isExited, - isRestarting + 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; + } + 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; + 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 {}; }) }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4482f8b63..a62d53050 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -160,6 +160,7 @@ importers: '@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 @@ -196,6 +197,7 @@ importers: '@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 @@ -237,6 +239,7 @@ importers: '@prisma/client': 4.6.1 '@trpc/client': 10.1.0 '@trpc/server': 10.1.0 + '@types/bcryptjs': ^2.4.2 '@types/jsonwebtoken': ^8.5.9 '@types/node': 18.11.9 '@types/node-fetch': 2.6.2 @@ -299,6 +302,7 @@ importers: ws: 8.11.0 zod: 3.19.1 devDependencies: + '@types/bcryptjs': 2.4.2 '@types/jsonwebtoken': 8.5.9 '@types/node': 18.11.9 '@types/node-fetch': 2.6.2 @@ -2026,6 +2030,10 @@ 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: From 02c530dcbe9ee00f5a4b3caeeef439d669520eb8 Mon Sep 17 00:00:00 2001 From: jugglingjsons Date: Mon, 12 Dec 2022 19:11:40 +0100 Subject: [PATCH 07/72] fix: adding missing appwrite volume --- apps/api/devTemplates.yaml | 125 +++++++++++++++++++------------------ apps/api/templates.json | 2 +- 2 files changed, 64 insertions(+), 63 deletions(-) diff --git a/apps/api/devTemplates.yaml b/apps/api/devTemplates.yaml index 975b7b397..192e78498 100644 --- a/apps/api/devTemplates.yaml +++ b/apps/api/devTemplates.yaml @@ -646,6 +646,7 @@ - "$$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 @@ -2074,10 +2075,10 @@ "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, @@ -2087,10 +2088,10 @@ "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, @@ -2099,10 +2100,10 @@ "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, @@ -2116,10 +2117,10 @@ "screen" VARCHAR(11), "language" VARCHAR(35), "country" CHAR(2), - + PRIMARY KEY ("session_id") ); - + -- CreateTable CREATE TABLE "website" ( "website_id" SERIAL NOT NULL, @@ -2129,73 +2130,73 @@ "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 @@ -2281,10 +2282,10 @@ "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, @@ -2294,10 +2295,10 @@ "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, @@ -2306,10 +2307,10 @@ "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, @@ -2323,10 +2324,10 @@ "screen" VARCHAR(11), "language" VARCHAR(35), "country" CHAR(2), - + PRIMARY KEY ("session_id") ); - + -- CreateTable CREATE TABLE "website" ( "website_id" SERIAL NOT NULL, @@ -2336,73 +2337,73 @@ "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 diff --git a/apps/api/templates.json b/apps/api/templates.json index 256cca609..1cca01614 100644 --- a/apps/api/templates.json +++ b/apps/api/templates.json @@ -1 +1 @@ -[{"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":"warningtrue"},{"location":"/etc/clickhouse-server/config.d/logging.xml","content":"00"},{"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":"warningtrue"},{"location":"/etc/clickhouse-server/config.d/logging.xml","content":"00"},{"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 +[{"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":"warningtrue"},{"location":"/etc/clickhouse-server/config.d/logging.xml","content":"00"},{"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","/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.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":"warningtrue"},{"location":"/etc/clickhouse-server/config.d/logging.xml","content":"00"},{"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 From eb354f639f1432a05f7dfcebb9732981ed0ee5c1 Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Tue, 13 Dec 2022 09:05:11 +0100 Subject: [PATCH 08/72] chore: version++ --- apps/api/src/lib/common.ts | 458 ++++++++++++++++++++++--------------- package.json | 2 +- 2 files changed, 277 insertions(+), 183 deletions(-) diff --git a/apps/api/src/lib/common.ts b/apps/api/src/lib/common.ts index 52ab2031c..5ca17eaf2 100644 --- a/apps/api/src/lib/common.ts +++ b/apps/api/src/lib/common.ts @@ -19,9 +19,10 @@ import { saveBuildLog, saveDockerRegistryCredentials } from './buildPacks/common import { scheduler } from './scheduler'; import type { ExecaChildProcess } from 'execa'; -export const version = '3.12.0'; +export const version = '3.12.1'; export const isDev = process.env.NODE_ENV === 'development'; -export const sentryDSN = 'https://409f09bcb7af47928d3e0f46b78987f3@o1082494.ingest.sentry.io/4504236622217216'; +export const sentryDSN = + 'https://409f09bcb7af47928d3e0f46b78987f3@o1082494.ingest.sentry.io/4504236622217216'; const algorithm = 'aes-256-ctr'; const customConfig: Config = { dictionaries: [adjectives, colors, animals], @@ -92,7 +93,7 @@ export const asyncExecShellStream = async ({ line: `${line.replace('\n', '')}`, buildId, applicationId - } + }; logs.push(log); if (debug) { await saveBuildLog(log); @@ -109,7 +110,7 @@ export const asyncExecShellStream = async ({ line: `${line.replace('\n', '')}`, buildId, applicationId - } + }; logs.push(log); if (debug) { await saveBuildLog(log); @@ -393,7 +394,6 @@ export function generateTimestamp(): string { return `${day().format('HH:mm:ss.SSS')}`; } - export const supportedDatabaseTypesAndVersions = [ { name: 'mongodb', @@ -509,20 +509,19 @@ export async function createRemoteEngineConfiguration(id: string) { } = 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` + 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) { } - + } catch (error) {} const found = config.find({ Host }); const foundIp = config.find({ Host: remoteIpAddress }); - if (found) config.remove({ Host }) - if (foundIp) config.remove({ Host: remoteIpAddress }) + if (found) config.remove({ Host }); + if (foundIp) config.remove({ Host: remoteIpAddress }); config.append({ Host, @@ -543,15 +542,35 @@ export async function createRemoteEngineConfiguration(id: string) { } return await fs.writeFile(`${homedir}/.ssh/config`, sshConfig.stringify(config)); } -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, buildId?: string, applicationId?: string, debug?: boolean }): Promise> { - const { execa, execaCommand } = await import('execa') - const { parse } = await import('shell-quote') +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; + 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) { - let { remoteEngine, remoteIpAddress, engine } = await prisma.destinationDocker.findUnique({ where: { id: dockerId } }) + let { remoteEngine, remoteIpAddress, engine } = await prisma.destinationDocker.findUnique({ + where: { id: dockerId } + }); if (remoteEngine) { await createRemoteEngineConfiguration(dockerId); engine = `ssh://${remoteIpAddress}-remote`; @@ -591,7 +610,7 @@ export async function executeCommand({ command, dockerId = null, sshCommand = fa line: `${line.replace('\n', '')}`, buildId, applicationId - } + }; logs.push(log); if (debug) { await saveBuildLog(log); @@ -608,7 +627,7 @@ export async function executeCommand({ command, dockerId = null, sshCommand = fa line: `${line.replace('\n', '')}`, buildId, applicationId - } + }; logs.push(log); if (debug) { await saveBuildLog(log); @@ -628,7 +647,7 @@ export async function executeCommand({ command, dockerId = null, sshCommand = fa reject(code); } }); - }) + }); } else { if (shell) { return await execaCommand(command, { @@ -640,7 +659,6 @@ export async function executeCommand({ command, dockerId = null, sshCommand = fa }); } } - } else { if (shell) { return execaCommand(command, { shell: true }); @@ -650,8 +668,13 @@ export async function executeCommand({ command, dockerId = null, sshCommand = fa } 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 { 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) { @@ -768,9 +791,12 @@ export async function listSettings(): Promise { } export function generateToken() { - return jsonwebtoken.sign({ - nbf: Math.floor(Date.now() / 1000) - 30, - }, process.env['COOLIFY_SECRET_KEY']) + return jsonwebtoken.sign( + { + nbf: Math.floor(Date.now() / 1000) - 30 + }, + process.env['COOLIFY_SECRET_KEY'] + ); } export function generatePassword({ length = 24, @@ -790,109 +816,102 @@ export function generatePassword({ return password; } -type DatabaseConfiguration = { - volume: string; - image: string; - command?: string; - ulimits: Record; - privatePort: number; - environmentVariables: { - MYSQL_DATABASE: string; - MYSQL_PASSWORD: string; - MYSQL_ROOT_USER: string; - MYSQL_USER: string; - MYSQL_ROOT_PASSWORD: string; - }; -} +type DatabaseConfiguration = | { - volume: string; - image: string; - command?: string; - ulimits: Record; - privatePort: number; - environmentVariables: { - MONGO_INITDB_ROOT_USERNAME?: string; - MONGO_INITDB_ROOT_PASSWORD?: string; - MONGODB_ROOT_USER?: string; - MONGODB_ROOT_PASSWORD?: string; - }; - } + volume: string; + image: string; + command?: string; + ulimits: Record; + privatePort: number; + environmentVariables: { + MYSQL_DATABASE: string; + MYSQL_PASSWORD: string; + MYSQL_ROOT_USER: string; + MYSQL_USER: string; + MYSQL_ROOT_PASSWORD: string; + }; + } | { - volume: string; - image: string; - command?: string; - ulimits: Record; - privatePort: number; - environmentVariables: { - MARIADB_ROOT_USER: string; - MARIADB_ROOT_PASSWORD: string; - MARIADB_USER: string; - MARIADB_PASSWORD: string; - MARIADB_DATABASE: string; - }; - } + volume: string; + image: string; + command?: string; + ulimits: Record; + privatePort: number; + environmentVariables: { + MONGO_INITDB_ROOT_USERNAME?: string; + MONGO_INITDB_ROOT_PASSWORD?: string; + MONGODB_ROOT_USER?: string; + MONGODB_ROOT_PASSWORD?: string; + }; + } | { - volume: string; - image: string; - command?: string; - ulimits: Record; - privatePort: number; - environmentVariables: { - POSTGRES_PASSWORD?: string; - POSTGRES_USER?: string; - POSTGRES_DB?: string; - POSTGRESQL_POSTGRES_PASSWORD?: string; - POSTGRESQL_USERNAME?: string; - POSTGRESQL_PASSWORD?: string; - POSTGRESQL_DATABASE?: string; - }; - } + volume: string; + image: string; + command?: string; + ulimits: Record; + privatePort: number; + environmentVariables: { + MARIADB_ROOT_USER: string; + MARIADB_ROOT_PASSWORD: string; + MARIADB_USER: string; + MARIADB_PASSWORD: string; + MARIADB_DATABASE: string; + }; + } | { - volume: string; - image: string; - command?: string; - ulimits: Record; - privatePort: number; - environmentVariables: { - REDIS_AOF_ENABLED: string; - REDIS_PASSWORD: string; - }; - } + volume: string; + image: string; + command?: string; + ulimits: Record; + privatePort: number; + environmentVariables: { + POSTGRES_PASSWORD?: string; + POSTGRES_USER?: string; + POSTGRES_DB?: string; + POSTGRESQL_POSTGRES_PASSWORD?: string; + POSTGRESQL_USERNAME?: string; + POSTGRESQL_PASSWORD?: string; + POSTGRESQL_DATABASE?: string; + }; + } | { - volume: string; - image: string; - command?: string; - ulimits: Record; - privatePort: number; - environmentVariables: { - COUCHDB_PASSWORD: string; - COUCHDB_USER: string; - }; - } + volume: string; + image: string; + command?: string; + ulimits: Record; + privatePort: number; + environmentVariables: { + REDIS_AOF_ENABLED: string; + REDIS_PASSWORD: string; + }; + } | { - volume: string; - image: string; - command?: string; - ulimits: Record; - privatePort: number; - environmentVariables: { - EDGEDB_SERVER_PASSWORD: string; - EDGEDB_SERVER_USER: string; - EDGEDB_SERVER_DATABASE: string; - EDGEDB_SERVER_TLS_CERT_MODE: string; - }; - } + volume: string; + image: string; + command?: string; + ulimits: Record; + privatePort: number; + environmentVariables: { + COUCHDB_PASSWORD: string; + COUCHDB_USER: string; + }; + } + | { + volume: string; + image: string; + command?: string; + ulimits: Record; + privatePort: number; + environmentVariables: { + EDGEDB_SERVER_PASSWORD: string; + EDGEDB_SERVER_USER: string; + EDGEDB_SERVER_DATABASE: string; + EDGEDB_SERVER_TLS_CERT_MODE: string; + }; + }; export function generateDatabaseConfiguration(database: any, arch: string): DatabaseConfiguration { - const { - id, - dbUser, - dbUserPassword, - rootUser, - rootUserPassword, - defaultDatabase, - version, - type, - } = database; + const { id, dbUser, dbUserPassword, rootUser, rootUserPassword, defaultDatabase, version, type } = + database; const baseImage = getDatabaseImage(type, arch); if (type === 'mysql') { const configuration = { @@ -972,7 +991,9 @@ export function generateDatabaseConfiguration(database: any, arch: string): Data } return configuration; } else if (type === 'redis') { - const { settings: { appendOnly } } = database; + const { + settings: { appendOnly } + } = database; const configuration: DatabaseConfiguration = { privatePort: 6379, command: undefined, @@ -986,8 +1007,9 @@ export function generateDatabaseConfiguration(database: any, arch: string): Data }; if (isARM(arch)) { configuration.volume = `${id}-${type}-data:/data`; - configuration.command = `/usr/local/bin/redis-server --appendonly ${appendOnly ? 'yes' : 'no' - } --requirepass ${dbUserPassword}`; + configuration.command = `/usr/local/bin/redis-server --appendonly ${ + appendOnly ? 'yes' : 'no' + } --requirepass ${dbUserPassword}`; } return configuration; } else if (type === 'couchdb') { @@ -1004,7 +1026,7 @@ export function generateDatabaseConfiguration(database: any, arch: string): Data if (isARM(arch)) { configuration.volume = `${id}-${type}-data:/opt/couchdb/data`; } - return configuration + return configuration; } else if (type === 'edgedb') { const configuration: DatabaseConfiguration = { privatePort: 5656, @@ -1018,7 +1040,7 @@ export function generateDatabaseConfiguration(database: any, arch: string): Data volume: `${id}-${type}-data:/var/lib/edgedb/data`, ulimits: {} }; - return configuration + return configuration; } } export function isARM(arch: string) { @@ -1071,12 +1093,12 @@ export type ComposeFileService = { command?: string; ports?: string[]; build?: - | { - context: string; - dockerfile: string; - args?: Record; - } - | string; + | { + context: string; + dockerfile: string; + args?: Record; + } + | string; deploy?: { restart_policy?: { condition?: string; @@ -1141,13 +1163,13 @@ export const createDirectories = async ({ repository: string; buildId: string; }): Promise<{ workdir: string; repodir: string }> => { - if (repository) repository = repository.replaceAll(' ', '') + 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) { } + } catch (error) {} if (workdirFound) { await executeCommand({ command: `rm -fr ${workdir}` }); } @@ -1254,19 +1276,45 @@ export async function updatePasswordInDb(database, user, newPassword, isRoot) { } } } -export async function checkExposedPort({ id, configuredPort, exposePort, engine, remoteEngine, remoteIpAddress }: { id: string, configuredPort?: number, exposePort: number, engine: string, remoteEngine: boolean, remoteIpAddress?: string }) { +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); + 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); + const availablePort = await getFreeExposedPort( + id, + exposePort, + engine, + remoteEngine, + remoteIpAddress + ); if (availablePort.toString() !== exposePort.toString()) { throw { status: 500, message: `Port ${exposePort} is already in use.` }; } @@ -1277,25 +1325,33 @@ export async function getFreeExposedPort(id, exposePort, engine, remoteEngine, r if (remoteEngine) { const applicationUsed = await ( await prisma.application.findMany({ - where: { exposePort: { not: null }, id: { not: id }, destinationDocker: { remoteIpAddress } }, + 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 } }, + 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 + return false; } const found = await checkPort(exposePort, { host: remoteIpAddress }); if (!found) { - return exposePort + return exposePort; } - return false + return false; } else { const applicationUsed = await ( await prisma.application.findMany({ @@ -1311,13 +1367,13 @@ export async function getFreeExposedPort(id, exposePort, engine, remoteEngine, r ).map((a) => a.exposePort); const usedPorts = [...applicationUsed, ...serviceUsed]; if (usedPorts.includes(exposePort)) { - return false + return false; } const found = await checkPort(exposePort, { host: 'localhost' }); if (!found) { - return exposePort + return exposePort; } - return false + return false; } } export function generateRangeArray(start, end) { @@ -1330,38 +1386,54 @@ export async function getFreePublicPort({ id, remoteEngine, engine, remoteIpAddr if (remoteEngine) { const dbUsed = await ( await prisma.database.findMany({ - where: { publicPort: { not: null }, id: { not: id }, destinationDocker: { remoteIpAddress } }, + 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 } } }, + 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 } } }, + 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 } } }, + 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)) + 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 }) + const found = await isReachable(port, { host: remoteIpAddress }); if (!found) { - return port + return port; } } - return false + return false; } else { const dbUsed = await ( await prisma.database.findMany({ @@ -1371,32 +1443,44 @@ export async function getFreePublicPort({ id, remoteEngine, engine, remoteIpAddr ).map((a) => a.publicPort); const wpFtpUsed = await ( await prisma.wordpress.findMany({ - where: { ftpPublicPort: { not: null }, id: { not: id }, service: { destinationDocker: { engine } } }, + 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 } } }, + 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 } } }, + 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)) + 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' }) + const found = await isReachable(port, { host: 'localhost' }); if (!found) { - return port + return port; } } - return false + return false; } } @@ -1502,11 +1586,11 @@ export async function getServiceFromDB({ serviceSecret: true, serviceSetting: true, wordpress: true, - plausibleAnalytics: true, + plausibleAnalytics: true } }); if (!body) { - return null + return null; } // body.type = fixType(body.type); @@ -1523,7 +1607,6 @@ export async function getServiceFromDB({ return { ...body, settings }; } - export function fixType(type) { return type?.replaceAll(' ', '').toLowerCase() || null; } @@ -1610,7 +1693,7 @@ export async function stopBuild(buildId, applicationId) { } } count++; - } catch (error) { } + } catch (error) {} }, 100); }); } @@ -1640,16 +1723,22 @@ export async function cleanupDockerStorage(dockerId, lowDiskSpace, force) { images = images.trim(); if (images) { - await executeCommand({ dockerId, command: `docker rmi -f ${images}" -q | xargs -r`, shell: true }); + await executeCommand({ + dockerId, + command: `docker rmi -f ${images}" -q | xargs -r`, + shell: true + }); } - } catch (error) { } + } catch (error) {} if (lowDiskSpace || force) { // Cleanup images that are not used try { await executeCommand({ dockerId, command: `docker image prune -f` }); - } catch (error) { } + } catch (error) {} - const { numberOfDockerImagesKeptLocally } = await prisma.setting.findUnique({ where: { id: '0' } }) + const { numberOfDockerImagesKeptLocally } = await prisma.setting.findUnique({ + where: { id: '0' } + }); const { stdout: images } = await executeCommand({ dockerId, command: `docker images|grep -v ""|grep -v REPOSITORY|awk '{print $1, $2}'`, @@ -1657,18 +1746,17 @@ export async function cleanupDockerStorage(dockerId, lowDiskSpace, force) { }); const imagesArray = images.trim().replaceAll(' ', ':').split('\n'); const imagesSet = new Set(imagesArray.map((image) => image.split(':')[0])); - let deleteImage = [] + let deleteImage = []; for (const image of imagesSet) { - let keepImage = [] + let keepImage = []; for (const image2 of imagesArray) { if (image2.startsWith(image)) { if (keepImage.length >= numberOfDockerImagesKeptLocally) { - deleteImage.push(image2) + deleteImage.push(image2); } else { - keepImage.push(image2) + keepImage.push(image2); } } - } } for (const image of deleteImage) { @@ -1681,12 +1769,12 @@ export async function cleanupDockerStorage(dockerId, lowDiskSpace, force) { dockerId, command: `docker container prune -f --filter "label=coolify.managed=true"` }); - } catch (error) { } + } catch (error) {} // Cleanup build caches try { await executeCommand({ dockerId, command: `docker builder prune -a -f` }); - } catch (error) { } + } catch (error) {} } } @@ -1768,16 +1856,22 @@ export function decryptApplication(application: any) { } } -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}` +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 - }) -} \ No newline at end of file + }); +} diff --git a/package.json b/package.json index e30a76a54..031c36f0e 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "coolify", "description": "An open-source & self-hostable Heroku / Netlify alternative.", - "version": "3.12.0", + "version": "3.12.1", "license": "Apache-2.0", "repository": "github:coollabsio/coolify", "scripts": { From fe3c0cf76ef6b65a7b6a4935ad569e8d7490fe1b Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Tue, 13 Dec 2022 09:17:33 +0100 Subject: [PATCH 09/72] fix: appwrite tmp volume --- apps/api/devTemplates.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/api/devTemplates.yaml b/apps/api/devTemplates.yaml index 975b7b397..68e10d1e9 100644 --- a/apps/api/devTemplates.yaml +++ b/apps/api/devTemplates.yaml @@ -1,5 +1,5 @@ - templateVersion: 1.0.0 - defaultVersion: '0.8.0' + defaultVersion: "0.8.0" documentation: https://pocketbase.io/docs/ type: pocketbase name: Pocketbase @@ -646,6 +646,7 @@ - "$$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 From 5df1deecbca5f54c930fe1dd825bfc19db7fa285 Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Tue, 13 Dec 2022 09:34:42 +0100 Subject: [PATCH 10/72] update templates and tags --- apps/api/devTags.json | 2 +- apps/api/devTemplates.yaml | 38 +++++++++++++++++++------------------- apps/api/tags.json | 2 +- apps/api/templates.json | 2 +- 4 files changed, 22 insertions(+), 22 deletions(-) diff --git a/apps/api/devTags.json b/apps/api/devTags.json index 0d84f6caa..bc5273fc0 100644 --- a/apps/api/devTags.json +++ b/apps/api/devTags.json @@ -1 +1 @@ -[{"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 +[{"name":"appsmith","image":"appsmith/appsmith-ce","tags":["v1.8.9","v1.8.7","v1.8.5","v1.8.3","v1.8.12","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"]},{"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.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.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","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.25.3","5.25.2","5.25.1","5.25.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"]},{"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.25.3","5.25.2","5.25.1","5.25.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"]},{"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":["v3.0.0","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"]},{"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.16.0","v2.15.2","v2.14.1","v2.13.2","v2.12.1","v2.11.3","v2.10.2","v2.1.1","v2.1.0","v2.0.9","v2.0.8"]},{"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.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","v0.14.1","v0.14.0","v0.12.0","v0.11.0"]},{"name":"minio","image":"minio/minio","tags":["RELEASE.2022-12-12T19-27-27Z.fips","RELEASE.2022-12-07T00-56-37Z.fips","RELEASE.2022-12-02T19-19-22Z.fips","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"]},{"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.1","0.98.4","0.98.2","0.98.0","0.96.4","0.96.2","0.96.0","0.92.3","0.91.9","0.91.7","0.91.10","0.91.0","0.90.7","0.90.4","0.90.2","0.90.10","0.90.0","0.9.8","0.9.6","0.9.42","0.9.40","0.9.38","0.9.36","0.9.34","0.9.32","0.9.30","0.9.28","0.9.26","0.9.24","0.9.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"]},{"name":"searxng","image":"searxng/searxng","tags":["2022.12.12-966e9c3c","2022.12.09-abb33bd7","2022.12.09-a6d870d5","2022.12.09-6479b67c","2022.12.09-3df1a983","2022.12.09-0b1f09fa","2022.12.05-67eea86b","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"]},{"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.9","0.45.7","0.45.5","0.45.3","0.45.10","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.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.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.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-12-c0db193a3baacd107c5f2c28c6e0af89c3d5afa3","edge-2022-12-09-647d40c67cf405870ba71a01584a42cfaec5915f","edge-2022-12-09-5f92b1c3243ef445a9b5929eda8bd0307584f36c","edge-2022-12-08-d1801c18970ee45fcd6c5a691d79613110537152","edge-2022-12-08-c66eb8190d1e55fe6e53d3fa87f101c189c635d4","edge-2022-12-07-6b4c53cba19003d5cf15dcbaa8edb8304fb1ae6c","edge-2022-12-06-f7644c880ee17e917d5fb72497aa5b75ecca7dd2","edge-2022-12-05-d3bf38faf4599fe6c7c86c20f33f4dd7a98de645","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"]},{"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/api/devTemplates.yaml b/apps/api/devTemplates.yaml index 68e10d1e9..80ec2f699 100644 --- a/apps/api/devTemplates.yaml +++ b/apps/api/devTemplates.yaml @@ -12,7 +12,7 @@ ports: - "8080" - templateVersion: 1.0.0 - defaultVersion: 1.5.0-rc.0 + defaultVersion: v1.5.1 documentation: https://plausible.io/doc/ type: plausibleanalytics-arm name: Plausible Analytics (ARM) @@ -313,7 +313,7 @@ defaultValue: keycloak description: "" - templateVersion: 1.0.0 - defaultVersion: v3.6 + defaultVersion: v3.7 documentation: https://github.com/freyacodes/Lavalink description: Standalone audio sending node based on Lavaplayer. type: lavalink @@ -375,7 +375,7 @@ defaultValue: $$generate_password required: true - templateVersion: 1.0.0 - defaultVersion: v1.8.6 + defaultVersion: v1.8.9 documentation: https://docs.appsmith.com/getting-started/setup/instance-configuration/ type: appsmith name: Appsmith @@ -408,7 +408,7 @@ defaultValue: "true" description: "" - templateVersion: 1.0.0 - defaultVersion: 0.56.2 + 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: @@ -428,7 +428,7 @@ - "8080" variables: [] - templateVersion: 1.0.0 - defaultVersion: 1.9.2 + defaultVersion: 1.18.5 documentation: https://hub.docker.com/r/louislam/uptime-kuma description: A free & fancy self-hosted monitoring tool. labels: @@ -478,7 +478,7 @@ - "80" variables: [] - templateVersion: 1.0.0 - defaultVersion: 9.2.3 + defaultVersion: 9.3.1 documentation: https://hub.docker.com/r/grafana/grafana type: grafana name: Grafana @@ -499,7 +499,7 @@ - "3000" variables: [] - templateVersion: 1.0.0 - defaultVersion: 1.0.3 + defaultVersion: 1.1.2 documentation: https://appwrite.io/docs type: appwrite name: Appwrite @@ -1669,7 +1669,7 @@ defaultValue: weblate description: "" - templateVersion: 1.0.0 - defaultVersion: 2022.10.14-1a5b0965 + defaultVersion: 2022.12.12-966e9c3c documentation: https://docs.searxng.org/ type: searxng name: SearXNG @@ -1742,7 +1742,7 @@ defaultValue: $$generate_password description: "" - templateVersion: 1.0.0 - defaultVersion: v2.0.6 + defaultVersion: v3.0.0 documentation: https://glitchtip.com/documentation type: glitchtip name: GlitchTip @@ -1964,7 +1964,7 @@ defaultValue: glitchtip description: "" - templateVersion: 1.0.0 - defaultVersion: v2.13.0 + defaultVersion: v2.16.0 documentation: https://hasura.io/docs/latest/index/ type: hasura name: Hasura @@ -2031,7 +2031,7 @@ defaultValue: hasura description: "" - templateVersion: 1.0.0 - defaultVersion: postgresql-v1.38.0 + defaultVersion: postgresql-v1.39.5 documentation: https://umami.is/docs/getting-started type: umami-postgresql name: Umami @@ -2238,7 +2238,7 @@ showOnConfiguration: true - templateVersion: 1.0.0 ignore: true - defaultVersion: postgresql-v1.38.0 + defaultVersion: postgresql-v1.39.5 documentation: https://umami.is/docs/getting-started type: umami name: Umami @@ -2444,7 +2444,7 @@ description: "" showOnConfiguration: true - templateVersion: 1.0.0 - defaultVersion: v0.29.1 + defaultVersion: v0.30.1 documentation: https://docs.meilisearch.com/learn/getting_started/quick_start.html type: meilisearch name: MeiliSearch @@ -2592,7 +2592,7 @@ defaultValue: $$generate_password description: "" - templateVersion: 1.0.0 - defaultVersion: "5.22" + defaultVersion: "5.25.3" documentation: https://docs.ghost.org type: ghost-only name: Ghost @@ -2656,7 +2656,7 @@ placeholder: "ghost_db" required: true - templateVersion: 1.0.0 - defaultVersion: "5.22" + defaultVersion: "5.25.3" documentation: https://docs.ghost.org type: ghost-mysql name: Ghost @@ -2897,7 +2897,7 @@ define('WP_DEBUG_DISPLAY', false); @ini_set('display_errors', 0); - templateVersion: 1.0.0 - defaultVersion: 4.7.1 + defaultVersion: 4.9.0 documentation: https://coder.com/docs/coder-oss/latest type: vscodeserver name: VSCode Server @@ -2928,7 +2928,7 @@ description: "" showOnConfiguration: true - templateVersion: 1.0.0 - defaultVersion: RELEASE.2022-10-15T19-57-03Z + defaultVersion: RELEASE.2022-12-12T19-27-27Z documentation: https://min.io/docs/minio type: minio name: MinIO @@ -3106,7 +3106,7 @@ defaultValue: $$generate_username description: "" - templateVersion: 1.0.0 - defaultVersion: 0.198.1 + defaultVersion: 0.207.0 documentation: https://docs.n8n.io type: n8n name: n8n.io @@ -3283,7 +3283,7 @@ defaultValue: plausible.js description: This is the default script name. - templateVersion: 1.0.0 - defaultVersion: 0.98.1 + defaultVersion: 0.99.1 documentation: https://docs.nocodb.com type: nocodb name: NocoDB diff --git a/apps/api/tags.json b/apps/api/tags.json index 0d84f6caa..bc5273fc0 100644 --- a/apps/api/tags.json +++ b/apps/api/tags.json @@ -1 +1 @@ -[{"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 +[{"name":"appsmith","image":"appsmith/appsmith-ce","tags":["v1.8.9","v1.8.7","v1.8.5","v1.8.3","v1.8.12","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"]},{"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.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.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","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.25.3","5.25.2","5.25.1","5.25.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"]},{"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.25.3","5.25.2","5.25.1","5.25.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"]},{"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":["v3.0.0","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"]},{"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.16.0","v2.15.2","v2.14.1","v2.13.2","v2.12.1","v2.11.3","v2.10.2","v2.1.1","v2.1.0","v2.0.9","v2.0.8"]},{"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.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","v0.14.1","v0.14.0","v0.12.0","v0.11.0"]},{"name":"minio","image":"minio/minio","tags":["RELEASE.2022-12-12T19-27-27Z.fips","RELEASE.2022-12-07T00-56-37Z.fips","RELEASE.2022-12-02T19-19-22Z.fips","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"]},{"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.1","0.98.4","0.98.2","0.98.0","0.96.4","0.96.2","0.96.0","0.92.3","0.91.9","0.91.7","0.91.10","0.91.0","0.90.7","0.90.4","0.90.2","0.90.10","0.90.0","0.9.8","0.9.6","0.9.42","0.9.40","0.9.38","0.9.36","0.9.34","0.9.32","0.9.30","0.9.28","0.9.26","0.9.24","0.9.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"]},{"name":"searxng","image":"searxng/searxng","tags":["2022.12.12-966e9c3c","2022.12.09-abb33bd7","2022.12.09-a6d870d5","2022.12.09-6479b67c","2022.12.09-3df1a983","2022.12.09-0b1f09fa","2022.12.05-67eea86b","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"]},{"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.9","0.45.7","0.45.5","0.45.3","0.45.10","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.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.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.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-12-c0db193a3baacd107c5f2c28c6e0af89c3d5afa3","edge-2022-12-09-647d40c67cf405870ba71a01584a42cfaec5915f","edge-2022-12-09-5f92b1c3243ef445a9b5929eda8bd0307584f36c","edge-2022-12-08-d1801c18970ee45fcd6c5a691d79613110537152","edge-2022-12-08-c66eb8190d1e55fe6e53d3fa87f101c189c635d4","edge-2022-12-07-6b4c53cba19003d5cf15dcbaa8edb8304fb1ae6c","edge-2022-12-06-f7644c880ee17e917d5fb72497aa5b75ecca7dd2","edge-2022-12-05-d3bf38faf4599fe6c7c86c20f33f4dd7a98de645","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"]},{"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/api/templates.json b/apps/api/templates.json index 256cca609..3e57912eb 100644 --- a/apps/api/templates.json +++ b/apps/api/templates.json @@ -1 +1 @@ -[{"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":"warningtrue"},{"location":"/etc/clickhouse-server/config.d/logging.xml","content":"00"},{"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":"warningtrue"},{"location":"/etc/clickhouse-server/config.d/logging.xml","content":"00"},{"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 +[{"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":"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":"warningtrue"},{"location":"/etc/clickhouse-server/config.d/logging.xml","content":"00"},{"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.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":["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.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":"warningtrue"},{"location":"/etc/clickhouse-server/config.d/logging.xml","content":"00"},{"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.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 From 1180d3fddeef7a0684129246b983c5ef37611e7a Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Tue, 13 Dec 2022 12:47:14 +0100 Subject: [PATCH 11/72] wip: trpc --- .dockerignore | 1 - apps/api/templates.json | 2 +- apps/client/src/lib/store.ts | 25 ++ apps/client/src/routes/+layout.svelte | 15 +- apps/client/src/routes/+layout.ts | 12 +- .../routes/applications/[id]/+layout.svelte | 113 +++++ .../src/routes/applications/[id]/+layout.ts | 55 +++ .../src/routes/applications/[id]/+page.svelte | 0 .../[id]/_components/Buttons/Delete.svelte | 29 ++ .../[id]/_components/Buttons/Deploy.svelte | 31 ++ .../_components/Buttons/ForceDeploy.svelte | 34 ++ .../[id]/_components/Buttons/Loading.svelte | 21 + .../[id]/_components/Buttons/Restart.svelte | 30 ++ .../[id]/_components/Buttons/Stop.svelte | 37 ++ .../[id]/_components/Buttons/index.ts | 6 + .../applications/[id]/_components/Menu.svelte | 321 ++++++++++++++ .../[id]/_components/States/Degraded.svelte | 26 ++ .../[id]/_components/States/Healthy.svelte | 11 + .../src/routes/applications/[id]/utils.ts | 7 + apps/server/package.json | 4 +- apps/server/src/lib/common.ts | 49 +++ apps/server/src/lib/docker.ts | 33 ++ apps/server/src/lib/executeCommand.ts | 23 +- apps/server/src/prisma.ts | 2 +- .../src/trpc/routers/applications/index.ts | 391 ++++++++++++++++++ .../{applications.ts => applications/lib.ts} | 226 ++++------ apps/server/src/trpc/trpc.ts | 4 +- pnpm-lock.yaml | 8 + 28 files changed, 1341 insertions(+), 175 deletions(-) create mode 100644 apps/client/src/routes/applications/[id]/+layout.svelte create mode 100644 apps/client/src/routes/applications/[id]/+layout.ts create mode 100644 apps/client/src/routes/applications/[id]/+page.svelte create mode 100644 apps/client/src/routes/applications/[id]/_components/Buttons/Delete.svelte create mode 100644 apps/client/src/routes/applications/[id]/_components/Buttons/Deploy.svelte create mode 100644 apps/client/src/routes/applications/[id]/_components/Buttons/ForceDeploy.svelte create mode 100644 apps/client/src/routes/applications/[id]/_components/Buttons/Loading.svelte create mode 100644 apps/client/src/routes/applications/[id]/_components/Buttons/Restart.svelte create mode 100644 apps/client/src/routes/applications/[id]/_components/Buttons/Stop.svelte create mode 100644 apps/client/src/routes/applications/[id]/_components/Buttons/index.ts create mode 100644 apps/client/src/routes/applications/[id]/_components/Menu.svelte create mode 100644 apps/client/src/routes/applications/[id]/_components/States/Degraded.svelte create mode 100644 apps/client/src/routes/applications/[id]/_components/States/Healthy.svelte create mode 100644 apps/client/src/routes/applications/[id]/utils.ts create mode 100644 apps/server/src/trpc/routers/applications/index.ts rename apps/server/src/trpc/routers/{applications.ts => applications/lib.ts} (64%) diff --git a/.dockerignore b/.dockerignore index 66ff0bf1f..1b0bcf1c2 100644 --- a/.dockerignore +++ b/.dockerignore @@ -8,7 +8,6 @@ package .env.* !.env.example dist -client apps/api/db/*.db local-serve apps/api/db/migration.db-journal diff --git a/apps/api/templates.json b/apps/api/templates.json index ae39bfaa3..8c3230bf4 100644 --- a/apps/api/templates.json +++ b/apps/api/templates.json @@ -1 +1 @@ -[{"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":"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":"warningtrue"},{"location":"/etc/clickhouse-server/config.d/logging.xml","content":"00"},{"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.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":["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.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":"warningtrue"},{"location":"/etc/clickhouse-server/config.d/logging.xml","content":"00"},{"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.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)."}]}] +[{"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":"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":"warningtrue"},{"location":"/etc/clickhouse-server/config.d/logging.xml","content":"00"},{"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.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":["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.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":"warningtrue"},{"location":"/etc/clickhouse-server/config.d/logging.xml","content":"00"},{"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.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/client/src/lib/store.ts b/apps/client/src/lib/store.ts index 0b08d624e..c6dbde873 100644 --- a/apps/client/src/lib/store.ts +++ b/apps/client/src/lib/store.ts @@ -114,3 +114,28 @@ export const isUpdateAvailable: Writable = writable(false); export const latestVersion: Writable = writable('latest'); export const loginEmail: Writable = writable(); export const search: any = writable(''); + +export const isDeploymentEnabled: Writable = writable(false); +export const status: Writable = 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 + } +}); diff --git a/apps/client/src/routes/+layout.svelte b/apps/client/src/routes/+layout.svelte index d219cd63a..9ad3451da 100644 --- a/apps/client/src/routes/+layout.svelte +++ b/apps/client/src/routes/+layout.svelte @@ -1,6 +1,6 @@ + +

    + +
    + {#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 !$page.url.pathname.startsWith(`/applications/${id}/configuration/`)} + + {/if} +
    + +
    +
    diff --git a/apps/client/src/routes/applications/[id]/+layout.ts b/apps/client/src/routes/applications/[id]/+layout.ts new file mode 100644 index 000000000..3f2176a38 --- /dev/null +++ b/apps/client/src/routes/applications/[id]/+layout.ts @@ -0,0 +1,55 @@ +import { error } from '@sveltejs/kit'; +import { t } 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 t.applications.getApplicationById.query({ id }); + if (!application) { + throw redirect(307, '/applications'); + } + const configurationPhase = checkConfiguration(application); + // 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/client/src/routes/applications/[id]/+page.svelte b/apps/client/src/routes/applications/[id]/+page.svelte new file mode 100644 index 000000000..e69de29bb diff --git a/apps/client/src/routes/applications/[id]/_components/Buttons/Delete.svelte b/apps/client/src/routes/applications/[id]/_components/Buttons/Delete.svelte new file mode 100644 index 000000000..9763c0058 --- /dev/null +++ b/apps/client/src/routes/applications/[id]/_components/Buttons/Delete.svelte @@ -0,0 +1,29 @@ + + + diff --git a/apps/client/src/routes/applications/[id]/_components/Buttons/Deploy.svelte b/apps/client/src/routes/applications/[id]/_components/Buttons/Deploy.svelte new file mode 100644 index 000000000..728ec47e7 --- /dev/null +++ b/apps/client/src/routes/applications/[id]/_components/Buttons/Deploy.svelte @@ -0,0 +1,31 @@ + + + diff --git a/apps/client/src/routes/applications/[id]/_components/Buttons/ForceDeploy.svelte b/apps/client/src/routes/applications/[id]/_components/Buttons/ForceDeploy.svelte new file mode 100644 index 000000000..52ebe94ca --- /dev/null +++ b/apps/client/src/routes/applications/[id]/_components/Buttons/ForceDeploy.svelte @@ -0,0 +1,34 @@ + + + diff --git a/apps/client/src/routes/applications/[id]/_components/Buttons/Loading.svelte b/apps/client/src/routes/applications/[id]/_components/Buttons/Loading.svelte new file mode 100644 index 000000000..30336d843 --- /dev/null +++ b/apps/client/src/routes/applications/[id]/_components/Buttons/Loading.svelte @@ -0,0 +1,21 @@ + diff --git a/apps/client/src/routes/applications/[id]/_components/Buttons/Restart.svelte b/apps/client/src/routes/applications/[id]/_components/Buttons/Restart.svelte new file mode 100644 index 000000000..c2f583634 --- /dev/null +++ b/apps/client/src/routes/applications/[id]/_components/Buttons/Restart.svelte @@ -0,0 +1,30 @@ + + + diff --git a/apps/client/src/routes/applications/[id]/_components/Buttons/Stop.svelte b/apps/client/src/routes/applications/[id]/_components/Buttons/Stop.svelte new file mode 100644 index 000000000..777665141 --- /dev/null +++ b/apps/client/src/routes/applications/[id]/_components/Buttons/Stop.svelte @@ -0,0 +1,37 @@ + + + diff --git a/apps/client/src/routes/applications/[id]/_components/Buttons/index.ts b/apps/client/src/routes/applications/[id]/_components/Buttons/index.ts new file mode 100644 index 000000000..8e6e8a7f0 --- /dev/null +++ b/apps/client/src/routes/applications/[id]/_components/Buttons/index.ts @@ -0,0 +1,6 @@ +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/client/src/routes/applications/[id]/_components/Menu.svelte b/apps/client/src/routes/applications/[id]/_components/Menu.svelte new file mode 100644 index 000000000..0403e8aad --- /dev/null +++ b/apps/client/src/routes/applications/[id]/_components/Menu.svelte @@ -0,0 +1,321 @@ + + + diff --git a/apps/client/src/routes/applications/[id]/_components/States/Degraded.svelte b/apps/client/src/routes/applications/[id]/_components/States/Degraded.svelte new file mode 100644 index 000000000..6f0a1ff06 --- /dev/null +++ b/apps/client/src/routes/applications/[id]/_components/States/Degraded.svelte @@ -0,0 +1,26 @@ + + + + + + + + + + Application Error (check logs) + + diff --git a/apps/client/src/routes/applications/[id]/_components/States/Healthy.svelte b/apps/client/src/routes/applications/[id]/_components/States/Healthy.svelte new file mode 100644 index 000000000..3b1cf1cf1 --- /dev/null +++ b/apps/client/src/routes/applications/[id]/_components/States/Healthy.svelte @@ -0,0 +1,11 @@ + + +{#if !isComposeBuildPack} + +{/if} + + diff --git a/apps/client/src/routes/applications/[id]/utils.ts b/apps/client/src/routes/applications/[id]/utils.ts new file mode 100644 index 000000000..5bff428b0 --- /dev/null +++ b/apps/client/src/routes/applications/[id]/utils.ts @@ -0,0 +1,7 @@ +import { goto } from '$app/navigation'; +import { errorNotification } from '$lib/common'; +import { t } from '$lib/store'; + +export async function saveForm() { + return await t.applications.save.mutate(); +} diff --git a/apps/server/package.json b/apps/server/package.json index 2ae9cbb50..e7f2e15c2 100644 --- a/apps/server/package.json +++ b/apps/server/package.json @@ -35,6 +35,7 @@ "fastify-plugin": "4.4.0", "got": "^12.5.3", "is-port-reachable": "4.0.0", + "js-yaml": "4.1.0", "jsonwebtoken": "8.5.1", "node-fetch": "3.3.0", "prisma": "4.6.1", @@ -47,11 +48,12 @@ "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/bcryptjs": "^2.4.2", "@types/ws": "8.5.3", "npm-run-all": "4.1.5", "rimraf": "3.0.2", diff --git a/apps/server/src/lib/common.ts b/apps/server/src/lib/common.ts index f6eb14199..bebbf6a49 100644 --- a/apps/server/src/lib/common.ts +++ b/apps/server/src/lib/common.ts @@ -7,6 +7,7 @@ import { uniqueNamesGenerator, adjectives, colors, animals } from 'unique-names- import type { Config } from 'unique-names-generator'; import { env } from '../env'; import { day } from './dayjs'; +import { executeCommand } from './executeCommand'; const customConfig: Config = { dictionaries: [adjectives, colors, animals], @@ -132,3 +133,51 @@ export async function removeService({ id }: { id: string }): Promise { 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; +} diff --git a/apps/server/src/lib/docker.ts b/apps/server/src/lib/docker.ts index 85eb78e30..0f02da0e2 100644 --- a/apps/server/src/lib/docker.ts +++ b/apps/server/src/lib/docker.ts @@ -122,3 +122,36 @@ export async function stopTcpHttpProxy( 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/server/src/lib/executeCommand.ts b/apps/server/src/lib/executeCommand.ts index 8a3bf4afa..31119be08 100644 --- a/apps/server/src/lib/executeCommand.ts +++ b/apps/server/src/lib/executeCommand.ts @@ -23,7 +23,7 @@ export async function executeCommand({ sshCommand?: boolean; shell?: boolean; stream?: boolean; - dockerId?: string; + dockerId?: string | null; buildId?: string; applicationId?: string; debug?: boolean; @@ -31,8 +31,8 @@ export async function executeCommand({ const { execa, execaCommand } = await import('execa'); const { parse } = await import('shell-quote'); const parsedCommand = parse(command); - const dockerCommand = parsedCommand[0]?.toString(); - const dockerArgs = parsedCommand.slice(1).toString(); + const dockerCommand = parsedCommand[0]; + const dockerArgs = parsedCommand.slice(1); if (dockerId && dockerCommand && dockerArgs) { const destinationDocker = await prisma.destinationDocker.findUnique({ @@ -41,14 +41,12 @@ export async function executeCommand({ if (!destinationDocker) { throw new Error('Destination docker not found'); } - let { - remoteEngine, - remoteIpAddress, - engine = 'unix:///var/run/docker.sock' - } = destinationDocker; + 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) { @@ -60,16 +58,19 @@ export async function executeCommand({ 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 } }); @@ -112,7 +113,8 @@ export async function executeCommand({ }); subprocess.on('exit', async (code: number) => { if (code === 0) { - resolve('success'); + //@ts-ignore + resolve(code); } else { if (!debug) { for (const log of logs) { @@ -127,9 +129,11 @@ export async function executeCommand({ } 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 } }); @@ -139,6 +143,7 @@ export async function executeCommand({ if (shell) { return execaCommand(command, { shell: true }); } + //@ts-ignore return await execa(dockerCommand, dockerArgs); } } diff --git a/apps/server/src/prisma.ts b/apps/server/src/prisma.ts index 7c818b869..6aa0585c4 100644 --- a/apps/server/src/prisma.ts +++ b/apps/server/src/prisma.ts @@ -12,7 +12,7 @@ const prismaGlobal = global as typeof global & { export const prisma: PrismaClient = prismaGlobal.prisma || new PrismaClient({ - log: env.NODE_ENV === 'development' ? ['query', 'error', 'warn'] : ['error'] + log: env.NODE_ENV !== 'development' ? ['query', 'error', 'warn'] : ['error'] }); if (env.NODE_ENV !== 'production') { diff --git a/apps/server/src/trpc/routers/applications/index.ts b/apps/server/src/trpc/routers/applications/index.ts new file mode 100644 index 000000000..8ebf42869 --- /dev/null +++ b/apps/server/src/trpc/routers/applications/index.ts @@ -0,0 +1,391 @@ +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 } from './lib'; +import cuid from 'cuid'; +import { createDirectories, saveDockerRegistryCredentials } from '../../../lib/common'; + +export const applicationsRouter = router({ + 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() + }) + ) + .mutation(async ({ ctx, input }) => { + const { id } = input; + const teamId = ctx.user?.teamId; + + // const buildId = await deployApplication(id, teamId); + return { + // buildId + }; + }), + 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 || + !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.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() })).mutation(async ({ ctx, input }) => { + const { id } = 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}`]; + + if (secrets.length > 0) { + secrets.forEach((secret) => { + if (pullmergeRequestId) { + const isSecretFound = secrets.filter((s) => s.name === secret.name && s.isPRMRSecret); + if (isSecretFound.length > 0) { + envs.push(`${secret.name}=${isSecretFound[0].value}`); + } else { + envs.push(`${secret.name}=${secret.value}`); + } + } else { + if (!secret.isPRMRSecret) { + envs.push(`${secret.name}=${secret.value}`); + } + } + }); + } + const { workdir } = await createDirectories({ repository, buildId }); + + 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} up -d` + }); + } + return {}; + }), + deploy: 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); + 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 } }); + 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/server/src/trpc/routers/applications.ts b/apps/server/src/trpc/routers/applications/lib.ts similarity index 64% rename from apps/server/src/trpc/routers/applications.ts rename to apps/server/src/trpc/routers/applications/lib.ts index 3277b43cc..dfedc1bc1 100644 --- a/apps/server/src/trpc/routers/applications.ts +++ b/apps/server/src/trpc/routers/applications/lib.ts @@ -1,157 +1,85 @@ -import { z } from 'zod'; -import { privateProcedure, router } from '../trpc'; -import { decrypt, isARM } from '../../lib/common'; -import { prisma } from '../../prisma'; -import { executeCommand } from '../../lib/executeCommand'; -import { checkContainer, removeContainer } from '../../lib/docker'; +import cuid from 'cuid'; +import crypto from 'node:crypto'; +import { decrypt, isARM } from '../../../lib/common'; -export const applicationsRouter = router({ - 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.' }; +import { prisma } from '../../../prisma'; + +export async function deployApplication( + id: string, + teamId: string, + forceRebuild: boolean = false +): 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 + ); } - 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 - } - }); - } + await prisma.application.update({ where: { id }, data: { updatedAt: new Date() } }); + if (application.gitSourceId) { + await prisma.build.create({ + data: { + id: buildId, + applicationId: id, + branch: application.branch, + forceRebuild, + destinationDockerId: application.destinationDocker?.id, + gitSourceId: application.gitSource?.id, + githubAppId: application.gitSource?.githubApp?.id, + gitlabAppId: application.gitSource?.gitlabApp?.id, + status: 'queued', + type: 'manual' } - } 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 || - !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.applicationPersistentStorage.deleteMany({ - where: { applicationId: application.id } - }); - await prisma.applicationConnectedDatabase.deleteMany({ - where: { applicationId: application.id } - }); - await prisma.application.deleteMany({ where: { id: application.id } }); - } - } - return {}; - }), - 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 }); - } + } else { + await prisma.build.create({ + data: { + id: buildId, + applicationId: id, + branch: 'latest', + forceRebuild, + destinationDockerId: application.destinationDocker?.id, + status: 'queued', + type: 'manual' } - } - 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 } }); - if (teamId === '0') { - await prisma.application.deleteMany({ where: { id } }); - } else { - await prisma.application.deleteMany({ where: { id, teams: { some: { id: teamId } } } }); - } - return {}; - }) -}); - + }); + } + 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 } } }, diff --git a/apps/server/src/trpc/trpc.ts b/apps/server/src/trpc/trpc.ts index 503bd522e..79c7c5781 100644 --- a/apps/server/src/trpc/trpc.ts +++ b/apps/server/src/trpc/trpc.ts @@ -29,5 +29,5 @@ const isAdmin = t.middleware(async ({ ctx, next }) => { }); }); export const router = t.router; -export const privateProcedure = t.procedure.use(isAdmin).use(logger); -export const publicProcedure = t.procedure.use(logger); +export const privateProcedure = t.procedure.use(isAdmin); +export const publicProcedure = t.procedure; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a62d53050..c1d1ffa5d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -240,6 +240,7 @@ importers: '@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 @@ -255,6 +256,7 @@ importers: fastify-plugin: 4.4.0 got: ^12.5.3 is-port-reachable: 4.0.0 + js-yaml: 4.1.0 jsonwebtoken: 8.5.1 node-fetch: 3.3.0 npm-run-all: 4.1.5 @@ -291,6 +293,7 @@ importers: fastify-plugin: 4.4.0 got: 12.5.3 is-port-reachable: 4.0.0 + js-yaml: 4.1.0 jsonwebtoken: 8.5.1 node-fetch: 3.3.0 prisma: 4.6.1 @@ -303,6 +306,7 @@ importers: 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 @@ -2069,6 +2073,10 @@ 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 From abc614ecfd0d22c6d0f50fce6250ec7c165504f7 Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Tue, 13 Dec 2022 12:54:57 +0100 Subject: [PATCH 12/72] wip: trpc --- apps/client/src/lib/store.ts | 2 +- apps/client/src/routes/+layout.svelte | 2 +- apps/client/src/routes/+layout.ts | 6 +++--- apps/client/src/routes/+page.svelte | 21 +++++++++---------- apps/client/src/routes/+page.ts | 4 ++-- .../routes/applications/[id]/+layout.svelte | 17 +++++++-------- .../src/routes/applications/[id]/+layout.ts | 4 ++-- .../[id]/_components/Buttons/Delete.svelte | 4 ++-- .../[id]/_components/Buttons/Deploy.svelte | 4 ++-- .../_components/Buttons/ForceDeploy.svelte | 4 ++-- .../[id]/_components/Buttons/Restart.svelte | 6 +++--- .../[id]/_components/Buttons/Stop.svelte | 6 +++--- .../src/routes/applications/[id]/utils.ts | 4 ++-- apps/client/src/routes/login/+page.svelte | 4 ++-- apps/client/src/routes/register/+page.svelte | 4 ++-- 15 files changed, 44 insertions(+), 48 deletions(-) diff --git a/apps/client/src/lib/store.ts b/apps/client/src/lib/store.ts index c6dbde873..8e3687dca 100644 --- a/apps/client/src/lib/store.ts +++ b/apps/client/src/lib/store.ts @@ -8,7 +8,7 @@ import cuid from 'cuid'; export const serverBaseUrl = dev ? `http://${browser && window.location.hostname}:2022` : ''; export let token: string = Cookies.get('token') || ''; -export const t = createTRPCProxyClient({ +export const trpc = createTRPCProxyClient({ transformer: superjson, links: [ httpBatchLink({ diff --git a/apps/client/src/routes/+layout.svelte b/apps/client/src/routes/+layout.svelte index 9ad3451da..cd5ab4cd1 100644 --- a/apps/client/src/routes/+layout.svelte +++ b/apps/client/src/routes/+layout.svelte @@ -1,7 +1,7 @@ + + + diff --git a/apps/client/src/lib/components/svg/sources/GitlabIcon.svelte b/apps/client/src/lib/components/svg/sources/GitlabIcon.svelte index 3e8c8a84c..7ddfa21c1 100644 --- a/apps/client/src/lib/components/svg/sources/GitlabIcon.svelte +++ b/apps/client/src/lib/components/svg/sources/GitlabIcon.svelte @@ -1,21 +1,25 @@ - - + + + + diff --git a/apps/client/src/routes/applications/[id]/+layout.svelte b/apps/client/src/routes/applications/[id]/+layout.svelte index 7d06d091d..89e214266 100644 --- a/apps/client/src/routes/applications/[id]/+layout.svelte +++ b/apps/client/src/routes/applications/[id]/+layout.svelte @@ -4,8 +4,8 @@ import { onDestroy, onMount } from 'svelte'; import type { LayoutData } from './$types'; import * as Buttons from './_components/Buttons'; - import Degraded from './_components/States/Degraded.svelte'; - import Healthy from './_components/States/Healthy.svelte'; + import * as States from './_components/States'; + import Menu from './_components/Menu.svelte'; export let data: LayoutData; @@ -85,13 +85,17 @@ class="pt-4 flex flex-row items-start justify-center lg:justify-end space-x-2 order-1 lg:order-2" > {#if $status.application.initialLoading} - + {:else if $status.application.overallStatus === 'degraded'} - (stopping = true)} on:stopped={() => (stopping = false)} /> + (stopping = true)} + on:stopped={() => (stopping = false)} + /> {:else if $status.application.overallStatus === 'healthy'} - + {:else if $status.application.overallStatus === 'stopped'} - + {/if}
  • diff --git a/apps/client/src/routes/applications/[id]/+layout.ts b/apps/client/src/routes/applications/[id]/+layout.ts index e0baec1b9..3bbc66f62 100644 --- a/apps/client/src/routes/applications/[id]/+layout.ts +++ b/apps/client/src/routes/applications/[id]/+layout.ts @@ -32,6 +32,7 @@ export const load: LayoutLoad = async ({ params, url }) => { throw redirect(307, '/applications'); } const configurationPhase = checkConfiguration(application); + console.log({ configurationPhase }); // if ( // configurationPhase && // pathname !== `/applications/${params.id}/configuration/${configurationPhase}` diff --git a/apps/client/src/routes/applications/[id]/_components/Menu.svelte b/apps/client/src/routes/applications/[id]/_components/Menu.svelte index 0403e8aad..ff1106d04 100644 --- a/apps/client/src/routes/applications/[id]/_components/Menu.svelte +++ b/apps/client/src/routes/applications/[id]/_components/Menu.svelte @@ -2,6 +2,9 @@ export let application: any; import { status } from '$lib/store'; import { page } from '$app/stores'; + import GitlabIcon from '$lib/components/svg/sources/GitlabIcon.svelte'; + import GithubIcon from '$lib/components/svg/sources/GithubIcon.svelte'; + import RemoteLink from '$lib/components/svg/RemoteLink.svelte';
    @@ -882,7 +881,7 @@
    @@ -977,7 +976,7 @@
    @@ -1063,7 +1062,7 @@
    @@ -1159,7 +1158,7 @@
    @@ -1245,7 +1244,7 @@
    From 9f4e81a1a3ac33da5c5782019e414f1b69ecae9e Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Tue, 13 Dec 2022 13:22:45 +0100 Subject: [PATCH 18/72] wip: trpc --- apps/client/src/routes/+error.svelte | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/apps/client/src/routes/+error.svelte b/apps/client/src/routes/+error.svelte index e77b92cd8..eef31e906 100644 --- a/apps/client/src/routes/+error.svelte +++ b/apps/client/src/routes/+error.svelte @@ -2,4 +2,13 @@ import { page } from '$app/stores'; -

    {$page.error.message}

    +
    +
    Ooops, are you lost?
    + Go back + {#if $page.error.message !== 'Not Found'} +
    +
    {$page
    +					.error.message}
    +
    + {/if} +
    From 8da900ee72601ba82a554def236ac43359144cdd Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Tue, 13 Dec 2022 13:32:11 +0100 Subject: [PATCH 19/72] fix: do not replace secret --- apps/ui/src/routes/applications/[id]/secrets.svelte | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/apps/ui/src/routes/applications/[id]/secrets.svelte b/apps/ui/src/routes/applications/[id]/secrets.svelte index 83cff5213..ca871ed64 100644 --- a/apps/ui/src/routes/applications/[id]/secrets.svelte +++ b/apps/ui/src/routes/applications/[id]/secrets.svelte @@ -48,10 +48,9 @@ .map((secret) => { const [name, ...rest] = secret.split('='); const value = rest.join('='); - const cleanValue = (value?.replaceAll('"', '') || '').trim(); return { name: name.trim(), - value: cleanValue.trim(), + value: value.trim(), createSecret: !secrets.find((secret: any) => name === secret.name) }; }); From 39e21c3f364ffa240d800a9470c2eba48ff20bd3 Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Tue, 13 Dec 2022 13:32:50 +0100 Subject: [PATCH 20/72] chore: version++ --- apps/api/src/lib/common.ts | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/api/src/lib/common.ts b/apps/api/src/lib/common.ts index 5ca17eaf2..52dd2dd53 100644 --- a/apps/api/src/lib/common.ts +++ b/apps/api/src/lib/common.ts @@ -19,7 +19,7 @@ import { saveBuildLog, saveDockerRegistryCredentials } from './buildPacks/common import { scheduler } from './scheduler'; import type { ExecaChildProcess } from 'execa'; -export const version = '3.12.1'; +export const version = '3.12.2'; export const isDev = process.env.NODE_ENV === 'development'; export const sentryDSN = 'https://409f09bcb7af47928d3e0f46b78987f3@o1082494.ingest.sentry.io/4504236622217216'; diff --git a/package.json b/package.json index 161035e1f..361b63719 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "coolify", "description": "An open-source & self-hostable Heroku / Netlify alternative.", - "version": "3.12.1", + "version": "3.12.2", "license": "Apache-2.0", "repository": "github:coollabsio/coolify", "scripts": { From e6d13cb7d75cc744192ac0afa5e609c082d0c4df Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Tue, 13 Dec 2022 21:29:42 +0100 Subject: [PATCH 21/72] Update --bug-report.yaml --- .github/ISSUE_TEMPLATE/--bug-report.yaml | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/--bug-report.yaml b/.github/ISSUE_TEMPLATE/--bug-report.yaml index 53853d157..c44e7508d 100644 --- a/.github/ISSUE_TEMPLATE/--bug-report.yaml +++ b/.github/ISSUE_TEMPLATE/--bug-report.yaml @@ -9,13 +9,21 @@ body: - type: markdown attributes: value: | - Thanks for taking the time to fill out this bug report! Please fill the form in English + Thanks for taking the time to fill out this bug report! Please fill the form in English. - type: checkboxes attributes: label: Is there an existing issue for this? options: - label: I have searched the existing issues required: true +- type: input + id: repository + attributes: + label: Example public repository + description: "An example public git repository to reproduce the issue easily (if applicable)." + placeholder: "https://github.com/coollabsio/coolify" + validations: + required: false - type: textarea attributes: label: Description From 2358510cba8568f11e0cde51f670f14bc176adf7 Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Tue, 13 Dec 2022 21:30:52 +0100 Subject: [PATCH 22/72] Update --bug-report.yaml --- .github/ISSUE_TEMPLATE/--bug-report.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/--bug-report.yaml b/.github/ISSUE_TEMPLATE/--bug-report.yaml index c44e7508d..65f2ed40d 100644 --- a/.github/ISSUE_TEMPLATE/--bug-report.yaml +++ b/.github/ISSUE_TEMPLATE/--bug-report.yaml @@ -21,7 +21,7 @@ body: attributes: label: Example public repository description: "An example public git repository to reproduce the issue easily (if applicable)." - placeholder: "https://github.com/coollabsio/coolify" + placeholder: "ex: https://github.com/coollabsio/coolify" validations: required: false - type: textarea From 06d40b8a81a1e0e93a20e9d114f296678d1df22d Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Wed, 14 Dec 2022 12:34:13 +0100 Subject: [PATCH 23/72] debug secret problem --- apps/api/src/jobs/deployApplication.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/api/src/jobs/deployApplication.ts b/apps/api/src/jobs/deployApplication.ts index 90afea210..e0f9b7a53 100644 --- a/apps/api/src/jobs/deployApplication.ts +++ b/apps/api/src/jobs/deployApplication.ts @@ -106,7 +106,6 @@ import * as buildpacks from '../lib/buildPacks'; }); } await fs.writeFile(`${workdir}/.env`, envs.join('\n')); - let envFound = false; try { envFound = !!(await fs.stat(`${workdir}/.env`)); @@ -437,6 +436,7 @@ import * as buildpacks from '../lib/buildPacks'; imageFound = `${imageName}:${customTag}` } await copyBaseConfigurationFiles(buildPack, workdir, buildId, applicationId, baseImage); + console.log({secrets}) const labels = makeLabelForStandaloneApplication({ applicationId, fqdn, @@ -530,7 +530,6 @@ import * as buildpacks from '../lib/buildPacks'; // } try { - console.log({ debug }) await executeCommand({ debug, buildId, applicationId, dockerId: destinationDocker.id, command: `docker compose --project-directory ${workdir} up -d` }) await saveBuildLog({ line: 'Deployed 🎉', buildId, applicationId }); await prisma.build.update({ where: { id: buildId }, data: { status: 'success' } }); @@ -589,6 +588,7 @@ import * as buildpacks from '../lib/buildPacks'; } }); } + console.log({envs}) await fs.writeFile(`${workdir}/.env`, envs.join('\n')); if (dockerRegistry) { const { url, username, password } = dockerRegistry From 0d51b04d79d55de0dcd41c70c1515ba234717f4a Mon Sep 17 00:00:00 2001 From: Alex Date: Sun, 18 Dec 2022 14:13:49 +0100 Subject: [PATCH 24/72] feat: adding icon for whoogle --- apps/ui/static/icons/whoogle.png | Bin 0 -> 10193 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/ui/static/icons/whoogle.png diff --git a/apps/ui/static/icons/whoogle.png b/apps/ui/static/icons/whoogle.png new file mode 100644 index 0000000000000000000000000000000000000000..5908757485333a0e895468a51b458eb3aa31d9ff GIT binary patch literal 10193 zcmZ{K1yqzl`|nD(bax0SvGfv>OM}uO2rS**-5t`>Dd5tebhoawNG!c5C8>z?ef{n| z=YIEp&ON*H&Y5?fiQRdgXMWFbCPC|kG9ex<9tZ>?R8@iM0QsAL2?q;!?ka6}02zjz zoTeNI)SQNY3&RA;kGyo0Y3qmvd?JFw1F^7SQq{bxg}AkBd_(wjsFWC&fQKL=!4(ms`k6 zo_l1ZkR{YYau_7-S__O+t(SGa@}!e;zCv3@Lgjg5F1@gx1+Lp3nLZue7GwAjJSjR&PJH*VfH-u%oI zf7fmp$6`N;8F9u7$PppOPOr2OpY;*v=%LVat&8&fpqP+ma56KooR1z68+e9_QH-`Yr4Ls18vJ^mth&lM{0P| zr2o59{jY5#?Z}a~=QRds9|t^3Nfz`W(cBof;Z)$Ue%sc^qNTF*IFA$txMmVngxrZC z_#apVlaUN;l)9iRoSMEmcCC50+p`slRy&mVndY;hFrHin+uJ(CF1CpBkd*wGCs!xL~ zqv!p$<=){l`5g(p6D8|s@I^H7eKRY(*)$a)_%z$O)J&ub6zYGzKR(~v_Lv!kBfOuO z^tb8gQ2UO)iJ=3}efmddD*;>lPlXF{XsBbL)QNHPTbG)1DAxP7WagQZ(0zfQ{;Ov- z1j7|gv|6B?Z*B~qgRw!lxWZ0AJ|@eT>@+9_u?V@sQyk5$hROUUQ!JWghG9p z&u`t$&D~%Q+{ckcTG-Ce zj}qg%PU$^8j85KJW3^&4!N2RpO(qIS|E+#$F9SDM4OS?fKaTx~s>m0s>r-^6aQzX> zUTP&tGq<{cheNNnaPg}Vv9+5wnJi+OWJt59gWQORiJtmQjY6#A0r34J!~x}eVdif* zKlHG8vc){HEZsQbQ$g0S!~-)ulw|1dYVM%sEI>i~;)>{VGHD)2Pd6ekxw|t1G-5D& zFoV$-3d0}_*pUayGw&@Q*}O2Pn<)hkVyK13vKi8BpKQb< zy`0E)PJ)-3L@$3)JD?svlF5>g(ISarG-P?)GS|L6EI{gXeVvGXG&=!tW#iQ6bC2D$V+tRSN>&Kz7SjzF^yv|6hXrA3n z%pSsEhIGRb@Xuw+_mhE=`Nu)j&>o|2jp*j%0;@kT$PUK980N)kiEtfC-Uh4LxmQo0 zs&hZ(V_wXSLI?|Jpc3b-&Zqr2v3LUq1GMQra>W(hhy2MXMx^=p8HyUZKvynr=#PuPZyJ#dB2y8-hA_7 zpqF-!w2FH{Zr;S+-c&WfhTGNeAVBg_+PG$bBCdK4Z)NBiniQj06#6ifbyii9NBvDyroq7o zm`J2y-FcebO_c3F7R{UyWhESzNA9Ou^EBW}`kQdw=G64s*o9dAyAO5Lxz89TtB6)z zsos4b<>`eN!}C3dwz!6eD@ITTqUl^r)j@ttGoqaTv6&ID>C&H~fhbuU_(@AkS0VCv zY2>J6MdN75Q9~$Xq?6jUJqdo`Ny%S7jPjUYlvIJxt6sKLMOhYV4EBvJ6x#5$xBV(n z9iIl!D{FgU6TSS*b7Goda6TPfn__k5@mtD>{NoTDLad~5{GsC~ibtaG#PLJeTI^xR z;ji|Vp9hL>9rO$nhQ9l1x0XhJh6~2VjZ^Q@ea@L^!>*CL_|RcmP21S5N|p`9?SF>4 z+kfJYeM+HI*`-I}mYPc^Dss9%y{_h?sVEwp$jQQ*l|`Z5-ISlcB@o!nz|V_+T!xX3 z<{Tu}_B_iQ&Be%1XvvrNR0L@LgngQ@fVKnGP@k1e#d*=`f*fmc=JX+9dRT7LHqkB& zw-#h(B`5!(tFJpXamw}l`Q5TC>m$c-Ip}&{=&;M5^^nHbXXPVz=K7D_shYCM^~t-Q zySgrY9pF4!QBpOYtt;WDOp@GB7$gAT8+S)pKz=#-06CQ!E$;dsa04&rvK;Rt( z2RY^Sr^_2#mpcBM+U=?7jo7F3t6{4&>Y2+E*r9~}pWHjw2Wbj@jM;yu+XH?PoUG)0 zgKMGi)W9_#%jsMFPHTT#QR3%08ksZ~WO8b<$FYW_-OKj5l{q;#Kbb*`xAwwHQk3H@ zb)V`w|E;?GvYxvw#vmSBKT7|qIHGCs)m^GUs7K~=uJXsTpsjU2j0 zZ(vYoDp4`XK*MMi_DkE$|Bs08$%?XF(4{qxZ8jSAs- zZnt^Xu^fn0a$WjBv?#1g+UDYQ>`ljiAIvFfzNQf5M3rO1@h(+4T2)Z7LZC|`NZhY0 zyLlF*I2yBa^Q-ED7H}1&IwPkuTrTymagC@PViJUU|KPa8uQvI5SJC+sfMGF*?ML=& zYSc#64C_ok|I;D4^srZpqvZlb$C6X6G68vjV@RmVz2-;X#QsUs`ZHAaf)ph`DX?8*olUeLpR*xUTFK__mg$uUs}C%Mmawh-aiEv z!F8o2wIwmb;WZtu@^bGlhT^MnDu`c|&y=aPK(rChSVBehRoKHRJ$8N?Nt(%gU@D+0 zqOOjBx6j{%Z%L9uOd zx%HkA@!vaBq2DQZ-E$ZF_X2-R(b4n2_`hmuo@yGA(!|Qim6fEnxdsMd{qQ~#3V)ow z_4c43rB*CX<_l%l&TBf?cB+M!6@i*9hVS5jdCzuuTzoh;nYB-T?smMpQG(2)JU2~F zO?554$u$)3dB8wL>66K;I*=ST`gsP?@Wq(cxGMXsy<}!kTcy-y6UcF&( zw2k3HtG~nRA@(Mof(q=7@87A`txLloM>~&*qZ?8g@9*roAvfz+(Vr}+hZYw3U|Z#t zk{{m>pgG?d@C`<(t1^>uZuf{%Jo}9J)ogqBacAdAagvMM(KZ$TQB`}jj01O^wJa18 z)=*?%mtg81`bSd{#=Ch=tsmU6}vR;-q(cIpKj7>Qnofb1VSV% z^mwgym!YprB*^+2>dK=z3>WO8CHm0tw0dWKU$yfMVB@g5w$pJUi@m22Z7ynR`0veo zK=T^O1#H6=KbJ$o%Ldbvk3W%;1a@89hu#pEX+g@IfGtlw=Ue*8w7=B~wDQrysOF`N z=b#LqKUG2BZ)*4}NT~a#->gBn_`&n1aSt!uj<_k35@8+Y)aqC?)JJBnrSR2hbp)5}A0Mbd{|6>Q~e>xa{63)470%c$EWSSb}3HIeY*d`G01r z9%}1F#eL*358>X~2?S7=MopWNzJuh3Vwl@CdhC1zvv=F&%=|*`3`#Rs)xns=b$a!p zZ4xa>tG>iB*-V9b_w58lWzBX|6PT%AhQDn5l}A$QAJ@nT3ty56VgRb`9sg838evz{ z_F%cXN;p!_Pk&se=%W*(L24tVBJ43{f6nseWO{g4-5KJ!>5y#K}>_wC3Rw0r2)sq*b6Tkfl)@7`OIZm%U&wj8|1`uLI5)cvCeK-si z|9wF~oWiceZ0<_5PVXkK{H>ZMQa4W^FDj4yjf=6Fj+BTr=VB7);7kZRy^S-^+qR;7 zUL~b5(p0tGoxpKj+PrCI`bS=C=;p!XZygUIXC?ZTj(;?y$h-sf|RI650f~=wqH=~;+1|F6I%0+eGEMVvq z?R(L~bz`QYcxWNFK6f{!KBp)t4m&0C%wI}RFUM9r)&6sc1j^wl{Ih!}smaZr@E;C^ zO~sEo`p?NkwHR5sF9*hy(2@z#IDQ+=3)j>(mX*$w=<90fXP=*w!W~KR_iCS_-wk6# zC8+)&h`>%KB^VZgp$Bl@UhBzWu%_2!Zm59=4D@wh==%g1V3H9IvxGWCq8!T8xq6@9 z;hw0*4uH;^UA!V?rJ3LDTad8Orp(TM(_|;r+{+&-N6Rs9rA}MSq&U7E5nlej$fF8z zpvQ^cvp>xHxj#)xjVgZY1fMNDUqI$)+9`_-D^%bn^b>i3`DcB9xk!{BP4EK8i;=jh%ad^igO8XD@Y^@s5aUp;(@dHVO<)42P7C3+#( z1^J=S#ZS$*Rr%U9yp!V%5Yos^_4pMV2@8n)IO}j&?Z{t=;ie(V7zv89K^z*dxoZwp zoS|7wnL*`gWcc?oRMa^xfvpX|V;X)|()Xcrem?za;`xVvE*^A^CIzP;|pYacJtjxmHMPUjA5nk=>kk7h)FB2Ivc z2kyOAiXCq;xR%YwAqUFAn;7Wm!?@l(d{j=HY5-@UQ^#OrF$B=023nzdNAM{x;*!>$mzb zdpl!9-;jqEHFJ;p?R}X!dab@0g0>79XPKIOmPCvby>#=ZEE;M4q@mWlCwzLfw}@hq zhk>8N8LFk3zRgp+OIVUycBXhd-F7}rSjVSUKD0^}*roWPvlk0xu zgIM|pOs_^X>x??d&CQPM*p*#fiAG0bKD7G?2}tX=PN%gr0|*dlX$|M**Iok1mcivY!EZuADPei$ zO}z)ruhe-}sxKOHgZt9}Kk)f;();(du}yVZhE@omMKA+4 zJyeD>tK!{ahX51wh`V}vc@?hT^_Z@@`l(?DjFk(l`@8T@Km7jqGZ~unQ*K9HGW2wk zO*i|Brm%G+X|A1bYckGB(gYJ42^YolX=L&xv1`7d`{FcGv!NCqv$G;gn=GQgbXA zbP5gj))Fix>fGw_gUyvSMZ5)9<10~-3{r`UzO1gt|C^cC6V`s_G=RYY0tlKtCbdgX zQaLKtmkF>!hxLc+8;q5nBf~m>h$+FUYNDhb*(j7H^sti%K+O}ME_94`UUs~GVxncV zQw_wGK_+4qYzaQ~l_Z?tWKLhHyT4o->9S(Zt1qMg^4yh0Q8{p$yv=5QZDG1o$R#-i zi<{>hg+OTDSkGHC2yw7x zW?4{U)$=ms1@hQp{FSb{LIC6&1s@)*sHk%i>dmgw9I;jpDHP*l(bw@j-CYN9RA(c~2$W%kEWx)2?LC?N9*#WaYy)h(G%1laucVAmb|#HagnIYEqQd zN5NEQ9oY`w8Q0>aVh)xQT8H`AwNUk>@2lGE=qclUnoanR#g zArp}(3^coEdD|XIT3`(mC(d!AqU{UA%cjGHUV6#k#Iiw>x(>y#2Vwvk#w1a`IV`v< z)ks@Zu<;QG(6G1PA4|J$Z)W|7ug+4LLY-Pl@8q3?sr96aqXrVr()(#rKG}}`VFXrp zc_TP_uEi4I&)&Z_nvCpHQ&UTtxcCmZ(!nENlxG2xO6CZP^31=`NLUF%&q9p@Fg3C_ zS9~k4x&c^gXJHX<&z=Yu!Vi@1HS$Ob2}%P%ASzX|J^iF4B+AW0mBnwhGewK}OBp(+ zAcqpUoV8f2$Do5C6=@9|4+~2|Yb_2nW!KY=jf z4>1J4#u{(}Wab%D#^RN%l2bAEij^)lFpY!Q%L^F*PCr4Vg6i`P8=Os#vhB0w5 z9#l`WMhsg58UZ1JZfmLKt0LOmNEmgNVGavg{jOv})p+lTymj2x8U0%K$w&M}zXW{w zntREa=ZnwoxHf;k|J8H4dI%`RlkZoao>HqFHqXVJT~(B~^&{?TM1Qda%stNLOL1zC zJiuwf26Fk-ux`li)t?T|6vn=}O)z)9#YI`H=x-1IWk*&XQ0m0W=Y& zrB4@!uBkOb*RDcudQm#_7>JhrBaf#q&vT_Jh`9oS2g;D_w@~S!V8wtU{Vo| zi_lZ|r+f|@&h|@Hc<2z{nHF*517#etkL%CZ?sl#{YwBzBweyZgxwyVmSAK|3Z5!F; znM7lO_Ho9Z%`?c{ev1<=Hak!K!?>i1I+$cB#2YP`cta2(3S(9Jx-hG*?eR!|;d^Up zY7)*UM+`aTm3UY~RP(It)06|N0Y4Y}fL(>k$EJhBj;3KrF$ZAQ!-&8iE@ci1Q2NWh z?vnFF9kuFN*?`Vn9zNcoBT)ypBQ%4EDSI@Ncdv*z;U~HuH<;df{fPEj+ zePdcfmlkkxD7~9A%`Y8$C9Rmj2pF1`93>w-PuuQr)V=$)-a-}`k+MB7{tw8G0Q87sBwE3Ini;Utu4_k6Pg^&GKraBgXA4L{)D}m? z>s#;QlZ4sM8T638w|6C`f65HmwSGkuIUD)4*26<;%u>9#PI}1mS$GiT)wN9X!tZMv zRX@vl1q7r9ZOktyhna6zpz}w_ZK?`PQu*F)78ufBWxg@*^m{mTHtqJ&)4z#0sysKU zNrONEx<<**kV(8#oJS=i=!E}N*HlNvP?>*NflVlc7SrrepNnFJ!VOV>z$iZHA8wc3 zPX#1boMR>uKLmv0aR7AQbG_}FN-vd{CEyp!@|71}=BhpEERX3j@Hm_=O-6tw9eh#n z_-CaD>JLuaTGGL*Lbjn@{bd3cR*bR8-XwL#<@`gAYN2vi472 zk|^zrQ;%J06UtoOxv_iCez3Mf!8I+AA@R`g!-(aZ3MQ*~9JXOA0-{tcT@zK<>=&M> z!F!llfQMMWzlWGY6q}I8E=BrcxLbEp;*`wU*9u&72rpVnZs1bcwUj~( zQRoU7WAZ$vJs@+lZG|?y?5RJD#Si;VKLfmEA_kI?5i7)3UK+ndQlLKp11IZqU-@PN zEXAt--I1ImquU_MOu4n&-Z&xrpwQA9$z!UQsij&6_x#cOOX`xp(cOJRpnR4Fn{;?U zcVM1c$$fl2?d9P%P2R(yp&M3iE!6^JA&!q~i`WGU3vda;0FT|?blsvmv)v3)e%y=j zn(i6u=A5!L7Ahumc*M_qPCe6&5+vDGhbdt=`jXZ&&k0DASUmsrXv`Q^K3rK{ThbHE zgzxxF##_e(LS7ay4GX<@>o5KI&gyoBrvIn(rhrFxnkCYdZ#$U#3j{P9>`n#HdwOQSLG9($TyA2-z})wg|$1%Q;&ICb6fdVXUZXOHAJanAu~W z(5r8Q)?acN(L>o;!(hvQO8?#opM==_aMBzj47+OYOQlHYaDNgM%uwAP%GeqaiEwGz zUa=Xm6nIhM$U>Pkog*c;sXWmBT3md$@1~zA&j(jU=auiD5`$pOO>3^=K^_2YYolJe|BsTi4+ z39KA02o!q@iFk}l$s zaLk%o;QS5RoCZ$SmT^+8u2OVsU7tgl9e>bGv9_rXtZ$he!2TZgjUQI8%YGCjtjqo ztQ+%!Z}Qxk%s-&LWI2CZTlX`b0dM)eo-vixi#TNwNfIXz-GYI|#$Q-JzPn@MkKPX> zByu|<(0h7++P#koEWWp=CSG0fA9`WHWr27G;Ec34VCj!b{H-V)`L;cURPGt;G-zY^ zNLo&q_N9S!K$i;gZ`Y5g?j`?WPAz0=0>TFmxt=or)qo(Y%FBf&S+20J{viQ&%Md%8 z2!Fn)WA}9K`pMDSC2h*0Ge-3@3!EkNpNb=6+76gs=$1Es!^KbQYLamv?f13Ym?YP5{~pReMqwu4x)yLz9=*#5r+!Xj-ccSqB;|gG_YyZOL2wQ zelf>eEQ?kl^rH_X0Q$L*OQQRhGG`2bx@nkES+ByLA)A)eB5PQTiGqPMt}mA13>;kDh+^A$+tKK8oe z4lljiFYt`d&3qcRS>GkgZn1_CoBqPPH@F3oR{zkRHd4ujPCyeK$%p2s{W@Nu<^oc$ zlnt4;eO+m`#!Uocg>bHVvwC`)&J_;eqWSI^=*L7B6~*H)_LuZuA2YoRlC+DidoqLZ zL`tkGG_Q(o!L*Qg;Hh3C!$T)!I;|eQdzV8m%AApui5!Nq?q`GaekWlLpJ0abLO5@V zFo{?^(H7)1gfygF)2PJJr%J!{Uv)QD2i@4lq+vunnejeRm?{wRAQ;Fx+4e1{xz_tg zzF?{Mi-a5VvvxiGcGc;?TB;o%s4+9cOWdG*J3Cf|r}Ew;#;Y2Bhi& zv$N5J**RD_F^lqv@j-aSnFYZD!n|M+U`S?d0a0dqZ*O-AetthcKR$F`P@A1 zR%4HV4nfradepP`aj}$;fVx@vxY)RQOGsz|qFx|@>W6Or{~`0AF(oAIZ5-_Ey+H!v zf{#I-F@Ox!fA#Z!WDFgwz3u;r%-6Bt03tO1C8FuzV&fg)ZUg$ytoYqs?POXEUi^=K zH1z-}kbnq8R7_A1A}p@IbYKaHJpQkKbR7b1Kwx?Kta9m}K$XFNRq5-ff@~d}ZGfN8 z@8at1>}JPr3-fiba&z_K|Gx{vFCqp5iwX+EU}9iFD{(O!8xa^VWe6As1B-}*t%dl2 Y7JR_`w5g2#U7!Q0D!za=$Xi7IFV|i#_5c6? literal 0 HcmV?d00001 From a70adc5eb3d8f1ac6e72f4a9f11bccf131ad5324 Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Mon, 19 Dec 2022 09:52:50 +0100 Subject: [PATCH 25/72] fix: root user for dbs on arm --- apps/api/src/routes/api/v1/base/index.ts | 50 +++++++++---------- apps/ui/src/lib/store.ts | 6 ++- apps/ui/src/routes/__layout.svelte | 1 + .../databases/[id]/_Databases/_MySQL.svelte | 4 +- .../[id]/_Databases/_PostgreSQL.svelte | 36 ++++++------- 5 files changed, 51 insertions(+), 46 deletions(-) diff --git a/apps/api/src/routes/api/v1/base/index.ts b/apps/api/src/routes/api/v1/base/index.ts index 170a138f3..d631df3d8 100644 --- a/apps/api/src/routes/api/v1/base/index.ts +++ b/apps/api/src/routes/api/v1/base/index.ts @@ -1,31 +1,31 @@ import { FastifyPluginAsync } from 'fastify'; -import { errorHandler, listSettings, version } from '../../../../lib/common'; +import { errorHandler, isARM, listSettings, version } from '../../../../lib/common'; const root: FastifyPluginAsync = async (fastify): Promise => { - fastify.addHook('onRequest', async (request) => { - try { - await request.jwtVerify() - } catch(error) { - return - } - }); - fastify.get('/', async (request) => { - const teamId = request.user?.teamId; - const settings = await listSettings() - try { - return { - ipv4: teamId ? settings.ipv4 : null, - ipv6: teamId ? settings.ipv6 : null, - version, - whiteLabeled: process.env.COOLIFY_WHITE_LABELED === 'true', - whiteLabeledIcon: process.env.COOLIFY_WHITE_LABELED_ICON, - isRegistrationEnabled: settings.isRegistrationEnabled, - } - } catch ({ status, message }) { - return errorHandler({ status, message }) - } - }); - + fastify.addHook('onRequest', async (request) => { + try { + await request.jwtVerify(); + } catch (error) { + return; + } + }); + fastify.get('/', async (request) => { + const teamId = request.user?.teamId; + const settings = await listSettings(); + try { + return { + ipv4: teamId ? settings.ipv4 : null, + ipv6: teamId ? settings.ipv6 : null, + version, + whiteLabeled: process.env.COOLIFY_WHITE_LABELED === 'true', + whiteLabeledIcon: process.env.COOLIFY_WHITE_LABELED_ICON, + isRegistrationEnabled: settings.isRegistrationEnabled, + isARM: isARM(process.arch) + }; + } catch ({ status, message }) { + return errorHandler({ status, message }); + } + }); }; export default root; diff --git a/apps/ui/src/lib/store.ts b/apps/ui/src/lib/store.ts index f779eb1dc..493896c70 100644 --- a/apps/ui/src/lib/store.ts +++ b/apps/ui/src/lib/store.ts @@ -23,7 +23,8 @@ interface AppSession { github: string | null, gitlab: string | null, }, - pendingInvitations: Array + pendingInvitations: Array, + isARM: boolean } interface AddToast { type?: "info" | "success" | "error", @@ -52,7 +53,8 @@ export const appSession: Writable = writable({ github: null, gitlab: null }, - pendingInvitations: [] + pendingInvitations: [], + isARM: false }); export const disabledButton: Writable = writable(false); export const isDeploymentEnabled: Writable = writable(false); diff --git a/apps/ui/src/routes/__layout.svelte b/apps/ui/src/routes/__layout.svelte index f9c41a702..d71367a6c 100644 --- a/apps/ui/src/routes/__layout.svelte +++ b/apps/ui/src/routes/__layout.svelte @@ -75,6 +75,7 @@ $appSession.version = baseSettings.version; $appSession.whiteLabeled = baseSettings.whiteLabeled; $appSession.whiteLabeledDetails.icon = baseSettings.whiteLabeledIcon; + $appSession.isARM = baseSettings.isARM; $appSession.pendingInvitations = pendingInvitations; diff --git a/apps/ui/src/routes/databases/[id]/_Databases/_MySQL.svelte b/apps/ui/src/routes/databases/[id]/_Databases/_MySQL.svelte index 886f1cbd2..5bd94fd85 100644 --- a/apps/ui/src/routes/databases/[id]/_Databases/_MySQL.svelte +++ b/apps/ui/src/routes/databases/[id]/_Databases/_MySQL.svelte @@ -1,6 +1,6 @@ + +
    + {#if !isPasswordField || showPassword} + {#if textarea} + + {:else} + + {/if} + {:else} + + {/if} + +
    +
    + {#if isPasswordField} + +
    (showPassword = !showPassword)}> + {#if showPassword} + + + + {:else} + + + + + {/if} +
    + {/if} + {#if value && isHttps} + +
    + + + + + +
    + {/if} +
    +
    +
    diff --git a/apps/client/src/lib/components/Explainer.svelte b/apps/client/src/lib/components/Explainer.svelte new file mode 100644 index 000000000..924ce70d6 --- /dev/null +++ b/apps/client/src/lib/components/Explainer.svelte @@ -0,0 +1,38 @@ + + +
    + + + + + +
    diff --git a/apps/client/src/lib/components/Setting.svelte b/apps/client/src/lib/components/Setting.svelte new file mode 100644 index 000000000..555323b37 --- /dev/null +++ b/apps/client/src/lib/components/Setting.svelte @@ -0,0 +1,87 @@ + + +
    +
    + + +
    +
    +
    + +
    + Use setting + + + + +
    +
    + +{#if dataTooltip} + {dataTooltip} +{/if} diff --git a/apps/client/src/lib/store.ts b/apps/client/src/lib/store.ts index 8e3687dca..77510ba95 100644 --- a/apps/client/src/lib/store.ts +++ b/apps/client/src/lib/store.ts @@ -21,7 +21,8 @@ export const trpc = createTRPCProxyClient({ }) ] }); - +export const disabledButton: Writable = writable(false); +export const location: Writable = writable(null) interface AppSession { isRegistrationEnabled: boolean; token?: string; @@ -139,3 +140,33 @@ export const status: Writable = writable({ 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); + } +}; diff --git a/apps/client/src/routes/+page.ts b/apps/client/src/routes/+page.ts index 4652e3d53..3465b727e 100644 --- a/apps/client/src/routes/+page.ts +++ b/apps/client/src/routes/+page.ts @@ -1,11 +1,8 @@ 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 }) => { +export const load = async () => { try { return await trpc.dashboard.resources.query(); } catch (err) { diff --git a/apps/client/src/routes/applications/[id]/+page.svelte b/apps/client/src/routes/applications/[id]/+page.svelte index e69de29bb..0a431b054 100644 --- a/apps/client/src/routes/applications/[id]/+page.svelte +++ b/apps/client/src/routes/applications/[id]/+page.svelte @@ -0,0 +1,1228 @@ + + +
    +
    handleSubmit()}> +
    +
    +
    General
    + {#if $appSession.isAdmin} + + {/if} +
    +
    +
    + + +
    + {#if !isSimpleDockerfile} +
    + + {#if isDisabled || application.settings?.isPublicRepository} + + {:else} + + {/if} +
    +
    + + +
    +
    + + {#if isDisabled || application.settings?.isPublicRepository} + + {:else} + + {/if} +
    + {/if} +
    + + {#if isDisabled} + + {:else} + + + {/if} +
    + {#if application.dockerRegistry?.id && application.gitSourceId} +
    + + +
    + {/if} + {#if !isSimpleDockerfile} +
    + + {#if isDisabled} + + {:else} + + + {/if} +
    + {/if} +
    + +
    + +
    +
    + {#if application.buildPack !== 'compose'} +
    + changeSettings('isBot')} + title="Is your application a bot?" + description="You can deploy applications without domains or make them to listen on the Exposed Port.

    Useful to host Twitch bots, regular jobs, or anything that does not require an incoming HTTP connection." + disabled={isDisabled} + /> +
    + {/if} + {#if !isBot && application.buildPack !== 'compose'} +
    + +
    + + {#if forceSave} +
    + {#if isNonWWWDomainOK} + + {:else} + + {/if} + {#if dualCerts} + {#if isWWWDomainOK} + + {:else} + + {/if} + {/if} +
    + {/if} +
    +
    +
    + !isDisabled && changeSettings('dualCerts')} + /> +
    + {#if isHttps && application.buildPack !== 'compose'} +
    + changeSettings('isCustomSSL')} + /> +
    + {/if} + {/if} +
    + {#if isSimpleDockerfile} +
    + Configuration +
    + +
    +
    + +
    +