+
Create Template
diff --git a/public/templates/documenso.png b/public/templates/documenso.png
new file mode 100644
index 00000000..cb4765fc
Binary files /dev/null and b/public/templates/documenso.png differ
diff --git a/public/templates/nocodb.png b/public/templates/nocodb.png
new file mode 100644
index 00000000..70af4926
Binary files /dev/null and b/public/templates/nocodb.png differ
diff --git a/templates/calcom/docker-compose.yml b/templates/calcom/docker-compose.yml
index cd77521c..1afb2db8 100644
--- a/templates/calcom/docker-compose.yml
+++ b/templates/calcom/docker-compose.yml
@@ -1,4 +1,3 @@
-version: '3.8'
services:
postgres:
image: postgres:16-alpine
@@ -17,8 +16,8 @@ services:
depends_on:
- postgres
environment:
- - NEXTAUTH_SECRET=asklmdaklsmdklasmdklasd
- - CALENDSO_ENCRYPTION_KEY=asklmdaklsmdklasmdklasd
+ - 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
diff --git a/templates/calcom/index.ts b/templates/calcom/index.ts
index 34439432..61122263 100644
--- a/templates/calcom/index.ts
+++ b/templates/calcom/index.ts
@@ -3,16 +3,22 @@ import {
generateRandomDomain,
type Template,
type Schema,
+ generateBase64,
} from "../utils";
// https://cal.com/
export function generate(schema: Schema): Template {
const mainServiceHash = generateHash(schema.projectName);
const randomDomain = generateRandomDomain(schema);
+ const calcomEncryptionKey = generateBase64(32);
+ const nextAuthSecret = generateBase64(32);
+
const envs = [
`CALCOM_HOST=${randomDomain}`,
"CALCOM_PORT=3000",
`HASH=${mainServiceHash}`,
+ `NEXTAUTH_SECRET=${nextAuthSecret}`,
+ `CALENDSO_ENCRYPTION_KEY=${calcomEncryptionKey}`,
];
return {
diff --git a/templates/documenso/docker-compose.yml b/templates/documenso/docker-compose.yml
new file mode 100644
index 00000000..f411cfbb
--- /dev/null
+++ b/templates/documenso/docker-compose.yml
@@ -0,0 +1,53 @@
+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:1.5.6-rc.2
+ networks:
+ - dokploy-network
+ 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}
+ labels:
+ - "traefik.enable=true"
+ - "traefik.http.routers.${HASH}.rule=Host(`${DOCUMENSO_HOST}`)"
+ - "traefik.http.services.${HASH}.loadbalancer.server.port=${DOCUMENSO_PORT}"
+ volumes:
+ - /opt/documenso/cert.p12:/opt/documenso/cert.p12
+
+networks:
+ dokploy-network:
+ external: true
+
+volumes:
+ documenso-data:
diff --git a/templates/documenso/index.ts b/templates/documenso/index.ts
new file mode 100644
index 00000000..f1e05d71
--- /dev/null
+++ b/templates/documenso/index.ts
@@ -0,0 +1,30 @@
+import {
+ generateHash,
+ generateRandomDomain,
+ type Template,
+ type Schema,
+ generateBase64,
+ generatePassword,
+} from "../utils";
+
+export function generate(schema: Schema): Template {
+ const mainServiceHash = generateHash(schema.projectName);
+ const randomDomain = generateRandomDomain(schema);
+
+ const nextAuthSecret = generateBase64(32);
+ const documensoEncryptionKey = generatePassword(32);
+ const documensoSecondaryEncryptionKey = generatePassword(64);
+
+ const envs = [
+ `DOCUMENSO_HOST=${randomDomain}`,
+ "DOCUMENSO_PORT=3000",
+ `HASH=${mainServiceHash}`,
+ `NEXTAUTH_SECRET=${nextAuthSecret}`,
+ `NEXT_PRIVATE_ENCRYPTION_KEY=${documensoEncryptionKey}`,
+ `NEXT_PRIVATE_ENCRYPTION_SECONDARY_KEY=${documensoSecondaryEncryptionKey}`,
+ ];
+
+ return {
+ envs,
+ };
+}
diff --git a/templates/nocodb/docker-compose.yml b/templates/nocodb/docker-compose.yml
new file mode 100644
index 00000000..221b8941
--- /dev/null
+++ b/templates/nocodb/docker-compose.yml
@@ -0,0 +1,44 @@
+version: "3.8"
+services:
+ nocodb:
+ image: nocodb/nocodb:0.251.0
+ restart: always
+ networks:
+ - dokploy-network
+ ports:
+ - ${NOCODB_PORT}
+ environment:
+ NC_DB : "pg://root_db?u=postgres&p=password&d=root_db"
+ PORT : ${NOCODB_PORT}
+ NC_REDIS_URL: ${NC_REDIS_URL}
+ labels:
+ - traefik.enable=true
+ - traefik.http.routers.${HASH}.rule=Host(`${NOCODB_HOST}`)
+ - traefik.http.services.${HASH}.loadbalancer.server.port=${NOCODB_PORT}
+ 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"
+
+networks:
+ dokploy-network:
+ external: true
+
+volumes:
+ db_data: {}
+ nc_data: {}
\ No newline at end of file
diff --git a/templates/nocodb/index.ts b/templates/nocodb/index.ts
new file mode 100644
index 00000000..b41aced0
--- /dev/null
+++ b/templates/nocodb/index.ts
@@ -0,0 +1,28 @@
+// EXAMPLE
+import {
+ generateHash,
+ generateRandomDomain,
+ generateBase64,
+ type Template,
+ type Schema,
+} from "../utils";
+
+
+export function generate(schema: Schema): Template {
+
+ const mainServiceHash = generateHash(schema.projectName);
+ const randomDomain = generateRandomDomain(schema);
+ const secretBase = generateBase64(64);
+ const toptKeyBase = generateBase64(32);
+
+ const envs = [
+ `NOCODB_HOST=${randomDomain}`,
+ "NOCODB_PORT=8000",
+ `NC_AUTH_JWT_SECRET=${secretBase}`,
+ `HASH=${mainServiceHash}`,
+ ];
+
+ return {
+ envs,
+ };
+}
\ No newline at end of file
diff --git a/templates/templates.ts b/templates/templates.ts
index 4bb9acd7..c79ea559 100644
--- a/templates/templates.ts
+++ b/templates/templates.ts
@@ -34,7 +34,7 @@ export const templates: TemplateData[] = [
{
id: "calcom",
name: "Calcom",
- version: "2.7.6",
+ version: "v2.7.6",
description:
"Calcom is a open source alternative to Calendly that allows to create scheduling and booking services.",
@@ -197,4 +197,36 @@ export const templates: TemplateData[] = [
tags: ["drawing"],
load: () => import("./excalidraw/index").then((m) => m.generate),
},
+ {
+ id: "documenso",
+ name: "Documenso",
+ version: "v1.5.6",
+ description:
+ "Documenso is the open source alternative to DocuSign for signing documents digitally",
+
+ links: {
+ github: "https://github.com/documenso/documenso",
+ website: "https://documenso.com/",
+ docs: "https://documenso.com/docs",
+ },
+ logo: "documenso.png",
+ tags: ["document-signing"],
+ load: () => import("./documenso/index").then((m) => m.generate),
+ },
+ {
+ id: "nocodb",
+ name: "NocoDB",
+ version: "0.251.0",
+ description:
+ "NocoDB is an opensource Airtable alternative that turns any MySQL, PostgreSQL, SQL Server, SQLite & MariaDB into a smart spreadsheet.",
+
+ links: {
+ github: "https://github.com/nocodb/nocodb",
+ website: "https://nocodb.com/",
+ docs: "https://docs.nocodb.com/",
+ },
+ logo: "nocodb.png",
+ tags: ["database", "spreadsheet", "low-code", "nocode"],
+ load: () => import("./nocodb/index").then((m) => m.generate),
+ },
];