From 9b6ea99eeaad63c5a9d7aa51987a402ac6181453 Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Mon, 7 Oct 2024 00:49:54 -0600 Subject: [PATCH] refactor: remove unused files --- apps/api/package.json | 3 +- apps/dokploy/__test__/drop/drop.test.test.ts | 2 +- apps/dokploy/templates/utils/index.ts | 2 +- apps/schedules/package.json | 3 +- packages/server/package.json | 3 +- .../src/templates/appsmith/docker-compose.yml | 6 - .../server/src/templates/appsmith/index.ts | 23 - .../src/templates/aptabase/docker-compose.yml | 51 - .../server/src/templates/aptabase/index.ts | 27 - .../src/templates/baserow/docker-compose.yml | 10 - .../server/src/templates/baserow/index.ts | 24 - .../src/templates/calcom/docker-compose.yml | 26 - packages/server/src/templates/calcom/index.ts | 32 - .../src/templates/directus/docker-compose.yml | 47 - .../server/src/templates/directus/index.ts | 20 - .../templates/documenso/docker-compose.yml | 43 - .../server/src/templates/documenso/index.ts | 36 - .../templates/doublezero/docker-compose.yml | 19 - .../server/src/templates/doublezero/index.ts | 36 - .../templates/excalidraw/docker-compose.yml | 7 - .../server/src/templates/excalidraw/index.ts | 23 - .../src/templates/ghost/docker-compose.yml | 29 - packages/server/src/templates/ghost/index.ts | 25 - .../src/templates/gitea/docker-compose.yml | 37 - packages/server/src/templates/gitea/index.ts | 24 - .../templates/glitchtip/docker-compose.yml | 59 -- .../server/src/templates/glitchtip/index.ts | 30 - .../src/templates/grafana/docker-compose.yml | 9 - .../server/src/templates/grafana/index.ts | 19 - .../src/templates/jellyfin/docker-compose.yml | 19 - .../server/src/templates/jellyfin/index.ts | 25 - .../src/templates/listmonk/docker-compose.yml | 49 - .../server/src/templates/listmonk/index.ts | 57 - .../templates/meilisearch/docker-compose.yml | 14 - .../server/src/templates/meilisearch/index.ts | 26 - .../src/templates/metabase/docker-compose.yml | 26 - .../server/src/templates/metabase/index.ts | 22 - .../src/templates/minio/docker-compose.yml | 13 - packages/server/src/templates/minio/index.ts | 28 - .../src/templates/n8n/docker-compose.yml | 18 - packages/server/src/templates/n8n/index.ts | 28 - .../src/templates/nocodb/docker-compose.yml | 32 - packages/server/src/templates/nocodb/index.ts | 28 - .../src/templates/odoo/docker-compose.yml | 29 - packages/server/src/templates/odoo/index.ts | 22 - .../templates/open-webui/docker-compose.yml | 26 - .../server/src/templates/open-webui/index.ts | 24 - .../templates/phpmyadmin/docker-compose.yml | 28 - .../server/src/templates/phpmyadmin/index.ts | 32 - .../templates/plausible/docker-compose.yml | 44 - .../server/src/templates/plausible/index.ts | 71 -- .../templates/pocketbase/docker-compose.yml | 9 - .../server/src/templates/pocketbase/index.ts | 22 - .../templates/rocketchat/docker-compose.yml | 35 - .../server/src/templates/rocketchat/index.ts | 25 - .../src/templates/soketi/docker-compose.yml | 12 - packages/server/src/templates/soketi/index.ts | 28 - .../src/templates/supabase/docker-compose.yml | 460 -------- .../server/src/templates/supabase/index.ts | 995 ------------------ .../src/templates/teable/docker-compose.yml | 69 -- packages/server/src/templates/teable/index.ts | 54 - packages/server/src/templates/templates.ts | 500 --------- .../src/templates/typebot/docker-compose.yml | 49 - .../server/src/templates/typebot/index.ts | 44 - .../templates/types/templates-data.type.ts | 67 -- .../src/templates/umami/docker-compose.yml | 35 - packages/server/src/templates/umami/index.ts | 27 - .../templates/uptime-kuma/docker-compose.yml | 10 - .../server/src/templates/uptime-kuma/index.ts | 22 - packages/server/src/templates/utils/index.ts | 19 - .../templates/wordpress/docker-compose.yml | 27 - .../server/src/templates/wordpress/index.ts | 22 - .../src/templates/zipline/docker-compose.yml | 37 - .../server/src/templates/zipline/index.ts | 32 - 74 files changed, 8 insertions(+), 3928 deletions(-) delete mode 100644 packages/server/src/templates/appsmith/docker-compose.yml delete mode 100644 packages/server/src/templates/appsmith/index.ts delete mode 100644 packages/server/src/templates/aptabase/docker-compose.yml delete mode 100644 packages/server/src/templates/aptabase/index.ts delete mode 100644 packages/server/src/templates/baserow/docker-compose.yml delete mode 100644 packages/server/src/templates/baserow/index.ts delete mode 100644 packages/server/src/templates/calcom/docker-compose.yml delete mode 100644 packages/server/src/templates/calcom/index.ts delete mode 100644 packages/server/src/templates/directus/docker-compose.yml delete mode 100644 packages/server/src/templates/directus/index.ts delete mode 100644 packages/server/src/templates/documenso/docker-compose.yml delete mode 100644 packages/server/src/templates/documenso/index.ts delete mode 100644 packages/server/src/templates/doublezero/docker-compose.yml delete mode 100644 packages/server/src/templates/doublezero/index.ts delete mode 100644 packages/server/src/templates/excalidraw/docker-compose.yml delete mode 100644 packages/server/src/templates/excalidraw/index.ts delete mode 100644 packages/server/src/templates/ghost/docker-compose.yml delete mode 100644 packages/server/src/templates/ghost/index.ts delete mode 100644 packages/server/src/templates/gitea/docker-compose.yml delete mode 100644 packages/server/src/templates/gitea/index.ts delete mode 100644 packages/server/src/templates/glitchtip/docker-compose.yml delete mode 100644 packages/server/src/templates/glitchtip/index.ts delete mode 100644 packages/server/src/templates/grafana/docker-compose.yml delete mode 100644 packages/server/src/templates/grafana/index.ts delete mode 100644 packages/server/src/templates/jellyfin/docker-compose.yml delete mode 100644 packages/server/src/templates/jellyfin/index.ts delete mode 100644 packages/server/src/templates/listmonk/docker-compose.yml delete mode 100644 packages/server/src/templates/listmonk/index.ts delete mode 100644 packages/server/src/templates/meilisearch/docker-compose.yml delete mode 100644 packages/server/src/templates/meilisearch/index.ts delete mode 100644 packages/server/src/templates/metabase/docker-compose.yml delete mode 100644 packages/server/src/templates/metabase/index.ts delete mode 100644 packages/server/src/templates/minio/docker-compose.yml delete mode 100644 packages/server/src/templates/minio/index.ts delete mode 100644 packages/server/src/templates/n8n/docker-compose.yml delete mode 100644 packages/server/src/templates/n8n/index.ts delete mode 100644 packages/server/src/templates/nocodb/docker-compose.yml delete mode 100644 packages/server/src/templates/nocodb/index.ts delete mode 100644 packages/server/src/templates/odoo/docker-compose.yml delete mode 100644 packages/server/src/templates/odoo/index.ts delete mode 100644 packages/server/src/templates/open-webui/docker-compose.yml delete mode 100644 packages/server/src/templates/open-webui/index.ts delete mode 100644 packages/server/src/templates/phpmyadmin/docker-compose.yml delete mode 100644 packages/server/src/templates/phpmyadmin/index.ts delete mode 100644 packages/server/src/templates/plausible/docker-compose.yml delete mode 100644 packages/server/src/templates/plausible/index.ts delete mode 100644 packages/server/src/templates/pocketbase/docker-compose.yml delete mode 100644 packages/server/src/templates/pocketbase/index.ts delete mode 100644 packages/server/src/templates/rocketchat/docker-compose.yml delete mode 100644 packages/server/src/templates/rocketchat/index.ts delete mode 100644 packages/server/src/templates/soketi/docker-compose.yml delete mode 100644 packages/server/src/templates/soketi/index.ts delete mode 100644 packages/server/src/templates/supabase/docker-compose.yml delete mode 100644 packages/server/src/templates/supabase/index.ts delete mode 100644 packages/server/src/templates/teable/docker-compose.yml delete mode 100644 packages/server/src/templates/teable/index.ts delete mode 100644 packages/server/src/templates/templates.ts delete mode 100644 packages/server/src/templates/typebot/docker-compose.yml delete mode 100644 packages/server/src/templates/typebot/index.ts delete mode 100644 packages/server/src/templates/types/templates-data.type.ts delete mode 100644 packages/server/src/templates/umami/docker-compose.yml delete mode 100644 packages/server/src/templates/umami/index.ts delete mode 100644 packages/server/src/templates/uptime-kuma/docker-compose.yml delete mode 100644 packages/server/src/templates/uptime-kuma/index.ts delete mode 100644 packages/server/src/templates/wordpress/docker-compose.yml delete mode 100644 packages/server/src/templates/wordpress/index.ts delete mode 100644 packages/server/src/templates/zipline/docker-compose.yml delete mode 100644 packages/server/src/templates/zipline/index.ts diff --git a/apps/api/package.json b/apps/api/package.json index 06c75baa..0da226af 100644 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -5,7 +5,8 @@ "scripts": { "dev": "PORT=4000 tsx watch src/index.ts", "build": "tsc --project tsconfig.json", - "start": "node --experimental-specifier-resolution=node dist/index.js" + "start": "node --experimental-specifier-resolution=node dist/index.js", + "typecheck": "tsc --noEmit" }, "dependencies": { "pino": "9.4.0", diff --git a/apps/dokploy/__test__/drop/drop.test.test.ts b/apps/dokploy/__test__/drop/drop.test.test.ts index 2ca95984..53890281 100644 --- a/apps/dokploy/__test__/drop/drop.test.test.ts +++ b/apps/dokploy/__test__/drop/drop.test.test.ts @@ -1,6 +1,6 @@ import fs from "node:fs/promises"; import path from "node:path"; -import { paths } from "@/server/constants"; +import { paths } from "@dokploy/server"; const { APPLICATIONS_PATH } = paths(); import type { ApplicationNested } from "@dokploy/server"; import { unzipDrop } from "@dokploy/server"; diff --git a/apps/dokploy/templates/utils/index.ts b/apps/dokploy/templates/utils/index.ts index 8ee96aa1..b5369b91 100644 --- a/apps/dokploy/templates/utils/index.ts +++ b/apps/dokploy/templates/utils/index.ts @@ -1,7 +1,7 @@ import { randomBytes } from "node:crypto"; import { readFile } from "node:fs/promises"; import { join } from "node:path"; -import type { Domain } from "@dokploy/builders"; +import type { Domain } from "@dokploy/server"; // import { IS_CLOUD } from "@/server/constants"; import { TRPCError } from "@trpc/server"; import { templates } from "../templates"; diff --git a/apps/schedules/package.json b/apps/schedules/package.json index cd448d83..88ca3dfb 100644 --- a/apps/schedules/package.json +++ b/apps/schedules/package.json @@ -4,7 +4,8 @@ "scripts": { "dev": "PORT=4001 tsx watch src/index.ts", "build": "tsc --project tsconfig.json", - "start": "node --experimental-specifier-resolution=node dist/index.js" + "start": "node --experimental-specifier-resolution=node dist/index.js", + "typecheck": "tsc --noEmit" }, "dependencies": { "drizzle-orm": "^0.30.8", diff --git a/packages/server/package.json b/packages/server/package.json index 7fc48c4e..153011b8 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -8,7 +8,8 @@ "build": "rm -rf ./dist && tsc --project tsconfig.server.json && tsc-alias -p tsconfig.server.json", "build:types": "tsc --emitDeclarationOnly --experimenta-dts", "dev": "rm -rf ./dist && pnpm esbuild && tsc --emitDeclarationOnly --outDir dist -p tsconfig.server.json", - "esbuild": "tsx ./esbuild.config.ts" + "esbuild": "tsx ./esbuild.config.ts", + "typecheck": "tsc --noEmit" }, "dependencies": { "rotating-file-stream": "3.2.3", diff --git a/packages/server/src/templates/appsmith/docker-compose.yml b/packages/server/src/templates/appsmith/docker-compose.yml deleted file mode 100644 index f520ee36..00000000 --- a/packages/server/src/templates/appsmith/docker-compose.yml +++ /dev/null @@ -1,6 +0,0 @@ -version: "3.8" -services: - appsmith: - image: index.docker.io/appsmith/appsmith-ee:v1.29 - volumes: - - ../files/stacks:/appsmith-stacks diff --git a/packages/server/src/templates/appsmith/index.ts b/packages/server/src/templates/appsmith/index.ts deleted file mode 100644 index ff744a24..00000000 --- a/packages/server/src/templates/appsmith/index.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { - type DomainSchema, - type Schema, - type Template, - generateHash, - generateRandomDomain, -} from "../utils"; - -export function generate(schema: Schema): Template { - const mainServiceHash = generateHash(schema.projectName); - - const domains: DomainSchema[] = [ - { - host: generateRandomDomain(schema), - port: 80, - serviceName: "appsmith", - }, - ]; - - return { - domains, - }; -} diff --git a/packages/server/src/templates/aptabase/docker-compose.yml b/packages/server/src/templates/aptabase/docker-compose.yml deleted file mode 100644 index 934fd1ee..00000000 --- a/packages/server/src/templates/aptabase/docker-compose.yml +++ /dev/null @@ -1,51 +0,0 @@ -services: - aptabase_db: - image: postgres:15-alpine - restart: always - volumes: - - db-data:/var/lib/postgresql/data - environment: - POSTGRES_USER: aptabase - POSTGRES_PASSWORD: sTr0NGp4ssw0rd - networks: - - dokploy-network - healthcheck: - test: ["CMD-SHELL", "pg_isready -U aptabase"] - interval: 10s - timeout: 5s - retries: 5 - - aptabase_events_db: - image: clickhouse/clickhouse-server:23.8.16.16-alpine - restart: always - volumes: - - events-db-data:/var/lib/clickhouse - environment: - CLICKHOUSE_USER: aptabase - CLICKHOUSE_PASSWORD: sTr0NGp4ssw0rd - ulimits: - nofile: - soft: 262144 - hard: 262144 - networks: - - dokploy-network - healthcheck: - test: ["CMD-SHELL", "curl -f http://localhost:8123 || exit 1"] - interval: 10s - timeout: 5s - retries: 5 - - aptabase: - image: ghcr.io/aptabase/aptabase:main - restart: always - environment: - BASE_URL: http://${APTABASE_HOST} - AUTH_SECRET: ${AUTH_SECRET} - DATABASE_URL: Server=aptabase_db;Port=5432;User Id=aptabase;Password=sTr0NGp4ssw0rd;Database=aptabase - CLICKHOUSE_URL: Host=aptabase_events_db;Port=8123;Username=aptabase;Password=sTr0NGp4ssw0rd - -volumes: - db-data: - driver: local - events-db-data: - driver: local diff --git a/packages/server/src/templates/aptabase/index.ts b/packages/server/src/templates/aptabase/index.ts deleted file mode 100644 index 38b077ae..00000000 --- a/packages/server/src/templates/aptabase/index.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { - type DomainSchema, - type Schema, - type Template, - generateBase64, - generateRandomDomain, -} from "../utils"; - -export function generate(schema: Schema): Template { - const mainDomain = generateRandomDomain(schema); - const authSecret = generateBase64(32); - - const domains: DomainSchema[] = [ - { - host: mainDomain, - port: 8080, - serviceName: "aptabase", - }, - ]; - - const envs = [`APTABASE_HOST=${mainDomain}`, `AUTH_SECRET=${authSecret}`]; - - return { - envs, - domains, - }; -} diff --git a/packages/server/src/templates/baserow/docker-compose.yml b/packages/server/src/templates/baserow/docker-compose.yml deleted file mode 100644 index db588e83..00000000 --- a/packages/server/src/templates/baserow/docker-compose.yml +++ /dev/null @@ -1,10 +0,0 @@ -version: "3.8" -services: - baserow: - image: baserow/baserow:1.25.2 - environment: - BASEROW_PUBLIC_URL: "http://${BASEROW_HOST}" - volumes: - - baserow_data:/baserow/data -volumes: - baserow_data: diff --git a/packages/server/src/templates/baserow/index.ts b/packages/server/src/templates/baserow/index.ts deleted file mode 100644 index fa57417c..00000000 --- a/packages/server/src/templates/baserow/index.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { - type DomainSchema, - type Schema, - type Template, - generateRandomDomain, -} from "../utils"; - -export function generate(schema: Schema): Template { - const mainHost = generateRandomDomain(schema); - - const domains: DomainSchema[] = [ - { - host: mainHost, - port: 80, - serviceName: "baserow", - }, - ]; - const envs = [`BASEROW_HOST=${mainHost}`]; - - return { - envs, - domains, - }; -} diff --git a/packages/server/src/templates/calcom/docker-compose.yml b/packages/server/src/templates/calcom/docker-compose.yml deleted file mode 100644 index 7a1d8c92..00000000 --- a/packages/server/src/templates/calcom/docker-compose.yml +++ /dev/null @@ -1,26 +0,0 @@ -services: - postgres: - image: postgres:16-alpine - networks: - - dokploy-network - volumes: - - calcom-data:/var/lib/postgresql/data - environment: - - POSTGRES_USER=postgres - - POSTGRES_PASSWORD=password - - POSTGRES_DB=db - - DATABASE_URL=postgres://postgres:password@postgres:5432/db - - calcom: - image: calcom/cal.com:v2.7.6 - depends_on: - - postgres - environment: - - NEXTAUTH_SECRET=${NEXTAUTH_SECRET} - - CALENDSO_ENCRYPTION_KEY=${CALENDSO_ENCRYPTION_KEY} - - DATABASE_URL=postgres://postgres:password@postgres:5432/db - - NEXT_PUBLIC_WEBAPP_URL=http://${CALCOM_HOST} - - NEXTAUTH_URL=http://${CALCOM_HOST}/api/auth - -volumes: - calcom-data: diff --git a/packages/server/src/templates/calcom/index.ts b/packages/server/src/templates/calcom/index.ts deleted file mode 100644 index d359e9c7..00000000 --- a/packages/server/src/templates/calcom/index.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { - type DomainSchema, - type Schema, - type Template, - generateBase64, - generateRandomDomain, -} from "../utils"; - -export function generate(schema: Schema): Template { - const mainDomain = generateRandomDomain(schema); - const calcomEncryptionKey = generateBase64(32); - const nextAuthSecret = generateBase64(32); - - const domains: DomainSchema[] = [ - { - host: mainDomain, - port: 3000, - serviceName: "calcom", - }, - ]; - - const envs = [ - `CALCOM_HOST=${mainDomain}`, - `NEXTAUTH_SECRET=${nextAuthSecret}`, - `CALENDSO_ENCRYPTION_KEY=${calcomEncryptionKey}`, - ]; - - return { - envs, - domains, - }; -} diff --git a/packages/server/src/templates/directus/docker-compose.yml b/packages/server/src/templates/directus/docker-compose.yml deleted file mode 100644 index 6f058ba6..00000000 --- a/packages/server/src/templates/directus/docker-compose.yml +++ /dev/null @@ -1,47 +0,0 @@ -version: "3.8" -services: - database: - image: postgis/postgis:13-master - volumes: - - directus:/var/lib/postgresql/data - networks: - - dokploy-network - environment: - POSTGRES_USER: "directus" - POSTGRES_PASSWORD: "directus" - POSTGRES_DB: "directus" - - cache: - image: redis:6 - networks: - - dokploy-network - - directus: - image: directus/directus:10.12.1 - ports: - - 8055 - volumes: - - ../files/uploads:/directus/uploads - - ../files/extensions:/directus/extensions - depends_on: - - cache - - database - environment: - SECRET: "replace-with-secure-random-value" - - DB_CLIENT: "pg" - DB_HOST: "database" - DB_PORT: "5432" - DB_DATABASE: "directus" - DB_USER: "directus" - DB_PASSWORD: "directus" - - CACHE_ENABLED: "true" - CACHE_AUTO_PURGE: "true" - CACHE_STORE: "redis" - REDIS: "redis://cache:6379" - - ADMIN_EMAIL: "admin@example.com" - ADMIN_PASSWORD: "d1r3ctu5" -volumes: - directus: diff --git a/packages/server/src/templates/directus/index.ts b/packages/server/src/templates/directus/index.ts deleted file mode 100644 index 42a05aee..00000000 --- a/packages/server/src/templates/directus/index.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { - type DomainSchema, - type Schema, - type Template, - generateRandomDomain, -} from "../utils"; - -export function generate(schema: Schema): Template { - const domains: DomainSchema[] = [ - { - host: generateRandomDomain(schema), - port: 8055, - serviceName: "directus", - }, - ]; - - return { - domains, - }; -} diff --git a/packages/server/src/templates/documenso/docker-compose.yml b/packages/server/src/templates/documenso/docker-compose.yml deleted file mode 100644 index 562fe498..00000000 --- a/packages/server/src/templates/documenso/docker-compose.yml +++ /dev/null @@ -1,43 +0,0 @@ -version: "3.8" -services: - postgres: - image: postgres:16 - networks: - - dokploy-network - volumes: - - documenso-data:/var/lib/postgresql/data - environment: - - POSTGRES_USER=documenso - - POSTGRES_PASSWORD=password - - POSTGRES_DB=documenso - healthcheck: - test: ["CMD-SHELL", "pg_isready -U documenso"] - interval: 10s - timeout: 5s - retries: 5 - start_period: 10s - - documenso: - image: documenso/documenso:v1.5.6-rc.2 - depends_on: - postgres: - condition: service_healthy - environment: - - PORT=${DOCUMENSO_PORT} - - NEXTAUTH_URL=http://${DOCUMENSO_HOST} - - NEXTAUTH_SECRET=${NEXTAUTH_SECRET} - - NEXT_PRIVATE_ENCRYPTION_KEY=${NEXT_PRIVATE_ENCRYPTION_KEY} - - NEXT_PRIVATE_ENCRYPTION_SECONDARY_KEY=${NEXT_PRIVATE_ENCRYPTION_SECONDARY_KEY} - - NEXT_PUBLIC_WEBAPP_URL=http://${DOCUMENSO_HOST} - - NEXT_PRIVATE_DATABASE_URL=postgres://documenso:password@postgres:5432/documenso - - NEXT_PRIVATE_DIRECT_DATABASE_URL=postgres://documenso:password@postgres:5432/documenso - - NEXT_PUBLIC_UPLOAD_TRANSPORT=database - - NEXT_PRIVATE_SMTP_TRANSPORT=smtp-auth - - NEXT_PRIVATE_SIGNING_LOCAL_FILE_PATH=/opt/documenso/cert.p12 - ports: - - ${DOCUMENSO_PORT} - volumes: - - /opt/documenso/cert.p12:/opt/documenso/cert.p12 - -volumes: - documenso-data: diff --git a/packages/server/src/templates/documenso/index.ts b/packages/server/src/templates/documenso/index.ts deleted file mode 100644 index c70d1db4..00000000 --- a/packages/server/src/templates/documenso/index.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { - type DomainSchema, - type Schema, - type Template, - generateBase64, - generatePassword, - generateRandomDomain, -} from "../utils"; - -export function generate(schema: Schema): Template { - const mainDomain = generateRandomDomain(schema); - const nextAuthSecret = generateBase64(32); - const documensoEncryptionKey = generatePassword(32); - const documensoSecondaryEncryptionKey = generatePassword(64); - - const domains: DomainSchema[] = [ - { - host: mainDomain, - port: 3000, - serviceName: "documenso", - }, - ]; - - const envs = [ - `DOCUMENSO_HOST=${mainDomain}`, - "DOCUMENSO_PORT=3000", - `NEXTAUTH_SECRET=${nextAuthSecret}`, - `NEXT_PRIVATE_ENCRYPTION_KEY=${documensoEncryptionKey}`, - `NEXT_PRIVATE_ENCRYPTION_SECONDARY_KEY=${documensoSecondaryEncryptionKey}`, - ]; - - return { - envs, - domains, - }; -} diff --git a/packages/server/src/templates/doublezero/docker-compose.yml b/packages/server/src/templates/doublezero/docker-compose.yml deleted file mode 100644 index 35247033..00000000 --- a/packages/server/src/templates/doublezero/docker-compose.yml +++ /dev/null @@ -1,19 +0,0 @@ -services: - doublezero: - restart: always - image: liltechnomancer/double-zero:0.2.1 - volumes: - - db-data:/var/lib/doublezero/data - environment: - AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID} - AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY} - AWS_REGION: ${AWS_REGION} - SQS_URL: ${SQS_URL} - SYSTEM_EMAIL: ${SYSTEM_EMAIL} - SECRET_KEY_BASE: ${SECRET_KEY_BASE} - PHX_HOST: ${DOUBLEZERO_HOST} - DATABASE_PATH: ./00.db - -volumes: - db-data: - driver: local diff --git a/packages/server/src/templates/doublezero/index.ts b/packages/server/src/templates/doublezero/index.ts deleted file mode 100644 index fa774e9d..00000000 --- a/packages/server/src/templates/doublezero/index.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { - type DomainSchema, - type Schema, - type Template, - generateBase64, - generateRandomDomain, -} from "../utils"; - -export function generate(schema: Schema): Template { - const mainDomain = generateRandomDomain(schema); - const secretKeyBase = generateBase64(64); - - const domains: DomainSchema[] = [ - { - host: mainDomain, - port: 4000, - serviceName: "doublezero", - }, - ]; - - const envs = [ - `DOUBLEZERO_HOST=${mainDomain}`, - "DOUBLEZERO_PORT=4000", - `SECRET_KEY_BASE=${secretKeyBase}`, - "AWS_ACCESS_KEY_ID=your-aws-access-key", - "AWS_SECRET_ACCESS_KEY=your-aws-secret-key", - "AWS_REGION=your-aws-region", - "SQS_URL=your-aws-sqs-url", - "SYSTEM_EMAIL=", - ]; - - return { - envs, - domains, - }; -} diff --git a/packages/server/src/templates/excalidraw/docker-compose.yml b/packages/server/src/templates/excalidraw/docker-compose.yml deleted file mode 100644 index 8743434b..00000000 --- a/packages/server/src/templates/excalidraw/docker-compose.yml +++ /dev/null @@ -1,7 +0,0 @@ -version: "3.8" - -services: - excalidraw: - networks: - - dokploy-network - image: excalidraw/excalidraw:latest diff --git a/packages/server/src/templates/excalidraw/index.ts b/packages/server/src/templates/excalidraw/index.ts deleted file mode 100644 index 13a43c44..00000000 --- a/packages/server/src/templates/excalidraw/index.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { - type DomainSchema, - type Schema, - type Template, - generateHash, - generateRandomDomain, -} from "../utils"; - -export function generate(schema: Schema): Template { - const mainDomain = generateRandomDomain(schema); - - const domains: DomainSchema[] = [ - { - host: mainDomain, - port: 80, - serviceName: "excalidraw", - }, - ]; - - return { - domains, - }; -} diff --git a/packages/server/src/templates/ghost/docker-compose.yml b/packages/server/src/templates/ghost/docker-compose.yml deleted file mode 100644 index 288c59e5..00000000 --- a/packages/server/src/templates/ghost/docker-compose.yml +++ /dev/null @@ -1,29 +0,0 @@ -version: "3.8" -services: - ghost: - image: ghost:5-alpine - restart: always - environment: - database__client: mysql - database__connection__host: db - database__connection__user: root - database__connection__password: example - database__connection__database: ghost - url: http://${GHOST_HOST} - - volumes: - - ghost:/var/lib/ghost/content - - db: - image: mysql:8.0 - restart: always - networks: - - dokploy-network - environment: - MYSQL_ROOT_PASSWORD: example - volumes: - - db:/var/lib/mysql - -volumes: - ghost: - db: diff --git a/packages/server/src/templates/ghost/index.ts b/packages/server/src/templates/ghost/index.ts deleted file mode 100644 index 1a88c362..00000000 --- a/packages/server/src/templates/ghost/index.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { - type DomainSchema, - type Schema, - type Template, - generateHash, - generateRandomDomain, -} from "../utils"; - -export function generate(schema: Schema): Template { - const mainDomain = generateRandomDomain(schema); - - const domains: DomainSchema[] = [ - { - host: mainDomain, - port: 2368, - serviceName: "ghost", - }, - ]; - const envs = [`GHOST_HOST=${mainDomain}`]; - - return { - envs, - domains, - }; -} diff --git a/packages/server/src/templates/gitea/docker-compose.yml b/packages/server/src/templates/gitea/docker-compose.yml deleted file mode 100644 index 679936fb..00000000 --- a/packages/server/src/templates/gitea/docker-compose.yml +++ /dev/null @@ -1,37 +0,0 @@ -version: "3.8" -services: - gitea: - image: gitea/gitea:1.22.2 - environment: - - USER_UID=${USER_UID} - - USER_GID=${USER_GID} - - GITEA__database__DB_TYPE=postgres - - GITEA__database__HOST=db:5432 - - GITEA__database__NAME=gitea - - GITEA__database__USER=gitea - - GITEA__database__PASSWD=gitea - restart: always - networks: - - dokploy-network - volumes: - - gitea_server:/data - - /etc/timezone:/etc/timezone:ro - - /etc/localtime:/etc/localtime:ro - depends_on: - - db - - db: - image: postgres:16 - restart: always - environment: - - POSTGRES_USER=gitea - - POSTGRES_PASSWORD=gitea - - POSTGRES_DB=gitea - networks: - - dokploy-network - volumes: - - gitea_db:/var/lib/postgresql/data - -volumes: - gitea_db: - gitea_server: \ No newline at end of file diff --git a/packages/server/src/templates/gitea/index.ts b/packages/server/src/templates/gitea/index.ts deleted file mode 100644 index 92a20df6..00000000 --- a/packages/server/src/templates/gitea/index.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { - type DomainSchema, - type Schema, - type Template, - generateRandomDomain, -} from "../utils"; - -export function generate(schema: Schema): Template { - const mainDomain = generateRandomDomain(schema); - - const domains: DomainSchema[] = [ - { - host: mainDomain, - port: 3000, - serviceName: "gitea", - }, - ]; - const envs = ["USER_UID=1000", "USER_GID=1000"]; - - return { - envs, - domains, - }; -} diff --git a/packages/server/src/templates/glitchtip/docker-compose.yml b/packages/server/src/templates/glitchtip/docker-compose.yml deleted file mode 100644 index e45c7662..00000000 --- a/packages/server/src/templates/glitchtip/docker-compose.yml +++ /dev/null @@ -1,59 +0,0 @@ -x-environment: &default-environment - DATABASE_URL: postgres://postgres:postgres@postgres:5432/postgres - SECRET_KEY: ${SECRET_KEY} - PORT: ${GLITCHTIP_PORT} - EMAIL_URL: consolemail:// - GLITCHTIP_DOMAIN: http://${GLITCHTIP_HOST} - DEFAULT_FROM_EMAIL: email@glitchtip.com - CELERY_WORKER_AUTOSCALE: "1,3" - CELERY_WORKER_MAX_TASKS_PER_CHILD: "10000" - -x-depends_on: &default-depends_on - - postgres - - redis - -services: - postgres: - image: postgres:16 - environment: - POSTGRES_HOST_AUTH_METHOD: "trust" - restart: unless-stopped - volumes: - - pg-data:/var/lib/postgresql/data - networks: - - dokploy-network - redis: - image: redis - restart: unless-stopped - networks: - - dokploy-network - web: - image: glitchtip/glitchtip:v4.0 - depends_on: *default-depends_on - ports: - - ${GLITCHTIP_PORT} - environment: *default-environment - restart: unless-stopped - volumes: - - uploads:/code/uploads - worker: - image: glitchtip/glitchtip:v4.0 - command: ./bin/run-celery-with-beat.sh - depends_on: *default-depends_on - environment: *default-environment - restart: unless-stopped - volumes: - - uploads:/code/uploads - networks: - - dokploy-network - migrate: - image: glitchtip/glitchtip:v4.0 - depends_on: *default-depends_on - command: "./manage.py migrate" - environment: *default-environment - networks: - - dokploy-network - -volumes: - pg-data: - uploads: diff --git a/packages/server/src/templates/glitchtip/index.ts b/packages/server/src/templates/glitchtip/index.ts deleted file mode 100644 index 093d752e..00000000 --- a/packages/server/src/templates/glitchtip/index.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { - type DomainSchema, - type Schema, - type Template, - generateBase64, - generateRandomDomain, -} from "../utils"; - -export function generate(schema: Schema): Template { - const mainDomain = generateRandomDomain(schema); - const secretKey = generateBase64(32); - - const domains: DomainSchema[] = [ - { - host: mainDomain, - port: 8000, - serviceName: "web", - }, - ]; - const envs = [ - `GLITCHTIP_HOST=${mainDomain}`, - "GLITCHTIP_PORT=8000", - `SECRET_KEY=${secretKey}`, - ]; - - return { - envs, - domains, - }; -} diff --git a/packages/server/src/templates/grafana/docker-compose.yml b/packages/server/src/templates/grafana/docker-compose.yml deleted file mode 100644 index 9d913c17..00000000 --- a/packages/server/src/templates/grafana/docker-compose.yml +++ /dev/null @@ -1,9 +0,0 @@ -version: "3.8" -services: - grafana: - image: grafana/grafana-enterprise:9.5.20 - restart: unless-stopped - volumes: - - grafana-storage:/var/lib/grafana -volumes: - grafana-storage: {} diff --git a/packages/server/src/templates/grafana/index.ts b/packages/server/src/templates/grafana/index.ts deleted file mode 100644 index fb614ef3..00000000 --- a/packages/server/src/templates/grafana/index.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { - type DomainSchema, - type Schema, - type Template, - generateRandomDomain, -} from "../utils"; - -export function generate(schema: Schema): Template { - const domains: DomainSchema[] = [ - { - host: generateRandomDomain(schema), - port: 3000, - serviceName: "grafana", - }, - ]; - return { - domains, - }; -} diff --git a/packages/server/src/templates/jellyfin/docker-compose.yml b/packages/server/src/templates/jellyfin/docker-compose.yml deleted file mode 100644 index cb61476a..00000000 --- a/packages/server/src/templates/jellyfin/docker-compose.yml +++ /dev/null @@ -1,19 +0,0 @@ -version: "3.8" -services: - jellyfin: - image: jellyfin/jellyfin:10 - volumes: - - config:/config - - cache:/cache - - media:/media - restart: "unless-stopped" - # Optional - alternative address used for autodiscovery - environment: - - JELLYFIN_PublishedServerUrl=http://${JELLYFIN_HOST} - # Optional - may be necessary for docker healthcheck to pass if running in host network mode - extra_hosts: - - "host.docker.internal:host-gateway" -volumes: - config: - cache: - media: diff --git a/packages/server/src/templates/jellyfin/index.ts b/packages/server/src/templates/jellyfin/index.ts deleted file mode 100644 index 61c9c9b7..00000000 --- a/packages/server/src/templates/jellyfin/index.ts +++ /dev/null @@ -1,25 +0,0 @@ -// EXAMPLE -import { - type DomainSchema, - type Schema, - type Template, - generateRandomDomain, -} from "../utils"; - -export function generate(schema: Schema): Template { - const domain = generateRandomDomain(schema); - const domains: DomainSchema[] = [ - { - host: domain, - port: 8096, - serviceName: "jellyfin", - }, - ]; - - const envs = [`JELLYFIN_HOST=${domain}`]; - - return { - envs, - domains, - }; -} diff --git a/packages/server/src/templates/listmonk/docker-compose.yml b/packages/server/src/templates/listmonk/docker-compose.yml deleted file mode 100644 index 725d0a09..00000000 --- a/packages/server/src/templates/listmonk/docker-compose.yml +++ /dev/null @@ -1,49 +0,0 @@ -services: - db: - image: postgres:13 - ports: - - 5432 - networks: - - dokploy-network - environment: - - POSTGRES_PASSWORD=listmonk - - POSTGRES_USER=listmonk - - POSTGRES_DB=listmonk - restart: unless-stopped - healthcheck: - test: ["CMD-SHELL", "pg_isready -U listmonk"] - interval: 10s - timeout: 5s - retries: 6 - volumes: - - listmonk-data:/var/lib/postgresql/data - - setup: - image: listmonk/listmonk:v3.0.0 - networks: - - dokploy-network - volumes: - - ../files/config.toml:/listmonk/config.toml - depends_on: - - db - command: - [ - sh, - -c, - "sleep 3 && ./listmonk --install --idempotent --yes --config config.toml", - ] - - app: - restart: unless-stopped - image: listmonk/listmonk:v3.0.0 - environment: - - TZ=Etc/UTC - depends_on: - - db - - setup - volumes: - - ../files/config.toml:/listmonk/config.toml - -volumes: - listmonk-data: - driver: local diff --git a/packages/server/src/templates/listmonk/index.ts b/packages/server/src/templates/listmonk/index.ts deleted file mode 100644 index 725659ca..00000000 --- a/packages/server/src/templates/listmonk/index.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { - type DomainSchema, - type Schema, - type Template, - generatePassword, - generateRandomDomain, -} from "../utils"; - -export function generate(schema: Schema): Template { - const randomDomain = generateRandomDomain(schema); - const adminPassword = generatePassword(32); - - const domains: DomainSchema[] = [ - { - host: randomDomain, - port: 9000, - serviceName: "app", - }, - ]; - - const envs = [ - `# login with admin:${adminPassword}`, - "# check config.toml in Advanced / Volumes for more options", - ]; - - const mounts: Template["mounts"] = [ - { - filePath: "config.toml", - content: `[app] -address = "0.0.0.0:9000" - -admin_username = "admin" -admin_password = "${adminPassword}" - -[db] -host = "db" -port = 5432 -user = "listmonk" -password = "listmonk" -database = "listmonk" - -ssl_mode = "disable" -max_open = 25 -max_idle = 25 -max_lifetime = "300s" - -params = "" -`, - }, - ]; - - return { - envs, - mounts, - domains, - }; -} diff --git a/packages/server/src/templates/meilisearch/docker-compose.yml b/packages/server/src/templates/meilisearch/docker-compose.yml deleted file mode 100644 index ae5ebcb1..00000000 --- a/packages/server/src/templates/meilisearch/docker-compose.yml +++ /dev/null @@ -1,14 +0,0 @@ -version: "3.8" - -services: - meilisearch: - image: getmeili/meilisearch:v1.8.3 - volumes: - - meili_data:/meili_data - environment: - MEILI_MASTER_KEY: ${MEILI_MASTER_KEY} - MEILI_ENV: ${MEILI_ENV} - -volumes: - meili_data: - driver: local diff --git a/packages/server/src/templates/meilisearch/index.ts b/packages/server/src/templates/meilisearch/index.ts deleted file mode 100644 index cfb8a9a4..00000000 --- a/packages/server/src/templates/meilisearch/index.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { - type DomainSchema, - type Schema, - type Template, - generateBase64, - generateRandomDomain, -} from "../utils"; - -export function generate(schema: Schema): Template { - const mainDomain = generateRandomDomain(schema); - const masterKey = generateBase64(32); - - const domains: DomainSchema[] = [ - { - host: mainDomain, - port: 7700, - serviceName: "meilisearch", - }, - ]; - const envs = ["MEILI_ENV=development", `MEILI_MASTER_KEY=${masterKey}`]; - - return { - envs, - domains, - }; -} diff --git a/packages/server/src/templates/metabase/docker-compose.yml b/packages/server/src/templates/metabase/docker-compose.yml deleted file mode 100644 index 4dca4d01..00000000 --- a/packages/server/src/templates/metabase/docker-compose.yml +++ /dev/null @@ -1,26 +0,0 @@ -version: "3.8" -services: - metabase: - image: metabase/metabase:v0.50.8 - volumes: - - /dev/urandom:/dev/random:ro - environment: - MB_DB_TYPE: postgres - MB_DB_DBNAME: metabaseappdb - MB_DB_PORT: 5432 - MB_DB_USER: metabase - MB_DB_PASS: mysecretpassword - MB_DB_HOST: postgres - healthcheck: - test: curl --fail -I http://localhost:3000/api/health || exit 1 - interval: 15s - timeout: 5s - retries: 5 - postgres: - image: postgres:14 - environment: - POSTGRES_USER: metabase - POSTGRES_DB: metabaseappdb - POSTGRES_PASSWORD: mysecretpassword - networks: - - dokploy-network diff --git a/packages/server/src/templates/metabase/index.ts b/packages/server/src/templates/metabase/index.ts deleted file mode 100644 index 0a08916e..00000000 --- a/packages/server/src/templates/metabase/index.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { - type DomainSchema, - type Schema, - type Template, - generateRandomDomain, -} from "../utils"; - -export function generate(schema: Schema): Template { - const randomDomain = generateRandomDomain(schema); - - const domains: DomainSchema[] = [ - { - host: randomDomain, - port: 3000, - serviceName: "metabase", - }, - ]; - - return { - domains, - }; -} diff --git a/packages/server/src/templates/minio/docker-compose.yml b/packages/server/src/templates/minio/docker-compose.yml deleted file mode 100644 index 4b24bbcc..00000000 --- a/packages/server/src/templates/minio/docker-compose.yml +++ /dev/null @@ -1,13 +0,0 @@ -version: "3.8" -services: - minio: - image: minio/minio - volumes: - - minio-data:/data - environment: - - MINIO_ROOT_USER=minioadmin - - MINIO_ROOT_PASSWORD=minioadmin123 - command: server /data --console-address ":9001" - -volumes: - minio-data: diff --git a/packages/server/src/templates/minio/index.ts b/packages/server/src/templates/minio/index.ts deleted file mode 100644 index 1345aafd..00000000 --- a/packages/server/src/templates/minio/index.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { - type DomainSchema, - type Schema, - type Template, - generateRandomDomain, -} from "../utils"; - -export function generate(schema: Schema): Template { - const mainDomain = generateRandomDomain(schema); - const apiDomain = generateRandomDomain(schema); - - const domains: DomainSchema[] = [ - { - host: mainDomain, - port: 9001, - serviceName: "minio", - }, - { - host: apiDomain, - port: 9000, - serviceName: "minio", - }, - ]; - - return { - domains, - }; -} diff --git a/packages/server/src/templates/n8n/docker-compose.yml b/packages/server/src/templates/n8n/docker-compose.yml deleted file mode 100644 index f8fb1f16..00000000 --- a/packages/server/src/templates/n8n/docker-compose.yml +++ /dev/null @@ -1,18 +0,0 @@ -version: "3.8" -services: - n8n: - image: docker.n8n.io/n8nio/n8n:1.48.1 - restart: always - environment: - - N8N_HOST=${N8N_HOST} - - N8N_PORT=${N8N_PORT} - - N8N_PROTOCOL=http - - NODE_ENV=production - - WEBHOOK_URL=https://${N8N_HOST}/ - - GENERIC_TIMEZONE=${GENERIC_TIMEZONE} - - N8N_SECURE_COOKIE=false - volumes: - - n8n_data:/home/node/.n8n - -volumes: - n8n_data: diff --git a/packages/server/src/templates/n8n/index.ts b/packages/server/src/templates/n8n/index.ts deleted file mode 100644 index da93c025..00000000 --- a/packages/server/src/templates/n8n/index.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { - type DomainSchema, - type Schema, - type Template, - generateRandomDomain, -} from "../utils"; - -export function generate(schema: Schema): Template { - const mainDomain = generateRandomDomain(schema); - - const domains: DomainSchema[] = [ - { - host: mainDomain, - port: 5678, - serviceName: "n8n", - }, - ]; - const envs = [ - `N8N_HOST=${mainDomain}`, - "N8N_PORT=5678", - "GENERIC_TIMEZONE=Europe/Berlin", - ]; - - return { - envs, - domains, - }; -} diff --git a/packages/server/src/templates/nocodb/docker-compose.yml b/packages/server/src/templates/nocodb/docker-compose.yml deleted file mode 100644 index 726cf5e6..00000000 --- a/packages/server/src/templates/nocodb/docker-compose.yml +++ /dev/null @@ -1,32 +0,0 @@ -version: "3.8" -services: - nocodb: - image: nocodb/nocodb:0.251.1 - restart: always - environment: - NC_DB: "pg://root_db?u=postgres&p=password&d=root_db" - PORT: ${NOCODB_PORT} - NC_REDIS_URL: ${NC_REDIS_URL} - volumes: - - nc_data:/usr/app/data - - root_db: - image: postgres:14.7 - restart: always - networks: - - dokploy-network - environment: - POSTGRES_DB: root_db - POSTGRES_PASSWORD: password - POSTGRES_USER: postgres - healthcheck: - interval: 10s - retries: 10 - test: 'pg_isready -U "$$POSTGRES_USER" -d "$$POSTGRES_DB"' - timeout: 2s - volumes: - - "db_data:/var/lib/postgresql/data" - -volumes: - db_data: {} - nc_data: {} diff --git a/packages/server/src/templates/nocodb/index.ts b/packages/server/src/templates/nocodb/index.ts deleted file mode 100644 index 60620dbd..00000000 --- a/packages/server/src/templates/nocodb/index.ts +++ /dev/null @@ -1,28 +0,0 @@ -// EXAMPLE -import { - type DomainSchema, - type Schema, - type Template, - generateBase64, - generateRandomDomain, -} from "../utils"; - -export function generate(schema: Schema): Template { - const randomDomain = generateRandomDomain(schema); - const secretBase = generateBase64(64); - - const domains: DomainSchema[] = [ - { - host: randomDomain, - port: 8000, - serviceName: "nocodb", - }, - ]; - - const envs = ["NOCODB_PORT=8000", `NC_AUTH_JWT_SECRET=${secretBase}`]; - - return { - envs, - domains, - }; -} diff --git a/packages/server/src/templates/odoo/docker-compose.yml b/packages/server/src/templates/odoo/docker-compose.yml deleted file mode 100644 index 80b34f0c..00000000 --- a/packages/server/src/templates/odoo/docker-compose.yml +++ /dev/null @@ -1,29 +0,0 @@ -version: "3.8" -services: - web: - image: odoo:16.0 - depends_on: - - db - environment: - - HOST=db - - USER=odoo - - PASSWORD=odoo - volumes: - - odoo-web-data:/var/lib/odoo - - ../files/config:/etc/odoo - - ../files/addons:/mnt/extra-addons - - db: - image: postgres:13 - networks: - - dokploy-network - environment: - - POSTGRES_DB=postgres - - POSTGRES_USER=odoo - - POSTGRES_PASSWORD=odoo - volumes: - - odoo-db-data:/var/lib/postgresql/data - -volumes: - odoo-web-data: - odoo-db-data: diff --git a/packages/server/src/templates/odoo/index.ts b/packages/server/src/templates/odoo/index.ts deleted file mode 100644 index 904293c1..00000000 --- a/packages/server/src/templates/odoo/index.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { - type DomainSchema, - type Schema, - type Template, - generateRandomDomain, -} from "../utils"; - -export function generate(schema: Schema): Template { - const randomDomain = generateRandomDomain(schema); - - const domains: DomainSchema[] = [ - { - host: randomDomain, - port: 8069, - serviceName: "web", - }, - ]; - - return { - domains, - }; -} diff --git a/packages/server/src/templates/open-webui/docker-compose.yml b/packages/server/src/templates/open-webui/docker-compose.yml deleted file mode 100644 index d396dacc..00000000 --- a/packages/server/src/templates/open-webui/docker-compose.yml +++ /dev/null @@ -1,26 +0,0 @@ -version: "3.8" -services: - ollama: - volumes: - - ollama:/root/.ollama - networks: - - dokploy-network - pull_policy: always - tty: true - restart: unless-stopped - image: ollama/ollama:${OLLAMA_DOCKER_TAG-latest} - - open-webui: - image: ghcr.io/open-webui/open-webui:${WEBUI_DOCKER_TAG-main} - volumes: - - open-webui:/app/backend/data - depends_on: - - ollama - environment: - - "OLLAMA_BASE_URL=http://ollama:11434" - - "WEBUI_SECRET_KEY=" - restart: unless-stopped - -volumes: - ollama: {} - open-webui: {} diff --git a/packages/server/src/templates/open-webui/index.ts b/packages/server/src/templates/open-webui/index.ts deleted file mode 100644 index 0431c2a1..00000000 --- a/packages/server/src/templates/open-webui/index.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { - type DomainSchema, - type Schema, - type Template, - generateRandomDomain, -} from "../utils"; - -export function generate(schema: Schema): Template { - const randomDomain = generateRandomDomain(schema); - - const domains: DomainSchema[] = [ - { - host: randomDomain, - port: 8080, - serviceName: "open-webui", - }, - ]; - const envs = ["OLLAMA_DOCKER_TAG=0.1.47", "WEBUI_DOCKER_TAG=0.3.7"]; - - return { - envs, - domains, - }; -} diff --git a/packages/server/src/templates/phpmyadmin/docker-compose.yml b/packages/server/src/templates/phpmyadmin/docker-compose.yml deleted file mode 100644 index 1f775f09..00000000 --- a/packages/server/src/templates/phpmyadmin/docker-compose.yml +++ /dev/null @@ -1,28 +0,0 @@ -version: "3.8" - -services: - db: - image: mysql:5.7 - environment: - MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} - MYSQL_DATABASE: tu_base_de_datos - MYSQL_USER: ${MYSQL_USER} - MYSQL_PASSWORD: ${MYSQL_PASSWORD} - volumes: - - db_data:/var/lib/mysql - networks: - - dokploy-network - - phpmyadmin: - image: phpmyadmin/phpmyadmin:5.2.1 - environment: - PMA_HOST: db - PMA_USER: ${MYSQL_USER} - PMA_PASSWORD: ${MYSQL_PASSWORD} - PMA_ARBITRARY: 1 - depends_on: - - db - -volumes: - db_data: - driver: local diff --git a/packages/server/src/templates/phpmyadmin/index.ts b/packages/server/src/templates/phpmyadmin/index.ts deleted file mode 100644 index e1c976b9..00000000 --- a/packages/server/src/templates/phpmyadmin/index.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { - type DomainSchema, - type Schema, - type Template, - generatePassword, - generateRandomDomain, -} from "../utils"; - -export function generate(schema: Schema): Template { - const mainDomain = generateRandomDomain(schema); - const rootPassword = generatePassword(32); - const password = generatePassword(32); - - const domains: DomainSchema[] = [ - { - host: mainDomain, - port: 80, - serviceName: "phpmyadmin", - }, - ]; - const envs = [ - `MYSQL_ROOT_PASSWORD=${rootPassword}`, - "MYSQL_DATABASE=mysql", - "MYSQL_USER=phpmyadmin", - `MYSQL_PASSWORD=${password}`, - ]; - - return { - envs, - domains, - }; -} diff --git a/packages/server/src/templates/plausible/docker-compose.yml b/packages/server/src/templates/plausible/docker-compose.yml deleted file mode 100644 index 62ce5ece..00000000 --- a/packages/server/src/templates/plausible/docker-compose.yml +++ /dev/null @@ -1,44 +0,0 @@ -version: "3.8" -services: - plausible_db: - image: postgres:16-alpine - restart: always - networks: - - dokploy-network - volumes: - - db-data:/var/lib/postgresql/data - environment: - - POSTGRES_PASSWORD=postgres - - plausible_events_db: - image: clickhouse/clickhouse-server:24.3.3.102-alpine - restart: always - networks: - - dokploy-network - volumes: - - event-data:/var/lib/clickhouse - - event-logs:/var/log/clickhouse-server - - ../files/clickhouse/clickhouse-config.xml:/etc/clickhouse-server/config.d/logging.xml:ro - - ../files/clickhouse/clickhouse-user-config.xml:/etc/clickhouse-server/users.d/logging.xml:ro - ulimits: - nofile: - soft: 262144 - hard: 262144 - - plausible: - image: ghcr.io/plausible/community-edition:v2.1.0 - restart: always - command: sh -c "sleep 10 && /entrypoint.sh db createdb && /entrypoint.sh db migrate && /entrypoint.sh run" - depends_on: - - plausible_db - - plausible_events_db - env_file: - - .env - -volumes: - db-data: - driver: local - event-data: - driver: local - event-logs: - driver: local diff --git a/packages/server/src/templates/plausible/index.ts b/packages/server/src/templates/plausible/index.ts deleted file mode 100644 index 2bd1212b..00000000 --- a/packages/server/src/templates/plausible/index.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { - type DomainSchema, - type Schema, - type Template, - generateBase64, - generateRandomDomain, -} from "../utils"; - -export function generate(schema: Schema): Template { - const mainDomain = generateRandomDomain(schema); - const secretBase = generateBase64(64); - const toptKeyBase = generateBase64(32); - - const domains: DomainSchema[] = [ - { - host: mainDomain, - port: 8000, - serviceName: "plausible", - }, - ]; - - const envs = [ - `BASE_URL=http://${mainDomain}`, - `SECRET_KEY_BASE=${secretBase}`, - `TOTP_VAULT_KEY=${toptKeyBase}`, - ]; - - const mounts: Template["mounts"] = [ - { - filePath: "/clickhouse/clickhouse-config.xml", - content: ` - - - warning - true - - - - - - - - - - - - - - `, - }, - { - filePath: "/clickhouse/clickhouse-user-config.xml", - content: ` - - - - 0 - 0 - - - - `, - }, - ]; - - return { - envs, - mounts, - domains, - }; -} diff --git a/packages/server/src/templates/pocketbase/docker-compose.yml b/packages/server/src/templates/pocketbase/docker-compose.yml deleted file mode 100644 index fa6674af..00000000 --- a/packages/server/src/templates/pocketbase/docker-compose.yml +++ /dev/null @@ -1,9 +0,0 @@ -version: "3.8" -services: - pocketbase: - image: spectado/pocketbase:0.22.12 - restart: unless-stopped - volumes: - - /etc/dokploy/templates/${HASH}/data:/pb_data - - /etc/dokploy/templates/${HASH}/public:/pb_public - - /etc/dokploy/templates/${HASH}/migrations:/pb_migrations diff --git a/packages/server/src/templates/pocketbase/index.ts b/packages/server/src/templates/pocketbase/index.ts deleted file mode 100644 index f9fc7f8f..00000000 --- a/packages/server/src/templates/pocketbase/index.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { - type DomainSchema, - type Schema, - type Template, - generateRandomDomain, -} from "../utils"; - -export function generate(schema: Schema): Template { - const mainDomain = generateRandomDomain(schema); - - const domains: DomainSchema[] = [ - { - host: mainDomain, - port: 80, - serviceName: "pocketbase", - }, - ]; - - return { - domains, - }; -} diff --git a/packages/server/src/templates/rocketchat/docker-compose.yml b/packages/server/src/templates/rocketchat/docker-compose.yml deleted file mode 100644 index 751bd845..00000000 --- a/packages/server/src/templates/rocketchat/docker-compose.yml +++ /dev/null @@ -1,35 +0,0 @@ -version: "3.8" -services: - rocketchat: - image: registry.rocket.chat/rocketchat/rocket.chat:6.9.2 - restart: always - environment: - MONGO_URL: "mongodb://mongodb:27017/rocketchat?replicaSet=rs0" - MONGO_OPLOG_URL: "mongodb://mongodb:27017/local?replicaSet=rs0" - ROOT_URL: ${ROOT_URL:-http://${ROCKETCHAT_HOST}:${ROCKETCHAT_PORT}} - PORT: ${ROCKETCHAT_PORT} - DEPLOY_METHOD: docker - DEPLOY_PLATFORM: - REG_TOKEN: - depends_on: - - mongodb - - mongodb: - image: docker.io/bitnami/mongodb:5.0 - restart: always - volumes: - - mongodb_data:/bitnami/mongodb - environment: - MONGODB_REPLICA_SET_MODE: primary - MONGODB_REPLICA_SET_NAME: rs0 - MONGODB_PORT_NUMBER: 27017 - MONGODB_INITIAL_PRIMARY_HOST: mongodb - MONGODB_INITIAL_PRIMARY_PORT_NUMBER: 27017 - MONGODB_ADVERTISED_HOSTNAME: mongodb - MONGODB_ENABLE_JOURNAL: true - ALLOW_EMPTY_PASSWORD: yes - networks: - - dokploy-network - -volumes: - mongodb_data: { driver: local } diff --git a/packages/server/src/templates/rocketchat/index.ts b/packages/server/src/templates/rocketchat/index.ts deleted file mode 100644 index 0c10307a..00000000 --- a/packages/server/src/templates/rocketchat/index.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { - type DomainSchema, - type Schema, - type Template, - generateRandomDomain, -} from "../utils"; - -export function generate(schema: Schema): Template { - const mainDomain = generateRandomDomain(schema); - - const domains: DomainSchema[] = [ - { - host: mainDomain, - port: 3000, - serviceName: "rocketchat", - }, - ]; - - const envs = [`ROCKETCHAT_HOST=${mainDomain}`, "ROCKETCHAT_PORT=3000"]; - - return { - envs, - domains, - }; -} diff --git a/packages/server/src/templates/soketi/docker-compose.yml b/packages/server/src/templates/soketi/docker-compose.yml deleted file mode 100644 index 1784cdc7..00000000 --- a/packages/server/src/templates/soketi/docker-compose.yml +++ /dev/null @@ -1,12 +0,0 @@ -version: "3" - -services: - soketi: - image: quay.io/soketi/soketi:1.4-16-debian - container_name: soketi - environment: - SOKETI_DEBUG: "1" - SOKETI_HOST: "0.0.0.0" - SOKETI_PORT: "6001" - SOKETI_METRICS_SERVER_PORT: "9601" - restart: unless-stopped diff --git a/packages/server/src/templates/soketi/index.ts b/packages/server/src/templates/soketi/index.ts deleted file mode 100644 index 47aa461d..00000000 --- a/packages/server/src/templates/soketi/index.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { - type DomainSchema, - type Schema, - type Template, - generateRandomDomain, -} from "../utils"; - -export function generate(schema: Schema): Template { - const mainDomain = generateRandomDomain(schema); - const metricsDomain = generateRandomDomain(schema); - - const domains: DomainSchema[] = [ - { - host: mainDomain, - port: 6001, - serviceName: "soketi", - }, - { - host: metricsDomain, - port: 9601, - serviceName: "soketi", - }, - ]; - - return { - domains, - }; -} diff --git a/packages/server/src/templates/supabase/docker-compose.yml b/packages/server/src/templates/supabase/docker-compose.yml deleted file mode 100644 index e1e187fd..00000000 --- a/packages/server/src/templates/supabase/docker-compose.yml +++ /dev/null @@ -1,460 +0,0 @@ -# Usage -# Start: docker compose up -# With helpers: docker compose -f docker-compose.yml -f ../files/dev/docker-compose.dev.yml up -# Stop: docker compose down -# Destroy: docker compose -f docker-compose.yml -f ../files/dev/docker-compose.dev.yml down -v --remove-orphans - -name: supabase -version: "3.8" - -services: - studio: - container_name: supabase-studio - image: supabase/studio:20240729-ce42139 - networks: - - dokploy-network - restart: unless-stopped - healthcheck: - test: - [ - "CMD", - "node", - "-e", - "require('http').get('http://localhost:3000/api/profile', (r) => {if (r.statusCode !== 200) throw new Error(r.statusCode)})", - ] - timeout: 5s - interval: 5s - retries: 3 - depends_on: - analytics: - condition: service_healthy - environment: - STUDIO_PG_META_URL: http://meta:8080 - POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} - - DEFAULT_ORGANIZATION_NAME: ${STUDIO_DEFAULT_ORGANIZATION} - DEFAULT_PROJECT_NAME: ${STUDIO_DEFAULT_PROJECT} - - SUPABASE_URL: http://kong:8000 - SUPABASE_PUBLIC_URL: http://${SUPABASE_HOST} - SUPABASE_ANON_KEY: ${ANON_KEY} - SUPABASE_SERVICE_KEY: ${SERVICE_ROLE_KEY} - AUTH_JWT_SECRET: ${JWT_SECRET} - - LOGFLARE_API_KEY: ${LOGFLARE_API_KEY} - LOGFLARE_URL: http://analytics:4000 - NEXT_PUBLIC_ENABLE_LOGS: true - # Comment to use Big Query backend for analytics - NEXT_ANALYTICS_BACKEND_PROVIDER: postgres - # Uncomment to use Big Query backend for analytics - # NEXT_ANALYTICS_BACKEND_PROVIDER: bigquery - - kong: - container_name: supabase-kong - image: kong:2.8.1 - restart: unless-stopped - networks: - - dokploy-network - # https://unix.stackexchange.com/a/294837 - entrypoint: bash -c 'eval "echo \"$$(cat ~/temp.yml)\"" > ~/kong.yml && /docker-entrypoint.sh kong docker-start' - #ports: - # - ${KONG_HTTP_PORT}:8000/tcp - # - ${KONG_HTTPS_PORT}:8443/tcp - expose: - - 8000 - - 8443 - depends_on: - analytics: - condition: service_healthy - environment: - KONG_DATABASE: "off" - KONG_DECLARATIVE_CONFIG: /home/kong/kong.yml - # https://github.com/supabase/cli/issues/14 - KONG_DNS_ORDER: LAST,A,CNAME - KONG_PLUGINS: request-transformer,cors,key-auth,acl,basic-auth - KONG_NGINX_PROXY_PROXY_BUFFER_SIZE: 160k - KONG_NGINX_PROXY_PROXY_BUFFERS: 64 160k - SUPABASE_ANON_KEY: ${ANON_KEY} - SUPABASE_SERVICE_KEY: ${SERVICE_ROLE_KEY} - DASHBOARD_USERNAME: ${DASHBOARD_USERNAME} - DASHBOARD_PASSWORD: ${DASHBOARD_PASSWORD} - volumes: - # https://github.com/supabase/supabase/issues/12661 - - ../files/volumes/api/kong.yml:/home/kong/temp.yml:ro - - auth: - container_name: supabase-auth - image: supabase/gotrue:v2.158.1 - networks: - - dokploy-network - depends_on: - db: - # Disable this if you are using an external Postgres database - condition: service_healthy - analytics: - condition: service_healthy - healthcheck: - test: - [ - "CMD", - "wget", - "--no-verbose", - "--tries=1", - "--spider", - "http://localhost:9999/health", - ] - timeout: 5s - interval: 5s - retries: 3 - restart: unless-stopped - environment: - GOTRUE_API_HOST: 0.0.0.0 - GOTRUE_API_PORT: 9999 - API_EXTERNAL_URL: http://${SUPABASE_HOST} - - GOTRUE_DB_DRIVER: postgres - GOTRUE_DB_DATABASE_URL: postgres://supabase_auth_admin:${POSTGRES_PASSWORD}@${POSTGRES_HOSTNAME}:${POSTGRES_PORT}/${POSTGRES_DB} - - GOTRUE_SITE_URL: http://${SUPABASE_HOST} - GOTRUE_URI_ALLOW_LIST: ${ADDITIONAL_REDIRECT_URLS} - GOTRUE_DISABLE_SIGNUP: ${DISABLE_SIGNUP} - - GOTRUE_JWT_ADMIN_ROLES: service_role - GOTRUE_JWT_AUD: authenticated - GOTRUE_JWT_DEFAULT_GROUP_NAME: authenticated - GOTRUE_JWT_EXP: ${JWT_EXPIRY} - GOTRUE_JWT_SECRET: ${JWT_SECRET} - - GOTRUE_EXTERNAL_EMAIL_ENABLED: ${ENABLE_EMAIL_SIGNUP} - GOTRUE_EXTERNAL_ANONYMOUS_USERS_ENABLED: ${ENABLE_ANONYMOUS_USERS} - GOTRUE_MAILER_AUTOCONFIRM: ${ENABLE_EMAIL_AUTOCONFIRM} - # GOTRUE_MAILER_SECURE_EMAIL_CHANGE_ENABLED: true - # GOTRUE_SMTP_MAX_FREQUENCY: 1s - GOTRUE_SMTP_ADMIN_EMAIL: ${SMTP_ADMIN_EMAIL} - GOTRUE_SMTP_HOST: ${SMTP_HOSTNAME} - GOTRUE_SMTP_PORT: ${SMTP_PORT} - GOTRUE_SMTP_USER: ${SMTP_USER} - GOTRUE_SMTP_PASS: ${SMTP_PASS} - GOTRUE_SMTP_SENDER_NAME: ${SMTP_SENDER_NAME} - GOTRUE_MAILER_URLPATHS_INVITE: ${MAILER_URLPATHS_INVITE} - GOTRUE_MAILER_URLPATHS_CONFIRMATION: ${MAILER_URLPATHS_CONFIRMATION} - GOTRUE_MAILER_URLPATHS_RECOVERY: ${MAILER_URLPATHS_RECOVERY} - GOTRUE_MAILER_URLPATHS_EMAIL_CHANGE: ${MAILER_URLPATHS_EMAIL_CHANGE} - - GOTRUE_EXTERNAL_PHONE_ENABLED: ${ENABLE_PHONE_SIGNUP} - GOTRUE_SMS_AUTOCONFIRM: ${ENABLE_PHONE_AUTOCONFIRM} - # Uncomment to enable custom access token hook. You'll need to create a public.custom_access_token_hook function and grant necessary permissions. - # See: https://supabase.com/docs/guides/auth/auth-hooks#hook-custom-access-token for details - # GOTRUE_HOOK_CUSTOM_ACCESS_TOKEN_ENABLED="true" - # GOTRUE_HOOK_CUSTOM_ACCESS_TOKEN_URI="pg-functions://postgres/public/custom_access_token_hook" - - # GOTRUE_HOOK_MFA_VERIFICATION_ATTEMPT_ENABLED="true" - # GOTRUE_HOOK_MFA_VERIFICATION_ATTEMPT_URI="pg-functions://postgres/public/mfa_verification_attempt" - - # GOTRUE_HOOK_PASSWORD_VERIFICATION_ATTEMPT_ENABLED="true" - # GOTRUE_HOOK_PASSWORD_VERIFICATION_ATTEMPT_URI="pg-functions://postgres/public/password_verification_attempt" - - rest: - container_name: supabase-rest - image: postgrest/postgrest:v12.2.0 - networks: - - dokploy-network - depends_on: - db: - # Disable this if you are using an external Postgres database - condition: service_healthy - analytics: - condition: service_healthy - restart: unless-stopped - environment: - PGRST_DB_URI: postgres://authenticator:${POSTGRES_PASSWORD}@${POSTGRES_HOSTNAME}:${POSTGRES_PORT}/${POSTGRES_DB} - PGRST_DB_SCHEMAS: ${PGRST_DB_SCHEMAS} - PGRST_DB_ANON_ROLE: anon - PGRST_JWT_SECRET: ${JWT_SECRET} - PGRST_DB_USE_LEGACY_GUCS: "false" - PGRST_APP_SETTINGS_JWT_SECRET: ${JWT_SECRET} - PGRST_APP_SETTINGS_JWT_EXP: ${JWT_EXPIRY} - command: "postgrest" - - realtime: - # This container name looks inconsistent but is correct because realtime constructs tenant id by parsing the subdomain - container_name: realtime-dev.supabase-realtime - image: supabase/realtime:v2.30.23 - networks: - - dokploy-network - depends_on: - db: - # Disable this if you are using an external Postgres database - condition: service_healthy - analytics: - condition: service_healthy - healthcheck: - test: - [ - "CMD", - "curl", - "-sSfL", - "--head", - "-o", - "/dev/null", - "-H", - "Authorization: Bearer ${ANON_KEY}", - "http://localhost:4000/api/tenants/realtime-dev/health", - ] - timeout: 5s - interval: 5s - retries: 3 - restart: unless-stopped - environment: - PORT: 4000 - DB_HOST: ${POSTGRES_HOSTNAME} - DB_PORT: ${POSTGRES_PORT} - DB_USER: supabase_admin - DB_PASSWORD: ${POSTGRES_PASSWORD} - DB_NAME: ${POSTGRES_DB} - DB_AFTER_CONNECT_QUERY: "SET search_path TO _realtime" - DB_ENC_KEY: supabaserealtime - API_JWT_SECRET: ${JWT_SECRET} - SECRET_KEY_BASE: UpNVntn3cDxHJpq99YMc1T1AQgQpc8kfYTuRgBiYa15BLrx8etQoXz3gZv1/u2oq - ERL_AFLAGS: -proto_dist inet_tcp - DNS_NODES: "''" - RLIMIT_NOFILE: "10000" - APP_NAME: realtime - SEED_SELF_HOST: true - - # To use S3 backed storage: docker compose -f docker-compose.yml -f docker-compose.s3.yml up - storage: - container_name: supabase-storage - image: supabase/storage-api:v1.0.6 - networks: - - dokploy-network - depends_on: - db: - # Disable this if you are using an external Postgres database - condition: service_healthy - rest: - condition: service_started - imgproxy: - condition: service_started - healthcheck: - test: - [ - "CMD", - "wget", - "--no-verbose", - "--tries=1", - "--spider", - "http://localhost:5000/status", - ] - timeout: 5s - interval: 5s - retries: 3 - restart: unless-stopped - environment: - ANON_KEY: ${ANON_KEY} - SERVICE_KEY: ${SERVICE_ROLE_KEY} - POSTGREST_URL: http://rest:3000 - PGRST_JWT_SECRET: ${JWT_SECRET} - DATABASE_URL: postgres://supabase_storage_admin:${POSTGRES_PASSWORD}@${POSTGRES_HOSTNAME}:${POSTGRES_PORT}/${POSTGRES_DB} - FILE_SIZE_LIMIT: 52428800 - STORAGE_BACKEND: file - FILE_STORAGE_BACKEND_PATH: /var/lib/storage - TENANT_ID: stub - # TODO: https://github.com/supabase/storage-api/issues/55 - REGION: stub - GLOBAL_S3_BUCKET: stub - ENABLE_IMAGE_TRANSFORMATION: "true" - IMGPROXY_URL: http://imgproxy:5001 - volumes: - - ../files/volumes/storage:/var/lib/storage:z - - imgproxy: - container_name: supabase-imgproxy - image: darthsim/imgproxy:v3.8.0 - networks: - - dokploy-network - healthcheck: - test: ["CMD", "imgproxy", "health"] - timeout: 5s - interval: 5s - retries: 3 - environment: - IMGPROXY_BIND: ":5001" - IMGPROXY_LOCAL_FILESYSTEM_ROOT: / - IMGPROXY_USE_ETAG: "true" - IMGPROXY_ENABLE_WEBP_DETECTION: ${IMGPROXY_ENABLE_WEBP_DETECTION} - volumes: - - ../files/volumes/storage:/var/lib/storage:z - - meta: - container_name: supabase-meta - image: supabase/postgres-meta:v0.83.2 - networks: - - dokploy-network - depends_on: - db: - # Disable this if you are using an external Postgres database - condition: service_healthy - analytics: - condition: service_healthy - restart: unless-stopped - environment: - PG_META_PORT: 8080 - PG_META_DB_HOST: ${POSTGRES_HOSTNAME} - PG_META_DB_PORT: ${POSTGRES_PORT} - PG_META_DB_NAME: ${POSTGRES_DB} - PG_META_DB_USER: supabase_admin - PG_META_DB_PASSWORD: ${POSTGRES_PASSWORD} - - functions: - container_name: supabase-edge-functions - image: supabase/edge-runtime:v1.56.0 - restart: unless-stopped - networks: - - dokploy-network - depends_on: - analytics: - condition: service_healthy - environment: - JWT_SECRET: ${JWT_SECRET} - SUPABASE_URL: http://kong:8000 - SUPABASE_ANON_KEY: ${ANON_KEY} - SUPABASE_SERVICE_ROLE_KEY: ${SERVICE_ROLE_KEY} - SUPABASE_DB_URL: postgresql://postgres:${POSTGRES_PASSWORD}@${POSTGRES_HOSTNAME}:${POSTGRES_PORT}/${POSTGRES_DB} - # TODO: Allow configuring VERIFY_JWT per function. This PR might help: https://github.com/supabase/cli/pull/786 - VERIFY_JWT: "${FUNCTIONS_VERIFY_JWT}" - volumes: - - ../files/volumes/functions:/home/deno/functions:Z - command: - - start - - --main-service - - /home/deno/functions/main - - analytics: - container_name: supabase-analytics - image: supabase/logflare:1.4.0 - networks: - - dokploy-network - healthcheck: - test: ["CMD", "curl", "http://localhost:4000/health"] - timeout: 5s - interval: 5s - retries: 10 - restart: unless-stopped - depends_on: - db: - # Disable this if you are using an external Postgres database - condition: service_healthy - # Uncomment to use Big Query backend for analytics - # volumes: - # - type: bind - # source: ${PWD}/gcloud.json - # target: /opt/app/rel/logflare/bin/gcloud.json - # read_only: true - environment: - LOGFLARE_NODE_HOST: 127.0.0.1 - DB_USERNAME: supabase_admin - DB_DATABASE: ${POSTGRES_DB} - DB_HOSTNAME: ${POSTGRES_HOSTNAME} - DB_PORT: ${POSTGRES_PORT} - DB_PASSWORD: ${POSTGRES_PASSWORD} - DB_SCHEMA: _analytics - LOGFLARE_API_KEY: ${LOGFLARE_API_KEY} - LOGFLARE_SINGLE_TENANT: true - LOGFLARE_SUPABASE_MODE: true - LOGFLARE_MIN_CLUSTER_SIZE: 1 - - # Comment variables to use Big Query backend for analytics - POSTGRES_BACKEND_URL: postgresql://supabase_admin:${POSTGRES_PASSWORD}@${POSTGRES_HOSTNAME}:${POSTGRES_PORT}/${POSTGRES_DB} - POSTGRES_BACKEND_SCHEMA: _analytics - LOGFLARE_FEATURE_FLAG_OVERRIDE: multibackend=true - # Uncomment to use Big Query backend for analytics - # GOOGLE_PROJECT_ID: ${GOOGLE_PROJECT_ID} - # GOOGLE_PROJECT_NUMBER: ${GOOGLE_PROJECT_NUMBER} - #ports: - # - 4000:4000 - expose: - - 4000 - - # Comment out everything below this point if you are using an external Postgres database - db: - container_name: supabase-db - image: supabase/postgres:15.1.1.78 - networks: - - dokploy-network - healthcheck: - test: pg_isready -U postgres -h localhost - interval: 5s - timeout: 5s - retries: 10 - depends_on: - vector: - condition: service_healthy - command: - - postgres - - -c - - config_file=/etc/postgresql/postgresql.conf - - -c - - log_min_messages=fatal # prevents Realtime polling queries from appearing in logs - restart: unless-stopped - #ports: - # # Pass down internal port because it's set dynamically by other services - # - ${POSTGRES_PORT}:${POSTGRES_PORT} - expose: - - ${POSTGRES_PORT} - environment: - POSTGRES_HOST: /var/run/postgresql - PGPORT: ${POSTGRES_PORT} - POSTGRES_PORT: ${POSTGRES_PORT} - PGPASSWORD: ${POSTGRES_PASSWORD} - POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} - PGDATABASE: ${POSTGRES_DB} - POSTGRES_DB: ${POSTGRES_DB} - JWT_SECRET: ${JWT_SECRET} - JWT_EXP: ${JWT_EXPIRY} - volumes: - - ../files/volumes/db/realtime.sql:/docker-entrypoint-initdb.d/migrations/99-realtime.sql:Z - # Must be superuser to create event trigger - - ../files/volumes/db/webhooks.sql:/docker-entrypoint-initdb.d/init-scripts/98-webhooks.sql:Z - # Must be superuser to alter reserved role - - ../files/volumes/db/roles.sql:/docker-entrypoint-initdb.d/init-scripts/99-roles.sql:Z - # Initialize the database settings with JWT_SECRET and JWT_EXP - - ../files/volumes/db/jwt.sql:/docker-entrypoint-initdb.d/init-scripts/99-jwt.sql:Z - # PGDATA directory is persisted between restarts - - ../files/volumes/db/data:/var/lib/postgresql/data:Z - # Changes required for Analytics support - - ../files/volumes/db/logs.sql:/docker-entrypoint-initdb.d/migrations/99-logs.sql:Z - # Use named volume to persist pgsodium decryption key between restarts - - db-config:/etc/postgresql-custom - - vector: - container_name: supabase-vector - image: timberio/vector:0.28.1-alpine - networks: - - dokploy-network - healthcheck: - test: - [ - "CMD", - "wget", - "--no-verbose", - "--tries=1", - "--spider", - "http://vector:9001/health", - ] - timeout: 5s - interval: 5s - retries: 3 - volumes: - - ../files/volumes/logs/vector.yml:/etc/vector/vector.yml:ro - - ${DOCKER_SOCKET_LOCATION}:/var/run/docker.sock:ro - environment: - LOGFLARE_API_KEY: ${LOGFLARE_API_KEY} - command: ["--config", "etc/vector/vector.yml"] - -volumes: - db-config: - -networks: - dokploy-network: - external: true diff --git a/packages/server/src/templates/supabase/index.ts b/packages/server/src/templates/supabase/index.ts deleted file mode 100644 index 6922c77f..00000000 --- a/packages/server/src/templates/supabase/index.ts +++ /dev/null @@ -1,995 +0,0 @@ -import { createHmac } from "node:crypto"; -import { - type DomainSchema, - type Schema, - type Template, - generateBase64, - generatePassword, - generateRandomDomain, -} from "../utils"; - -interface JWTPayload { - role: "anon" | "service_role"; - iss: string; - iat: number; - exp: number; -} - -function base64UrlEncode(str: string): string { - return Buffer.from(str) - .toString("base64") - .replace(/\+/g, "-") - .replace(/\//g, "_") - .replace(/=/g, ""); -} - -function generateJWT(payload: JWTPayload, secret: string): string { - const header = { alg: "HS256", typ: "JWT" }; - - const encodedHeader = base64UrlEncode(JSON.stringify(header)); - const encodedPayload = base64UrlEncode(JSON.stringify(payload)); - - const signature = createHmac("sha256", secret) - .update(`${encodedHeader}.${encodedPayload}`) - .digest("base64url"); - - return `${encodedHeader}.${encodedPayload}.${signature}`; -} - -export function generateSupabaseAnonJWT(secret: string): string { - const now = Math.floor(Date.now() / 1000); - const payload: JWTPayload = { - role: "anon", - iss: "supabase", - iat: now, - exp: now + 100 * 365 * 24 * 60 * 60, // 100 years - }; - - return generateJWT(payload, secret); -} - -export function generateSupabaseServiceJWT(secret: string): string { - const now = Math.floor(Date.now() / 1000); - const payload: JWTPayload = { - role: "service_role", - iss: "supabase", - iat: now, - exp: now + 100 * 365 * 24 * 60 * 60, // 100 years - }; - - return generateJWT(payload, secret); -} - -export function generate(schema: Schema): Template { - const mainDomain = generateRandomDomain(schema); - - const postgresPassword = generatePassword(32); - const jwtSecret = generateBase64(32); - const dashboardPassword = generatePassword(32); - const logflareApiKey = generatePassword(32); - - const annonKey = generateSupabaseAnonJWT(jwtSecret); - const serviceRoleKey = generateSupabaseServiceJWT(jwtSecret); - const domains: DomainSchema[] = [ - { - serviceName: "kong", - host: mainDomain, - port: 8000, - }, - ]; - - const envs = [ - `SUPABASE_HOST=${mainDomain}`, - `POSTGRES_PASSWORD=${postgresPassword}`, - `JWT_SECRET=${jwtSecret}`, - `ANON_KEY=${annonKey}`, - `SERVICE_ROLE_KEY=${serviceRoleKey}`, - "DASHBOARD_USERNAME=supabase", - `DASHBOARD_PASSWORD=${dashboardPassword}`, - "POSTGRES_HOSTNAME=db", - "POSTGRES_DB=postgres", - "POSTGRES_PORT=5432", - "KONG_HTTP_PORT=8000", - "KONG_HTTPS_PORT=8443", - "PGRST_DB_SCHEMAS=public,storage,graphql_public", - "ADDITIONAL_REDIRECT_URLS=", - "JWT_EXPIRY=3600", - "DISABLE_SIGNUP=false", - `MAILER_URLPATHS_CONFIRMATION=\"/auth/v1/verify\"`, - `MAILER_URLPATHS_INVITE=\"/auth/v1/verify\"`, - `MAILER_URLPATHS_RECOVERY=\"/auth/v1/verify\"`, - `MAILER_URLPATHS_EMAIL_CHANGE=\"/auth/v1/verify\"`, - "ENABLE_EMAIL_SIGNUP=true", - "ENABLE_EMAIL_AUTOCONFIRM=false", - "SMTP_ADMIN_EMAIL=admin@example.com", - "SMTP_HOSTNAME=supabase-mail", - "SMTP_PORT=2500", - "SMTP_USER=fake_mail_user", - "SMTP_PASS=fake_mail_password", - "SMTP_SENDER_NAME=fake_sender", - "ENABLE_ANONYMOUS_USERS=false", - "ENABLE_PHONE_SIGNUP=true", - "ENABLE_PHONE_AUTOCONFIRM=true", - "STUDIO_DEFAULT_ORGANIZATION=Default Organization", - "STUDIO_DEFAULT_PROJECT=Default Project", - "STUDIO_PORT=3000", - "IMGPROXY_ENABLE_WEBP_DETECTION=true", - "FUNCTIONS_VERIFY_JWT=false", - `LOGFLARE_LOGGER_BACKEND_API_KEY=${logflareApiKey}`, - `LOGFLARE_API_KEY=${logflareApiKey}`, - "DOCKER_SOCKET_LOCATION=/var/run/docker.sock", - "GOOGLE_PROJECT_ID=GOOGLE_PROJECT_ID", - "GOOGLE_PROJECT_NUMBER=GOOGLE_PROJECT_NUMBER", - ]; - - const mounts: Template["mounts"] = [ - { - filePath: "/volumes/api/kong.yml", - content: ` -_format_version: '2.1' -_transform: true - -### -### Consumers / Users -### -consumers: - - username: DASHBOARD - - username: anon - keyauth_credentials: - - key: $SUPABASE_ANON_KEY - - username: service_role - keyauth_credentials: - - key: $SUPABASE_SERVICE_KEY - -### -### Access Control List -### -acls: - - consumer: anon - group: anon - - consumer: service_role - group: admin - -### -### Dashboard credentials -### -basicauth_credentials: - - consumer: DASHBOARD - username: $DASHBOARD_USERNAME - password: $DASHBOARD_PASSWORD - -### -### API Routes -### -services: - ## Open Auth routes - - name: auth-v1-open - url: http://auth:9999/verify - routes: - - name: auth-v1-open - strip_path: true - paths: - - /auth/v1/verify - plugins: - - name: cors - - name: auth-v1-open-callback - url: http://auth:9999/callback - routes: - - name: auth-v1-open-callback - strip_path: true - paths: - - /auth/v1/callback - plugins: - - name: cors - - name: auth-v1-open-authorize - url: http://auth:9999/authorize - routes: - - name: auth-v1-open-authorize - strip_path: true - paths: - - /auth/v1/authorize - plugins: - - name: cors - - ## Secure Auth routes - - name: auth-v1 - _comment: 'GoTrue: /auth/v1/* -> http://auth:9999/*' - url: http://auth:9999/ - routes: - - name: auth-v1-all - strip_path: true - paths: - - /auth/v1/ - plugins: - - name: cors - - name: key-auth - config: - hide_credentials: false - - name: acl - config: - hide_groups_header: true - allow: - - admin - - anon - - ## Secure REST routes - - name: rest-v1 - _comment: 'PostgREST: /rest/v1/* -> http://rest:3000/*' - url: http://rest:3000/ - routes: - - name: rest-v1-all - strip_path: true - paths: - - /rest/v1/ - plugins: - - name: cors - - name: key-auth - config: - hide_credentials: true - - name: acl - config: - hide_groups_header: true - allow: - - admin - - anon - - ## Secure GraphQL routes - - name: graphql-v1 - _comment: 'PostgREST: /graphql/v1/* -> http://rest:3000/rpc/graphql' - url: http://rest:3000/rpc/graphql - routes: - - name: graphql-v1-all - strip_path: true - paths: - - /graphql/v1 - plugins: - - name: cors - - name: key-auth - config: - hide_credentials: true - - name: request-transformer - config: - add: - headers: - - Content-Profile:graphql_public - - name: acl - config: - hide_groups_header: true - allow: - - admin - - anon - - ## Secure Realtime routes - - name: realtime-v1-ws - _comment: 'Realtime: /realtime/v1/* -> ws://realtime:4000/socket/*' - url: http://realtime-dev.supabase-realtime:4000/socket - protocol: ws - routes: - - name: realtime-v1-ws - strip_path: true - paths: - - /realtime/v1/ - plugins: - - name: cors - - name: key-auth - config: - hide_credentials: false - - name: acl - config: - hide_groups_header: true - allow: - - admin - - anon - - name: realtime-v1-rest - _comment: 'Realtime: /realtime/v1/* -> ws://realtime:4000/socket/*' - url: http://realtime-dev.supabase-realtime:4000/api - protocol: http - routes: - - name: realtime-v1-rest - strip_path: true - paths: - - /realtime/v1/api - plugins: - - name: cors - - name: key-auth - config: - hide_credentials: false - - name: acl - config: - hide_groups_header: true - allow: - - admin - - anon - ## Storage routes: the storage server manages its own auth - - name: storage-v1 - _comment: 'Storage: /storage/v1/* -> http://storage:5000/*' - url: http://storage:5000/ - routes: - - name: storage-v1-all - strip_path: true - paths: - - /storage/v1/ - plugins: - - name: cors - - ## Edge Functions routes - - name: functions-v1 - _comment: 'Edge Functions: /functions/v1/* -> http://functions:9000/*' - url: http://functions:9000/ - routes: - - name: functions-v1-all - strip_path: true - paths: - - /functions/v1/ - plugins: - - name: cors - - ## Analytics routes - - name: analytics-v1 - _comment: 'Analytics: /analytics/v1/* -> http://logflare:4000/*' - url: http://analytics:4000/ - routes: - - name: analytics-v1-all - strip_path: true - paths: - - /analytics/v1/ - - ## Secure Database routes - - name: meta - _comment: 'pg-meta: /pg/* -> http://pg-meta:8080/*' - url: http://meta:8080/ - routes: - - name: meta-all - strip_path: true - paths: - - /pg/ - plugins: - - name: key-auth - config: - hide_credentials: false - - name: acl - config: - hide_groups_header: true - allow: - - admin - - ## Protected Dashboard - catch all remaining routes - - name: dashboard - _comment: 'Studio: /* -> http://studio:3000/*' - url: http://studio:3000/ - routes: - - name: dashboard-all - strip_path: true - paths: - - / - plugins: - - name: cors - - name: basic-auth - config: - hide_credentials: true - `, - }, - { - filePath: "/volumes/db/init/data.sql", - content: ` - `, - }, - { - filePath: "/volumes/db/jwt.sql", - content: ` -\\set jwt_secret \`echo "$JWT_SECRET"\` -\\set jwt_exp \`echo "$JWT_EXP"\` - -ALTER DATABASE postgres SET "app.settings.jwt_secret" TO :'jwt_secret'; -ALTER DATABASE postgres SET "app.settings.jwt_exp" TO :'jwt_exp'; - `, - }, - { - filePath: "/volumes/db/logs.sql", - content: ` -\\set pguser \`echo "$POSTGRES_USER"\` - -create schema if not exists _analytics; -alter schema _analytics owner to :pguser; - `, - }, - { - filePath: "/volumes/db/realtime.sql", - content: ` -\\set pguser \`echo "$POSTGRES_USER"\` - -create schema if not exists _realtime; -alter schema _realtime owner to :pguser; - `, - }, - { - filePath: "/volumes/db/roles.sql", - content: ` --- NOTE: change to your own passwords for production environments -\\set pgpass \`echo "$POSTGRES_PASSWORD"\` - -ALTER USER authenticator WITH PASSWORD :'pgpass'; -ALTER USER pgbouncer WITH PASSWORD :'pgpass'; -ALTER USER supabase_auth_admin WITH PASSWORD :'pgpass'; -ALTER USER supabase_functions_admin WITH PASSWORD :'pgpass'; -ALTER USER supabase_storage_admin WITH PASSWORD :'pgpass'; - `, - }, - { - filePath: "/volumes/db/webhooks.sql", - content: ` -BEGIN; - -- Create pg_net extension - CREATE EXTENSION IF NOT EXISTS pg_net SCHEMA extensions; - -- Create supabase_functions schema - CREATE SCHEMA supabase_functions AUTHORIZATION supabase_admin; - GRANT USAGE ON SCHEMA supabase_functions TO postgres, anon, authenticated, service_role; - ALTER DEFAULT PRIVILEGES IN SCHEMA supabase_functions GRANT ALL ON TABLES TO postgres, anon, authenticated, service_role; - ALTER DEFAULT PRIVILEGES IN SCHEMA supabase_functions GRANT ALL ON FUNCTIONS TO postgres, anon, authenticated, service_role; - ALTER DEFAULT PRIVILEGES IN SCHEMA supabase_functions GRANT ALL ON SEQUENCES TO postgres, anon, authenticated, service_role; - -- supabase_functions.migrations definition - CREATE TABLE supabase_functions.migrations ( - version text PRIMARY KEY, - inserted_at timestamptz NOT NULL DEFAULT NOW() - ); - -- Initial supabase_functions migration - INSERT INTO supabase_functions.migrations (version) VALUES ('initial'); - -- supabase_functions.hooks definition - CREATE TABLE supabase_functions.hooks ( - id bigserial PRIMARY KEY, - hook_table_id integer NOT NULL, - hook_name text NOT NULL, - created_at timestamptz NOT NULL DEFAULT NOW(), - request_id bigint - ); - CREATE INDEX supabase_functions_hooks_request_id_idx ON supabase_functions.hooks USING btree (request_id); - CREATE INDEX supabase_functions_hooks_h_table_id_h_name_idx ON supabase_functions.hooks USING btree (hook_table_id, hook_name); - COMMENT ON TABLE supabase_functions.hooks IS 'Supabase Functions Hooks: Audit trail for triggered hooks.'; - CREATE FUNCTION supabase_functions.http_request() - RETURNS trigger - LANGUAGE plpgsql - AS $function$ - DECLARE - request_id bigint; - payload jsonb; - url text := TG_ARGV[0]::text; - method text := TG_ARGV[1]::text; - headers jsonb DEFAULT '{}'::jsonb; - params jsonb DEFAULT '{}'::jsonb; - timeout_ms integer DEFAULT 1000; - BEGIN - IF url IS NULL OR url = 'null' THEN - RAISE EXCEPTION 'url argument is missing'; - END IF; - - IF method IS NULL OR method = 'null' THEN - RAISE EXCEPTION 'method argument is missing'; - END IF; - - IF TG_ARGV[2] IS NULL OR TG_ARGV[2] = 'null' THEN - headers = '{"Content-Type": "application/json"}'::jsonb; - ELSE - headers = TG_ARGV[2]::jsonb; - END IF; - - IF TG_ARGV[3] IS NULL OR TG_ARGV[3] = 'null' THEN - params = '{}'::jsonb; - ELSE - params = TG_ARGV[3]::jsonb; - END IF; - - IF TG_ARGV[4] IS NULL OR TG_ARGV[4] = 'null' THEN - timeout_ms = 1000; - ELSE - timeout_ms = TG_ARGV[4]::integer; - END IF; - - CASE - WHEN method = 'GET' THEN - SELECT http_get INTO request_id FROM net.http_get( - url, - params, - headers, - timeout_ms - ); - WHEN method = 'POST' THEN - payload = jsonb_build_object( - 'old_record', OLD, - 'record', NEW, - 'type', TG_OP, - 'table', TG_TABLE_NAME, - 'schema', TG_TABLE_SCHEMA - ); - - SELECT http_post INTO request_id FROM net.http_post( - url, - payload, - params, - headers, - timeout_ms - ); - ELSE - RAISE EXCEPTION 'method argument % is invalid', method; - END CASE; - - INSERT INTO supabase_functions.hooks - (hook_table_id, hook_name, request_id) - VALUES - (TG_RELID, TG_NAME, request_id); - - RETURN NEW; - END - $function$; - -- Supabase super admin - DO - $$ - BEGIN - IF NOT EXISTS ( - SELECT 1 - FROM pg_roles - WHERE rolname = 'supabase_functions_admin' - ) - THEN - CREATE USER supabase_functions_admin NOINHERIT CREATEROLE LOGIN NOREPLICATION; - END IF; - END - $$; - GRANT ALL PRIVILEGES ON SCHEMA supabase_functions TO supabase_functions_admin; - GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA supabase_functions TO supabase_functions_admin; - GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA supabase_functions TO supabase_functions_admin; - ALTER USER supabase_functions_admin SET search_path = "supabase_functions"; - ALTER table "supabase_functions".migrations OWNER TO supabase_functions_admin; - ALTER table "supabase_functions".hooks OWNER TO supabase_functions_admin; - ALTER function "supabase_functions".http_request() OWNER TO supabase_functions_admin; - GRANT supabase_functions_admin TO postgres; - -- Remove unused supabase_pg_net_admin role - DO - $$ - BEGIN - IF EXISTS ( - SELECT 1 - FROM pg_roles - WHERE rolname = 'supabase_pg_net_admin' - ) - THEN - REASSIGN OWNED BY supabase_pg_net_admin TO supabase_admin; - DROP OWNED BY supabase_pg_net_admin; - DROP ROLE supabase_pg_net_admin; - END IF; - END - $$; - -- pg_net grants when extension is already enabled - DO - $$ - BEGIN - IF EXISTS ( - SELECT 1 - FROM pg_extension - WHERE extname = 'pg_net' - ) - THEN - GRANT USAGE ON SCHEMA net TO supabase_functions_admin, postgres, anon, authenticated, service_role; - ALTER function net.http_get(url text, params jsonb, headers jsonb, timeout_milliseconds integer) SECURITY DEFINER; - ALTER function net.http_post(url text, body jsonb, params jsonb, headers jsonb, timeout_milliseconds integer) SECURITY DEFINER; - ALTER function net.http_get(url text, params jsonb, headers jsonb, timeout_milliseconds integer) SET search_path = net; - ALTER function net.http_post(url text, body jsonb, params jsonb, headers jsonb, timeout_milliseconds integer) SET search_path = net; - REVOKE ALL ON FUNCTION net.http_get(url text, params jsonb, headers jsonb, timeout_milliseconds integer) FROM PUBLIC; - REVOKE ALL ON FUNCTION net.http_post(url text, body jsonb, params jsonb, headers jsonb, timeout_milliseconds integer) FROM PUBLIC; - GRANT EXECUTE ON FUNCTION net.http_get(url text, params jsonb, headers jsonb, timeout_milliseconds integer) TO supabase_functions_admin, postgres, anon, authenticated, service_role; - GRANT EXECUTE ON FUNCTION net.http_post(url text, body jsonb, params jsonb, headers jsonb, timeout_milliseconds integer) TO supabase_functions_admin, postgres, anon, authenticated, service_role; - END IF; - END - $$; - -- Event trigger for pg_net - CREATE OR REPLACE FUNCTION extensions.grant_pg_net_access() - RETURNS event_trigger - LANGUAGE plpgsql - AS $$ - BEGIN - IF EXISTS ( - SELECT 1 - FROM pg_event_trigger_ddl_commands() AS ev - JOIN pg_extension AS ext - ON ev.objid = ext.oid - WHERE ext.extname = 'pg_net' - ) - THEN - GRANT USAGE ON SCHEMA net TO supabase_functions_admin, postgres, anon, authenticated, service_role; - ALTER function net.http_get(url text, params jsonb, headers jsonb, timeout_milliseconds integer) SECURITY DEFINER; - ALTER function net.http_post(url text, body jsonb, params jsonb, headers jsonb, timeout_milliseconds integer) SECURITY DEFINER; - ALTER function net.http_get(url text, params jsonb, headers jsonb, timeout_milliseconds integer) SET search_path = net; - ALTER function net.http_post(url text, body jsonb, params jsonb, headers jsonb, timeout_milliseconds integer) SET search_path = net; - REVOKE ALL ON FUNCTION net.http_get(url text, params jsonb, headers jsonb, timeout_milliseconds integer) FROM PUBLIC; - REVOKE ALL ON FUNCTION net.http_post(url text, body jsonb, params jsonb, headers jsonb, timeout_milliseconds integer) FROM PUBLIC; - GRANT EXECUTE ON FUNCTION net.http_get(url text, params jsonb, headers jsonb, timeout_milliseconds integer) TO supabase_functions_admin, postgres, anon, authenticated, service_role; - GRANT EXECUTE ON FUNCTION net.http_post(url text, body jsonb, params jsonb, headers jsonb, timeout_milliseconds integer) TO supabase_functions_admin, postgres, anon, authenticated, service_role; - END IF; - END; - $$; - COMMENT ON FUNCTION extensions.grant_pg_net_access IS 'Grants access to pg_net'; - DO - $$ - BEGIN - IF NOT EXISTS ( - SELECT 1 - FROM pg_event_trigger - WHERE evtname = 'issue_pg_net_access' - ) THEN - CREATE EVENT TRIGGER issue_pg_net_access ON ddl_command_end WHEN TAG IN ('CREATE EXTENSION') - EXECUTE PROCEDURE extensions.grant_pg_net_access(); - END IF; - END - $$; - INSERT INTO supabase_functions.migrations (version) VALUES ('20210809183423_update_grants'); - ALTER function supabase_functions.http_request() SECURITY DEFINER; - ALTER function supabase_functions.http_request() SET search_path = supabase_functions; - REVOKE ALL ON FUNCTION supabase_functions.http_request() FROM PUBLIC; - GRANT EXECUTE ON FUNCTION supabase_functions.http_request() TO postgres, anon, authenticated, service_role; -COMMIT; - `, - }, - { - filePath: "/volumes/functions/hello/index.ts", - content: ` -// Follow this setup guide to integrate the Deno language server with your editor: -// https://deno.land/manual/getting_started/setup_your_environment -// This enables autocomplete, go to definition, etc. - -import { serve } from "https://deno.land/std@0.177.1/http/server.ts" - -serve(async () => { - return new Response( - \`"Hello from Edge Functions!"\`, - { headers: { "Content-Type": "application/json" } }, - ) -}) - -// To invoke: -// curl 'http://localhost:/functions/v1/hello' \\ -// --header 'Authorization: Bearer ' - `, - }, - { - filePath: "/volumes/functions/main/index.ts", - content: ` -import { serve } from 'https://deno.land/std@0.131.0/http/server.ts' -import * as jose from 'https://deno.land/x/jose@v4.14.4/index.ts' - -console.log('main function started') - -const JWT_SECRET = Deno.env.get('JWT_SECRET') -const VERIFY_JWT = Deno.env.get('VERIFY_JWT') === 'true' - -function getAuthToken(req: Request) { - const authHeader = req.headers.get('authorization') - if (!authHeader) { - throw new Error('Missing authorization header') - } - const [bearer, token] = authHeader.split(' ') - if (bearer !== 'Bearer') { - throw new Error(\`Auth header is not 'Bearer {token}'\`) - } - return token -} - -async function verifyJWT(jwt: string): Promise { - const encoder = new TextEncoder() - const secretKey = encoder.encode(JWT_SECRET) - try { - await jose.jwtVerify(jwt, secretKey) - } catch (err) { - console.error(err) - return false - } - return true -} - -serve(async (req: Request) => { - if (req.method !== 'OPTIONS' && VERIFY_JWT) { - try { - const token = getAuthToken(req) - const isValidJWT = await verifyJWT(token) - - if (!isValidJWT) { - return new Response(JSON.stringify({ msg: 'Invalid JWT' }), { - status: 401, - headers: { 'Content-Type': 'application/json' }, - }) - } - } catch (e) { - console.error(e) - return new Response(JSON.stringify({ msg: e.toString() }), { - status: 401, - headers: { 'Content-Type': 'application/json' }, - }) - } - } - - const url = new URL(req.url) - const { pathname } = url - const path_parts = pathname.split('/') - const service_name = path_parts[1] - - if (!service_name || service_name === '') { - const error = { msg: 'missing function name in request' } - return new Response(JSON.stringify(error), { - status: 400, - headers: { 'Content-Type': 'application/json' }, - }) - } - - const servicePath = \`/home/deno/functions/\${service_name}\` - console.error(\`serving the request with \${servicePath}\`) - - const memoryLimitMb = 150 - const workerTimeoutMs = 1 * 60 * 1000 - const noModuleCache = false - const importMapPath = null - const envVarsObj = Deno.env.toObject() - const envVars = Object.keys(envVarsObj).map((k) => [k, envVarsObj[k]]) - - try { - const worker = await EdgeRuntime.userWorkers.create({ - servicePath, - memoryLimitMb, - workerTimeoutMs, - noModuleCache, - importMapPath, - envVars, - }) - return await worker.fetch(req) - } catch (e) { - const error = { msg: e.toString() } - return new Response(JSON.stringify(error), { - status: 500, - headers: { 'Content-Type': 'application/json' }, - }) - } -}) - `, - }, - { - filePath: "/volumes/logs/vector.yml", - content: ` -api: - enabled: true - address: 0.0.0.0:9001 - -sources: - docker_host: - type: docker_logs - exclude_containers: - - supabase-vector - -transforms: - project_logs: - type: remap - inputs: - - docker_host - source: |- - .project = "default" - .event_message = del(.message) - .appname = del(.container_name) - del(.container_created_at) - del(.container_id) - del(.source_type) - del(.stream) - del(.label) - del(.image) - del(.host) - del(.stream) - router: - type: route - inputs: - - project_logs - route: - kong: '.appname == "supabase-kong"' - auth: '.appname == "supabase-auth"' - rest: '.appname == "supabase-rest"' - realtime: '.appname == "supabase-realtime"' - storage: '.appname == "supabase-storage"' - functions: '.appname == "supabase-functions"' - db: '.appname == "supabase-db"' - # Ignores non nginx errors since they are related with kong booting up - kong_logs: - type: remap - inputs: - - router.kong - source: |- - req, err = parse_nginx_log(.event_message, "combined") - if err == null { - .timestamp = req.timestamp - .metadata.request.headers.referer = req.referer - .metadata.request.headers.user_agent = req.agent - .metadata.request.headers.cf_connecting_ip = req.client - .metadata.request.method = req.method - .metadata.request.path = req.path - .metadata.request.protocol = req.protocol - .metadata.response.status_code = req.status - } - if err != null { - abort - } - # Ignores non nginx errors since they are related with kong booting up - kong_err: - type: remap - inputs: - - router.kong - source: |- - .metadata.request.method = "GET" - .metadata.response.status_code = 200 - parsed, err = parse_nginx_log(.event_message, "error") - if err == null { - .timestamp = parsed.timestamp - .severity = parsed.severity - .metadata.request.host = parsed.host - .metadata.request.headers.cf_connecting_ip = parsed.client - url, err = split(parsed.request, " ") - if err == null { - .metadata.request.method = url[0] - .metadata.request.path = url[1] - .metadata.request.protocol = url[2] - } - } - if err != null { - abort - } - # Gotrue logs are structured json strings which frontend parses directly. But we keep metadata for consistency. - auth_logs: - type: remap - inputs: - - router.auth - source: |- - parsed, err = parse_json(.event_message) - if err == null { - .metadata.timestamp = parsed.time - .metadata = merge!(.metadata, parsed) - } - # PostgREST logs are structured so we separate timestamp from message using regex - rest_logs: - type: remap - inputs: - - router.rest - source: |- - parsed, err = parse_regex(.event_message, r'^(?P