diff --git a/apps/dokploy/public/templates/langflow.svg b/apps/dokploy/public/templates/langflow.svg new file mode 100644 index 000000000..3665f824b --- /dev/null +++ b/apps/dokploy/public/templates/langflow.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/apps/dokploy/public/templates/unsend.png b/apps/dokploy/public/templates/unsend.png new file mode 100644 index 000000000..0bbe5e0ff Binary files /dev/null and b/apps/dokploy/public/templates/unsend.png differ diff --git a/apps/dokploy/templates/langflow/docker-compose.yml b/apps/dokploy/templates/langflow/docker-compose.yml new file mode 100644 index 000000000..75bb73dd1 --- /dev/null +++ b/apps/dokploy/templates/langflow/docker-compose.yml @@ -0,0 +1,33 @@ +version: "3.8" + +services: + langflow: + image: langflowai/langflow:v1.1.1 + ports: + - 7860 + depends_on: + - postgres-langflow + environment: + - LANGFLOW_DATABASE_URL=postgresql://${DB_USERNAME}:${DB_PASSWORD}@postgres-langflow:5432/langflow + # This variable defines where the logs, file storage, monitor data and secret keys are stored. + volumes: + - langflow-data:/app/langflow + networks: + - dokploy-network + + postgres-langflow: + image: postgres:16 + environment: + POSTGRES_USER: ${DB_USERNAME} + POSTGRES_PASSWORD: ${DB_PASSWORD} + POSTGRES_DB: langflow + ports: + - 5432 + volumes: + - langflow-postgres:/var/lib/postgresql/data + networks: + - dokploy-network + +volumes: + langflow-postgres: + langflow-data: \ No newline at end of file diff --git a/apps/dokploy/templates/langflow/index.ts b/apps/dokploy/templates/langflow/index.ts new file mode 100644 index 000000000..75f6db580 --- /dev/null +++ b/apps/dokploy/templates/langflow/index.ts @@ -0,0 +1,28 @@ +import { + type DomainSchema, + type Schema, + type Template, + generatePassword, + generateRandomDomain, +} from "../utils"; + +export function generate(schema: Schema): Template { + const mainDomain = generateRandomDomain(schema); + const dbPassword = generatePassword(); + const dbUsername = "langflow"; + + const domains: DomainSchema[] = [ + { + host: mainDomain, + port: 7860, + serviceName: "langflow", + }, + ]; + + const envs = [`DB_PASSWORD=${dbPassword}`, `DB_USERNAME=${dbUsername}`]; + + return { + domains, + envs, + }; +} diff --git a/apps/dokploy/templates/templates.ts b/apps/dokploy/templates/templates.ts index 5c8b6c8f7..05d8241a2 100644 --- a/apps/dokploy/templates/templates.ts +++ b/apps/dokploy/templates/templates.ts @@ -1077,4 +1077,33 @@ export const templates: TemplateData[] = [ tags: ["project-management", "community", "discussion"], load: () => import("./huly/index").then((m) => m.generate), }, + { + id: "unsend", + name: "Unsend", + version: "v1.2.4", + description: "Open source alternative to Resend,Sendgrid, Postmark etc. ", + logo: "unsend.png", // we defined the name and the extension of the logo + links: { + github: "https://github.com/unsend-dev/unsend", + website: "https://unsend.dev/", + docs: "https://docs.unsend.dev/get-started/", + }, + tags: ["e-mail", "marketing", "business"], + load: () => import("./unsend/index").then((m) => m.generate), + }, + { + id: "langflow", + name: "Langflow", + version: "1.1.1", + description: + "Langflow is a low-code app builder for RAG and multi-agent AI applications. It’s Python-based and agnostic to any model, API, or database. ", + logo: "langflow.svg", + links: { + github: "https://github.com/langflow-ai/langflow/tree/main", + website: "https://www.langflow.org/", + docs: "https://docs.langflow.org/", + }, + tags: ["ai"], + load: () => import("./langflow/index").then((m) => m.generate), + }, ]; diff --git a/apps/dokploy/templates/unsend/docker-compose.yml b/apps/dokploy/templates/unsend/docker-compose.yml new file mode 100644 index 000000000..cdf02de6c --- /dev/null +++ b/apps/dokploy/templates/unsend/docker-compose.yml @@ -0,0 +1,78 @@ +name: unsend-prod + +services: + unsend-db-prod: + image: postgres:16 + networks: + - dokploy-network + restart: always + environment: + - POSTGRES_USER=${POSTGRES_USER:?err} + - POSTGRES_PASSWORD=${POSTGRES_PASSWORD:?err} + - POSTGRES_DB=${POSTGRES_DB:?err} + healthcheck: + test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER}"] + interval: 10s + timeout: 5s + retries: 5 + # ports: + # - "5432:5432" + volumes: + - database:/var/lib/postgresql/data + + unsend-redis-prod: + image: redis:7 + networks: + - dokploy-network + restart: always + # ports: + # - "6379:6379" + volumes: + - cache:/data + command: ["redis-server", "--maxmemory-policy", "noeviction"] + + unsend-storage-prod: + image: minio/minio:RELEASE.2024-11-07T00-52-20Z + networks: + - dokploy-network + ports: + - 9002 + - 9001 + volumes: + - storage:/data + environment: + MINIO_ROOT_USER: unsend + MINIO_ROOT_PASSWORD: password + entrypoint: sh + command: -c 'mkdir -p /data/unsend && minio server /data --console-address ":9001" --address ":9002"' + + unsend: + image: unsend/unsend:v1.2.4 + networks: + - dokploy-network + restart: always + ports: + - ${PORT:-3000} + environment: + - PORT=${PORT:-3000} + - DATABASE_URL=${DATABASE_URL:?err} + - NEXTAUTH_URL=${NEXTAUTH_URL:?err} + - NEXTAUTH_SECRET=${NEXTAUTH_SECRET:?err} + - AWS_ACCESS_KEY=${AWS_ACCESS_KEY:?err} + - AWS_SECRET_KEY=${AWS_SECRET_KEY:?err} + - AWS_DEFAULT_REGION=${AWS_DEFAULT_REGION:?err} + - GITHUB_ID=${GITHUB_ID:?err} + - GITHUB_SECRET=${GITHUB_SECRET:?err} + - REDIS_URL=${REDIS_URL:?err} + - NEXT_PUBLIC_IS_CLOUD=${NEXT_PUBLIC_IS_CLOUD:-false} + - API_RATE_LIMIT=${API_RATE_LIMIT:-1} + depends_on: + unsend-db-prod: + condition: service_healthy + unsend-redis-prod: + condition: service_started + +volumes: + database: + cache: + storage: diff --git a/apps/dokploy/templates/unsend/index.ts b/apps/dokploy/templates/unsend/index.ts new file mode 100644 index 000000000..a383b771f --- /dev/null +++ b/apps/dokploy/templates/unsend/index.ts @@ -0,0 +1,44 @@ +import { + generateHash, + generateRandomDomain, + generateBase64, + type Template, + type Schema, + type DomainSchema, +} from "../utils"; + +export function generate(schema: Schema): Template { + const mainDomain = generateRandomDomain(schema); + const secretBase = generateBase64(64); + + const domains: DomainSchema[] = [ + { + host: mainDomain, + port: 3000, + serviceName: "unsend", + }, + ]; + + const envs = [ + "REDIS_URL=redis://unsend-redis-prod:6379", + "POSTGRES_USER=postgres", + "POSTGRES_PASSWORD=postgres", + "POSTGRES_DB=unsend", + "DATABASE_URL=postgresql://postgres:postgres@unsend-db-prod:5432/unsend", + "NEXTAUTH_URL=http://localhost:3000", + `NEXTAUTH_SECRET=${secretBase}`, + "GITHUB_ID='Fill'", + "GITHUB_SECRET='Fill'", + "AWS_DEFAULT_REGION=us-east-1", + "AWS_SECRET_KEY='Fill'", + "AWS_ACCESS_KEY='Fill'", + "DOCKER_OUTPUT=1", + "API_RATE_LIMIT=1", + "DISCORD_WEBHOOK_URL=", + ]; + + return { + envs, + domains, + }; +}