diff --git a/apps/dokploy/public/templates/evolutionapi.png b/apps/dokploy/public/templates/evolutionapi.png new file mode 100644 index 00000000..bd9b3850 Binary files /dev/null and b/apps/dokploy/public/templates/evolutionapi.png differ diff --git a/apps/dokploy/public/templates/formbricks.png b/apps/dokploy/public/templates/formbricks.png new file mode 100644 index 00000000..2bf1ca1f Binary files /dev/null and b/apps/dokploy/public/templates/formbricks.png differ diff --git a/apps/dokploy/templates/evolutionapi/docker-compose.yml b/apps/dokploy/templates/evolutionapi/docker-compose.yml new file mode 100644 index 00000000..54657e87 --- /dev/null +++ b/apps/dokploy/templates/evolutionapi/docker-compose.yml @@ -0,0 +1,61 @@ +services: + evolution-api: + image: atendai/evolution-api:v2.1.2 + restart: always + volumes: + - evolution-instances:/evolution/instances + networks: + - dokploy-network + environment: + - SERVER_URL=${SERVER_URL} + - AUTHENTICATION_TYPE=${AUTHENTICATION_TYPE} + - AUTHENTICATION_API_KEY=${AUTHENTICATION_API_KEY} + - AUTHENTICATION_EXPOSE_IN_FETCH_INSTANCES=${AUTHENTICATION_EXPOSE_IN_FETCH_INSTANCES} + - LANGUAGE=${LANGUAGE} + - CONFIG_SESSION_PHONE_CLIENT=${CONFIG_SESSION_PHONE_CLIENT} + - CONFIG_SESSION_PHONE_NAME=${CONFIG_SESSION_PHONE_NAME} + - TELEMETRY=${TELEMETRY} + - TELEMETRY_URL=${TELEMETRY_URL} + - DATABASE_ENABLED=${DATABASE_ENABLED} + - DATABASE_PROVIDER=${DATABASE_PROVIDER} + - DATABASE_CONNECTION_URI=${DATABASE_CONNECTION_URI} + - DATABASE_SAVE_DATA_INSTANCE=${DATABASE_SAVE_DATA_INSTANCE} + - DATABASE_SAVE_DATA_NEW_MESSAGE=${DATABASE_SAVE_DATA_NEW_MESSAGE} + - DATABASE_SAVE_MESSAGE_UPDATE=${DATABASE_SAVE_MESSAGE_UPDATE} + - DATABASE_SAVE_DATA_CONTACTS=${DATABASE_SAVE_DATA_CONTACTS} + - DATABASE_SAVE_DATA_CHATS=${DATABASE_SAVE_DATA_CHATS} + - DATABASE_SAVE_DATA_LABELS=${DATABASE_SAVE_DATA_LABELS} + - DATABASE_SAVE_DATA_HISTORIC=${DATABASE_SAVE_DATA_HISTORIC} + - CACHE_REDIS_ENABLED=${CACHE_REDIS_ENABLED} + - CACHE_REDIS_URI=${CACHE_REDIS_URI} + - CACHE_REDIS_PREFIX_KEY=${CACHE_REDIS_PREFIX_KEY} + - CACHE_REDIS_SAVE_INSTANCES=${CACHE_REDIS_SAVE_INSTANCES} + + evolution-postgres: + image: postgres:16-alpine + restart: always + volumes: + - evolution-postgres-data:/var/lib/postgresql/data + networks: + - dokploy-network + environment: + - POSTGRES_DB=${POSTGRES_DATABASE} + - POSTGRES_USER=${POSTGRES_USERNAME} + - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} + + evolution-redis: + image: redis:alpine + restart: always + volumes: + - evolution-redis-data:/data + networks: + - dokploy-network + +networks: + dokploy-network: + external: true + +volumes: + evolution-instances: + evolution-postgres-data: + evolution-redis-data: \ No newline at end of file diff --git a/apps/dokploy/templates/evolutionapi/index.ts b/apps/dokploy/templates/evolutionapi/index.ts new file mode 100644 index 00000000..bd3e81aa --- /dev/null +++ b/apps/dokploy/templates/evolutionapi/index.ts @@ -0,0 +1,59 @@ +import { + type DomainSchema, + type Schema, + type Template, + generateBase64, + generatePassword, + generateRandomDomain, +} from "../utils"; + +export function generate(schema: Schema): Template { + const mainDomain = generateRandomDomain(schema); + const apiKey = generateBase64(64); + const postgresPassword = generatePassword(); + + const domains: DomainSchema[] = [ + { + host: mainDomain, + port: 8080, + serviceName: "evolution-api", + }, + ]; + + const envs = [ + `SERVER_URL=https://${mainDomain}`, + "AUTHENTICATION_TYPE=apikey", + `AUTHENTICATION_API_KEY=${apiKey}`, + "AUTHENTICATION_EXPOSE_IN_FETCH_INSTANCES=true", + + "LANGUAGE=en", + "CONFIG_SESSION_PHONE_CLIENT=Evolution API", + "CONFIG_SESSION_PHONE_NAME=Chrome", + "TELEMETRY=false", + "TELEMETRY_URL=", + + "POSTGRES_DATABASE=evolution", + "POSTGRES_USERNAME=postgresql", + `POSTGRES_PASSWORD=${postgresPassword}`, + "DATABASE_ENABLED=true", + "DATABASE_PROVIDER=postgresql", + `DATABASE_CONNECTION_URI=postgres://postgresql:${postgresPassword}@evolution-postgres:5432/evolution`, + "DATABASE_SAVE_DATA_INSTANCE=true", + "DATABASE_SAVE_DATA_NEW_MESSAGE=true", + "DATABASE_SAVE_MESSAGE_UPDATE=true", + "DATABASE_SAVE_DATA_CONTACTS=true", + "DATABASE_SAVE_DATA_CHATS=true", + "DATABASE_SAVE_DATA_LABELS=true", + "DATABASE_SAVE_DATA_HISTORIC=true", + + "CACHE_REDIS_ENABLED=true", + "CACHE_REDIS_URI=redis://evolution-redis:6379", + "CACHE_REDIS_PREFIX_KEY=evolution", + "CACHE_REDIS_SAVE_INSTANCES=true", + ]; + + return { + domains, + envs, + }; +} diff --git a/apps/dokploy/templates/formbricks/docker-compose.yml b/apps/dokploy/templates/formbricks/docker-compose.yml new file mode 100644 index 00000000..558f8b4d --- /dev/null +++ b/apps/dokploy/templates/formbricks/docker-compose.yml @@ -0,0 +1,38 @@ +x-environment: &environment + environment: + WEBAPP_URL: ${WEBAPP_URL} + NEXTAUTH_URL: ${NEXTAUTH_URL} + DATABASE_URL: "postgresql://postgres:postgres@postgres:5432/formbricks?schema=public" + NEXTAUTH_SECRET: ${NEXTAUTH_SECRET} + ENCRYPTION_KEY: ${ENCRYPTION_KEY} + CRON_SECRET: ${CRON_SECRET} + EMAIL_VERIFICATION_DISABLED: 1 + PASSWORD_RESET_DISABLED: 1 + S3_FORCE_PATH_STYLE: 0 + +services: + postgres: + restart: always + image: pgvector/pgvector:pg17 + volumes: + - postgres:/var/lib/postgresql/data + environment: + - POSTGRES_PASSWORD=postgres + networks: + - dokploy-network + + formbricks: + restart: always + image: ghcr.io/formbricks/formbricks:v3.1.3 + depends_on: + - postgres + ports: + - 3000 + volumes: + - ../files/uploads:/home/nextjs/apps/web/uploads/ + <<: *environment + +volumes: + postgres: + driver: local + uploads: diff --git a/apps/dokploy/templates/formbricks/index.ts b/apps/dokploy/templates/formbricks/index.ts new file mode 100644 index 00000000..8cede8ed --- /dev/null +++ b/apps/dokploy/templates/formbricks/index.ts @@ -0,0 +1,39 @@ +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 encryptionKey = generateBase64(48); + const cronSecret = generateBase64(32); + + const domains: DomainSchema[] = [ + { + host: mainDomain, + port: 3000, + serviceName: "formbricks", + }, + ]; + + const envs = [ + `WEBAPP_URL=http://${mainDomain}`, + `NEXTAUTH_URL=http://${mainDomain}`, + `NEXTAUTH_SECRET=${secretBase}`, + `ENCRYPTION_KEY=${encryptionKey}`, + `CRON_SECRET=${cronSecret}`, + + ]; + + const mounts: Template["mounts"] = []; + + return { + envs, + mounts, + domains, + }; +} diff --git a/apps/dokploy/templates/listmonk/docker-compose.yml b/apps/dokploy/templates/listmonk/docker-compose.yml index 725d0a09..17b09f41 100644 --- a/apps/dokploy/templates/listmonk/docker-compose.yml +++ b/apps/dokploy/templates/listmonk/docker-compose.yml @@ -1,6 +1,6 @@ services: db: - image: postgres:13 + image: postgres:17-alpine ports: - 5432 networks: @@ -19,7 +19,7 @@ services: - listmonk-data:/var/lib/postgresql/data setup: - image: listmonk/listmonk:v3.0.0 + image: listmonk/listmonk:v4.1.0 networks: - dokploy-network volumes: @@ -35,7 +35,7 @@ services: app: restart: unless-stopped - image: listmonk/listmonk:v3.0.0 + image: listmonk/listmonk:v4.1.0 environment: - TZ=Etc/UTC depends_on: diff --git a/apps/dokploy/templates/listmonk/index.ts b/apps/dokploy/templates/listmonk/index.ts index 725659ca..113b3862 100644 --- a/apps/dokploy/templates/listmonk/index.ts +++ b/apps/dokploy/templates/listmonk/index.ts @@ -2,13 +2,11 @@ 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[] = [ { @@ -19,7 +17,7 @@ export function generate(schema: Schema): Template { ]; const envs = [ - `# login with admin:${adminPassword}`, + `# visit the page to setup your super admin user`, "# check config.toml in Advanced / Volumes for more options", ]; @@ -29,9 +27,6 @@ export function generate(schema: Schema): Template { content: `[app] address = "0.0.0.0:9000" -admin_username = "admin" -admin_password = "${adminPassword}" - [db] host = "db" port = 5432 diff --git a/apps/dokploy/templates/teable/docker-compose.yml b/apps/dokploy/templates/teable/docker-compose.yml index b96b677c..959de21c 100644 --- a/apps/dokploy/templates/teable/docker-compose.yml +++ b/apps/dokploy/templates/teable/docker-compose.yml @@ -2,7 +2,7 @@ version: "3.9" services: teable: - image: ghcr.io/teableio/teable:1.3.1-alpha-build.460 + image: ghcr.io/teableio/teable:latest restart: always volumes: - teable-data:/app/.assets diff --git a/apps/dokploy/templates/templates.ts b/apps/dokploy/templates/templates.ts index 78cb39a2..650d3b13 100644 --- a/apps/dokploy/templates/templates.ts +++ b/apps/dokploy/templates/templates.ts @@ -1239,6 +1239,21 @@ export const templates: TemplateData[] = [ tags: ["matrix", "communication"], load: () => import("./conduit/index").then((m) => m.generate), }, + { + id: "evolutionapi", + name: "Evolution API", + version: "v2.1.2", + description: + "Evolution API is a robust platform dedicated to empowering small businesses with limited resources, going beyond a simple messaging solution via WhatsApp.", + logo: "evolutionapi.png", + links: { + github: "https://github.com/EvolutionAPI/evolution-api", + docs: "https://doc.evolution-api.com/v2/en/get-started/introduction", + website: "https://evolution-api.com/opensource-whatsapp-api/", + }, + tags: ["api", "whatsapp", "messaging"], + load: () => import("./evolutionapi/index").then((m) => m.generate), + }, { id: "conduwuit", name: "Conduwuit", @@ -1452,5 +1467,21 @@ export const templates: TemplateData[] = [ }, tags: ["hrms", "payroll", "leaves", "expenses", "attendance", "performace"], load: () => import("./frappe-hr/index").then((m) => m.generate), + }, + { + id: "formbricks", + name: "Formbricks", + version: "v3.1.3", + description: + "Formbricks is an open-source survey and form platform for collecting user data.", + logo: "formbricks.png", + links: { + github: "https://github.com/formbricks/formbricks", + website: "https://formbricks.com/", + docs: "https://formbricks.com/docs", + }, + tags: ["forms", "analytics"], + load: () => import("./formbricks/index").then((m) => m.generate), + }, ];