Merge pull request #691 from DrMxrcy/feat/new-templates

feat: New Templates
This commit is contained in:
Mauricio Siu 2024-11-17 10:51:26 -06:00 committed by GitHub
commit 58338380ab
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
23 changed files with 840 additions and 0 deletions

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 500 500">
<path d="M 175.034 156.727 C 154.522 121.333 162.546 73.285 192.958 49.41 C 223.367 25.535 264.651 34.874 285.163 70.271 L 423.708 309.332 C 444.22 344.732 436.198 392.78 405.783 416.655 C 375.371 440.532 334.094 431.191 313.579 395.794 L 253.513 292.145 C 245.791 280.823 230.072 282.584 220.633 293.569 C 212.808 302.678 210.245 325.982 208.027 346.159 C 207.703 349.123 207.386 352.011 207.057 354.782 C 205.853 367.988 201.934 381.052 195.111 392.832 C 172.809 431.313 127.916 441.458 94.849 415.502 C 61.788 389.543 53.051 337.299 75.353 298.811 C 86.917 278.851 104.563 266.513 123.48 262.884 L 123.455 262.852 C 178.116 253.627 188.248 181.826 178.247 162.266 L 175.034 156.727 Z" fill="#8142E3" style=""/>
</svg>

After

Width:  |  Height:  |  Size: 824 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

View File

@ -0,0 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 256 256" style="enable-background:new 0 0 256 256;" xml:space="preserve">
<style type="text/css">
.st0{fill:#FFFFFF;}
.st1{opacity:0.4;fill:#FFFFFF;}
.st2{fill:#BCD4FC;}
.st3{fill:#3B82F6;}
.st4{fill:#B3B3B3;}
.st5{fill:url(#SVGID_1_);}
.st6{fill:url(#SVGID_00000021089067129159788970000008246765442136188072_);}
.st7{fill:url(#SVGID_00000117639240116366130650000015074833605515028638_);}
.st8{opacity:0.4;fill:url(#SVGID_00000101781798616409025840000016567063639337360777_);}
.st9{opacity:0.4;fill:url(#SVGID_00000052086836598721292040000002033117744178971046_);}
.st10{opacity:0.4;fill:url(#SVGID_00000159460939004760751800000002448009281983951536_);}
.st11{opacity:0.4;fill:url(#SVGID_00000013177830667419993080000017721442101626521532_);}
.st12{opacity:0.4;fill:url(#SVGID_00000152235521444854938490000006526001119318383285_);}
.st13{opacity:0.4;fill:url(#SVGID_00000119823135212293698520000012774889010992664993_);}
</style>
<g>
<polygon class="st2" points="134.78,14.22 114.31,48.21 101.33,69.75 158.22,69.75 177.97,36.95 191.67,14.22 "/>
<polygon class="st3" points="227.55,69.75 186.61,69.75 101.33,69.75 129.78,119.02 158.16,119.02 228.61,119.02 256,119.02 "/>
<polygon class="st3" points="136.93,132.47 116.46,167.93 73.82,241.78 130.71,241.78 144.9,217.2 180.13,156.18 193.82,132.46
"/>
<polygon class="st3" points="121.7,131.95 101.23,96.49 58.59,22.63 30.15,71.91 44.34,96.49 79.57,157.5 93.26,181.22 "/>
<polygon class="st2" points="64.81,131.95 25.15,131.21 0,130.74 28.44,180.01 66.73,180.72 93.26,181.21 "/>
<polygon class="st2" points="165.38,181.74 184.58,216.46 196.75,238.47 225.19,189.2 206.66,155.69 193.83,132.46 "/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@ -0,0 +1,67 @@
version: "3.8"
services:
activepieces:
image: activepieces/activepieces:0.35.0
restart: unless-stopped
networks:
- dokploy-network
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_healthy
environment:
AP_ENGINE_EXECUTABLE_PATH: dist/packages/engine/main.js
AP_API_KEY: ${AP_API_KEY}
AP_ENCRYPTION_KEY: ${AP_ENCRYPTION_KEY}
AP_JWT_SECRET: ${AP_JWT_SECRET}
AP_ENVIRONMENT: prod
AP_FRONTEND_URL: https://${AP_HOST}
AP_WEBHOOK_TIMEOUT_SECONDS: 30
AP_TRIGGER_DEFAULT_POLL_INTERVAL: 5
AP_POSTGRES_DATABASE: activepieces
AP_POSTGRES_HOST: postgres
AP_POSTGRES_PORT: 5432
AP_POSTGRES_USERNAME: activepieces
AP_POSTGRES_PASSWORD: ${AP_POSTGRES_PASSWORD}
AP_EXECUTION_MODE: UNSANDBOXED
AP_REDIS_HOST: redis
AP_REDIS_PORT: 6379
AP_SANDBOX_RUN_TIME_SECONDS: 600
AP_TELEMETRY_ENABLED: "false"
AP_TEMPLATES_SOURCE_URL: https://cloud.activepieces.com/api/v1/flow-templates
postgres:
image: postgres:14
restart: unless-stopped
networks:
- dokploy-network
environment:
POSTGRES_DB: activepieces
POSTGRES_PASSWORD: ${AP_POSTGRES_PASSWORD}
POSTGRES_USER: activepieces
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U activepieces -d activepieces"]
interval: 30s
timeout: 30s
retries: 3
redis:
image: redis:7
restart: unless-stopped
networks:
- dokploy-network
volumes:
- redis_data:/data
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 30s
timeout: 30s
retries: 3
volumes:
postgres_data:
redis_data:

View File

@ -0,0 +1,40 @@
import {
type DomainSchema,
type Schema,
type Template,
generateRandomDomain,
} from "../utils";
export function generate(schema: Schema): Template {
const mainDomain = generateRandomDomain(schema);
const apiKey = Array.from({length: 32}, () =>
Math.floor(Math.random() * 16).toString(16)).join('');
const encryptionKey = Array.from({length: 32}, () =>
Math.floor(Math.random() * 16).toString(16)).join('');
const jwtSecret = Array.from({length: 32}, () =>
Math.floor(Math.random() * 16).toString(16)).join('');
const postgresPassword = Array.from({length: 32}, () =>
Math.floor(Math.random() * 16).toString(16)).join('');
const domains: DomainSchema[] = [
{
host: mainDomain,
port: 80,
serviceName: "activepieces",
},
];
const envs = [
`AP_HOST=${mainDomain}`,
`AP_API_KEY=${apiKey}`,
`AP_ENCRYPTION_KEY=${encryptionKey}`,
`AP_JWT_SECRET=${jwtSecret}`,
`AP_POSTGRES_PASSWORD=${postgresPassword}`,
];
return {
domains,
envs,
};
}

View File

@ -0,0 +1,54 @@
version: "3.8"
services:
mysql:
image: mysql:8
restart: unless-stopped
hostname: mysql
networks:
- dokploy-network
volumes:
- tickets-mysql:/var/lib/mysql
environment:
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_USER: ${MYSQL_USER}
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u${MYSQL_USER}", "-p${MYSQL_PASSWORD}"]
interval: 10s
timeout: 5s
retries: 5
bot:
image: eartharoid/discord-tickets:4.0.21
depends_on:
mysql:
condition: service_healthy
restart: unless-stopped
hostname: bot
networks:
- dokploy-network
volumes:
- tickets-bot:/home/container/user
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
tty: true
stdin_open: true
environment:
DB_CONNECTION_URL: mysql://${MYSQL_USER}:${MYSQL_PASSWORD}@mysql/${MYSQL_DATABASE}
DISCORD_SECRET: ${DISCORD_SECRET}
DISCORD_TOKEN: ${DISCORD_TOKEN}
ENCRYPTION_KEY: ${ENCRYPTION_KEY}
DB_PROVIDER: mysql
HTTP_EXTERNAL: https://${TICKETS_HOST}
HTTP_HOST: 0.0.0.0
HTTP_PORT: 8169
HTTP_TRUST_PROXY: "true"
PUBLIC_BOT: "false"
PUBLISH_COMMANDS: "true"
SUPER: ${SUPER_USERS}
volumes:
tickets-mysql:
tickets-bot:

View File

@ -0,0 +1,46 @@
import {
type DomainSchema,
type Schema,
type Template,
generatePassword,
generateRandomDomain,
} from "../utils";
export function generate(schema: Schema): Template {
const mainDomain = generateRandomDomain(schema);
const mysqlPassword = generatePassword();
const mysqlRootPassword = generatePassword();
const mysqlUser = "tickets";
const mysqlDatabase = "tickets";
// Generate encryption key in the format they use
const encryptionKey = Array.from({length: 48}, () =>
Math.floor(Math.random() * 16).toString(16)).join('');
const domains: DomainSchema[] = [
{
host: mainDomain,
port: 8169,
serviceName: "bot",
},
];
const envs = [
`TICKETS_HOST=${mainDomain}`,
`MYSQL_DATABASE=${mysqlDatabase}`,
`MYSQL_PASSWORD=${mysqlPassword}`,
`MYSQL_ROOT_PASSWORD=${mysqlRootPassword}`,
`MYSQL_USER=${mysqlUser}`,
`ENCRYPTION_KEY=${encryptionKey}`,
// These need to be set by the user through the UI
`# Follow the guide at: https://discordtickets.app/self-hosting/installation/docker/#creating-the-discord-application`,
`DISCORD_SECRET=`,
`DISCORD_TOKEN=`,
`SUPER_USERS=YOUR_DISCORD_USER_ID`, // Default super user
];
return {
domains,
envs,
};
}

View File

@ -0,0 +1,55 @@
version: "3.8"
services:
invoiceshelf_db:
image: postgres:15
networks:
- dokploy-network
volumes:
- postgres_data:/var/lib/postgresql/data
environment:
- POSTGRES_PASSWORD=${DB_PASSWORD}
- POSTGRES_USER=${DB_USERNAME}
- POSTGRES_DB=${DB_DATABASE}
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${DB_USERNAME}"]
interval: 10s
timeout: 5s
retries: 5
invoiceshelf:
image: invoiceshelf/invoiceshelf:latest
networks:
- dokploy-network
volumes:
- app_data:/data
- app_conf:/conf
environment:
- PHP_TZ=UTC
- TIMEZONE=UTC
- APP_NAME=InvoiceShelf
- APP_ENV=production
- APP_DEBUG=false
- APP_URL=http://${INVOICESHELF_HOST}
- DB_CONNECTION=pgsql
- DB_HOST=invoiceshelf_db
- DB_PORT=5432
- DB_DATABASE=${DB_DATABASE}
- DB_USERNAME=${DB_USERNAME}
- DB_PASSWORD=${DB_PASSWORD}
- CACHE_STORE=file
- SESSION_DRIVER=file
- SESSION_LIFETIME=120
- SESSION_ENCRYPT=true
- SESSION_PATH=/
- SESSION_DOMAIN=${INVOICESHELF_HOST}
- SANCTUM_STATEFUL_DOMAINS=${INVOICESHELF_HOST}
- STARTUP_DELAY=10
depends_on:
invoiceshelf_db:
condition: service_healthy
volumes:
postgres_data:
app_data:
app_conf:

View File

@ -0,0 +1,34 @@
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 = "invoiceshelf";
const dbDatabase = "invoiceshelf";
const domains: DomainSchema[] = [
{
host: mainDomain,
port: 80,
serviceName: "invoiceshelf",
},
];
const envs = [
`INVOICESHELF_HOST=${mainDomain}`,
`DB_PASSWORD=${dbPassword}`,
`DB_USERNAME=${dbUsername}`,
`DB_DATABASE=${dbDatabase}`,
];
return {
domains,
envs,
};
}

View File

@ -0,0 +1,36 @@
version: "3.8"
services:
peppermint_postgres:
image: postgres:latest
restart: always
networks:
- dokploy-network
volumes:
- pgdata:/var/lib/postgresql/data
environment:
POSTGRES_USER: peppermint
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: peppermint
healthcheck:
test: ["CMD-SHELL", "pg_isready -U peppermint"]
interval: 10s
timeout: 5s
retries: 5
peppermint:
image: pepperlabs/peppermint:latest
restart: always
networks:
- dokploy-network
depends_on:
peppermint_postgres:
condition: service_healthy
environment:
DB_USERNAME: "peppermint"
DB_PASSWORD: ${POSTGRES_PASSWORD}
DB_HOST: "peppermint_postgres"
SECRET: ${SECRET}
volumes:
pgdata:

View File

@ -0,0 +1,43 @@
import {
type DomainSchema,
type Schema,
type Template,
generateBase64,
generatePassword,
generateRandomDomain,
} from "../utils";
export function generate(schema: Schema): Template {
// Generate domains and secrets
const mainDomain = generateRandomDomain(schema);
const apiDomain = generateRandomDomain(schema);
const postgresPassword = generatePassword();
const secret = generateBase64(32);
// Configure domain routing
const domains: DomainSchema[] = [
{
host: mainDomain,
port: 3000,
serviceName: "peppermint",
},
{
host: apiDomain,
port: 5003,
serviceName: "peppermint",
},
];
// Set environment variables
const envs = [
`MAIN_DOMAIN=${mainDomain}`,
`API_DOMAIN=${apiDomain}`,
`POSTGRES_PASSWORD=${postgresPassword}`,
`SECRET=${secret}`,
];
return {
domains,
envs,
};
}

View File

@ -0,0 +1,64 @@
version: "3.8"
services:
postiz:
image: ghcr.io/gitroomhq/postiz-app:latest
restart: always
networks:
- dokploy-network
environment:
MAIN_URL: "https://${POSTIZ_HOST}"
FRONTEND_URL: "https://${POSTIZ_HOST}"
NEXT_PUBLIC_BACKEND_URL: "https://${POSTIZ_HOST}/api"
JWT_SECRET: ${JWT_SECRET}
DATABASE_URL: "postgresql://${DB_USER}:${DB_PASSWORD}@postiz-postgres:5432/${DB_NAME}"
REDIS_URL: "redis://postiz-redis:6379"
BACKEND_INTERNAL_URL: "http://localhost:3000"
IS_GENERAL: "true"
STORAGE_PROVIDER: "local"
UPLOAD_DIRECTORY: "/uploads"
NEXT_PUBLIC_UPLOAD_DIRECTORY: "/uploads"
volumes:
- postiz-config:/config/
- postiz-uploads:/uploads/
depends_on:
postiz-postgres:
condition: service_healthy
postiz-redis:
condition: service_healthy
postiz-postgres:
image: postgres:17-alpine
restart: always
networks:
- dokploy-network
environment:
POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_USER: ${DB_USER}
POSTGRES_DB: ${DB_NAME}
volumes:
- postgres-volume:/var/lib/postgresql/data
healthcheck:
test: pg_isready -U ${DB_USER} -d ${DB_NAME}
interval: 10s
timeout: 3s
retries: 3
postiz-redis:
image: redis:7.2
restart: always
networks:
- dokploy-network
healthcheck:
test: redis-cli ping
interval: 10s
timeout: 3s
retries: 3
volumes:
- postiz-redis-data:/data
volumes:
postgres-volume:
postiz-redis-data:
postiz-config:
postiz-uploads:

View File

@ -0,0 +1,37 @@
import {
type DomainSchema,
type Schema,
type Template,
generatePassword,
generateRandomDomain,
generateBase64,
} from "../utils";
export function generate(schema: Schema): Template {
const mainDomain = generateRandomDomain(schema);
const dbPassword = generatePassword();
const dbUser = "postiz";
const dbName = "postiz";
const jwtSecret = generateBase64(32);
const domains: DomainSchema[] = [
{
host: mainDomain,
port: 5000,
serviceName: "postiz",
},
];
const envs = [
`POSTIZ_HOST=${mainDomain}`,
`DB_PASSWORD=${dbPassword}`,
`DB_USER=${dbUser}`,
`DB_NAME=${dbName}`,
`JWT_SECRET=${jwtSecret}`,
];
return {
domains,
envs,
};
}

View File

@ -0,0 +1,37 @@
version: "3.8"
services:
slash:
image: yourselfhosted/slash:latest
networks:
- dokploy-network
volumes:
- slash_data:/var/opt/slash
environment:
- SLASH_DRIVER=postgres
- SLASH_DSN=postgresql://${DB_USER}:${DB_PASSWORD}@db:5432/${DB_NAME}?sslmode=disable
depends_on:
db:
condition: service_healthy
restart: unless-stopped
db:
image: postgres:16-alpine
networks:
- dokploy-network
volumes:
- postgres_data:/var/lib/postgresql/data
environment:
- POSTGRES_USER=${DB_USER}
- POSTGRES_PASSWORD=${DB_PASSWORD}
- POSTGRES_DB=${DB_NAME}
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${DB_USER} -d ${DB_NAME}"]
interval: 10s
timeout: 5s
retries: 5
restart: unless-stopped
volumes:
slash_data:
postgres_data:

View File

@ -0,0 +1,33 @@
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 dbUser = "slash";
const dbName = "slash";
const domains: DomainSchema[] = [
{
host: mainDomain,
port: 5231,
serviceName: "slash",
},
];
const envs = [
`DB_USER=${dbUser}`,
`DB_PASSWORD=${dbPassword}`,
`DB_NAME=${dbName}`,
];
return {
domains,
envs,
};
}

View File

@ -703,6 +703,104 @@ export const templates: TemplateData[] = [
load: () => import("./lobe-chat/index").then((m) => m.generate),
},
{
id: "peppermint",
name: "Peppermint",
version: "latest",
description: "Peppermint is a modern, open-source API development platform that helps you build, test and document your APIs.",
logo: "peppermint.svg",
links: {
github: "https://github.com/Peppermint-Lab/peppermint",
website: "https://peppermint.sh/",
docs: "https://docs.peppermint.sh/"
},
tags: ["api", "development", "documentation"],
load: () => import("./peppermint/index").then((m) => m.generate),
},
{
id: "windmill",
name: "Windmill",
version: "latest",
description: "A developer platform to build production-grade workflows and internal apps. Open-source alternative to Airplane, Retool, and GitHub Actions.",
logo: "windmill.svg",
links: {
github: "https://github.com/windmill-labs/windmill",
website: "https://www.windmill.dev/",
docs: "https://docs.windmill.dev/",
},
tags: ["workflow", "automation", "development"],
load: () => import("./windmill/index").then((m) => m.generate),
},
{
id: "activepieces",
name: "Activepieces",
version: "0.35.0",
description: "Open-source no-code business automation tool. An alternative to Zapier, Make.com, and Tray.",
logo: "activepieces.svg",
links: {
github: "https://github.com/activepieces/activepieces",
website: "https://www.activepieces.com/",
docs: "https://www.activepieces.com/docs",
},
tags: ["automation", "workflow", "no-code"],
load: () => import("./activepieces/index").then((m) => m.generate),
},
{
id: "invoiceshelf",
name: "InvoiceShelf",
version: "latest",
description: "InvoiceShelf is a self-hosted open source invoicing system for freelancers and small businesses.",
logo: "invoiceshelf.png",
links: {
github: "https://github.com/InvoiceShelf/invoiceshelf",
website: "https://invoiceshelf.com",
docs: "https://github.com/InvoiceShelf/invoiceshelf#readme",
},
tags: ["invoice", "business", "finance"],
load: () => import("./invoiceshelf/index").then((m) => m.generate),
},
{
id: "postiz",
name: "Postiz",
version: "latest",
description: "Postiz is a modern, open-source platform for managing and publishing content across multiple channels.",
logo: "postiz.png",
links: {
github: "https://github.com/gitroomhq/postiz",
website: "https://postiz.io",
docs: "https://docs.postiz.io",
},
tags: ["cms", "content-management", "publishing"],
load: () => import("./postiz/index").then((m) => m.generate),
},
{
id: "slash",
name: "Slash",
version: "latest",
description: "Slash is a modern, self-hosted bookmarking service and link shortener that helps you organize and share your favorite links.",
logo: "slash.png",
links: {
github: "https://github.com/yourselfhosted/slash",
website: "https://github.com/yourselfhosted/slash#readme",
docs: "https://github.com/yourselfhosted/slash/wiki",
},
tags: ["bookmarks", "link-shortener", "self-hosted"],
load: () => import("./slash/index").then((m) => m.generate),
},
{
id: "discord-tickets",
name: "Discord Tickets",
version: "4.0.21",
description: "An open-source Discord bot for creating and managing support ticket channels.",
logo: "discord-tickets.png",
links: {
github: "https://github.com/discord-tickets/bot",
website: "https://discordtickets.app",
docs: "https://discordtickets.app/self-hosting/installation/docker/",
},
tags: ["discord", "tickets", "support"],
load: () => import("./discord-tickets/index").then((m) => m.generate),
},
{
id: "nextcloud-aio",
name: "Nextcloud All in One",
version: "30.0.2",

View File

@ -0,0 +1,107 @@
version: "3.8"
services:
db:
image: postgres:16
shm_size: 1g
restart: unless-stopped
volumes:
- db_data:/var/lib/postgresql/data
networks:
- dokploy-network
environment:
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: windmill
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 10s
timeout: 5s
retries: 5
windmill_server:
image: ghcr.io/windmill-labs/windmill:main
networks:
- dokploy-network
restart: unless-stopped
environment:
- DATABASE_URL=${DATABASE_URL}
- MODE=server
- BASE_URL=http://${WINDMILL_HOST}
depends_on:
db:
condition: service_healthy
volumes:
- worker_logs:/tmp/windmill/logs
windmill_worker:
image: ghcr.io/windmill-labs/windmill:main
deploy:
replicas: 3
resources:
limits:
cpus: "1"
memory: 2048M
restart: unless-stopped
networks:
- dokploy-network
environment:
- DATABASE_URL=${DATABASE_URL}
- MODE=worker
- WORKER_GROUP=default
depends_on:
db:
condition: service_healthy
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- worker_dependency_cache:/tmp/windmill/cache
- worker_logs:/tmp/windmill/logs
windmill_worker_native:
image: ghcr.io/windmill-labs/windmill:main
deploy:
replicas: 1
resources:
limits:
cpus: "0.1"
memory: 128M
restart: unless-stopped
networks:
- dokploy-network
environment:
- DATABASE_URL=${DATABASE_URL}
- MODE=worker
- WORKER_GROUP=native
- NUM_WORKERS=8
- SLEEP_QUEUE=200
depends_on:
db:
condition: service_healthy
volumes:
- worker_logs:/tmp/windmill/logs
lsp:
image: ghcr.io/windmill-labs/windmill-lsp:latest
restart: unless-stopped
networks:
- dokploy-network
volumes:
- lsp_cache:/root/.cache
caddy:
image: ghcr.io/windmill-labs/caddy-l4:latest
restart: unless-stopped
networks:
- dokploy-network
volumes:
- ../files/Caddyfile:/etc/caddy/Caddyfile
environment:
- BASE_URL=":80"
depends_on:
- windmill_server
- lsp
volumes:
db_data:
worker_dependency_cache:
worker_logs:
lsp_cache:

View File

@ -0,0 +1,43 @@
import {
type DomainSchema,
type Schema,
type Template,
generatePassword,
generateRandomDomain,
} from "../utils";
export function generate(schema: Schema): Template {
const mainDomain = generateRandomDomain(schema);
const postgresPassword = generatePassword();
const domains: DomainSchema[] = [
{
host: mainDomain,
port: 80,
serviceName: "caddy",
},
];
const envs = [
`WINDMILL_HOST=${mainDomain}`,
`POSTGRES_PASSWORD=${postgresPassword}`,
`DATABASE_URL=postgres://postgres:${postgresPassword}@db/windmill?sslmode=disable`,
];
const mounts: Template["mounts"] = [
{
filePath: "Caddyfile",
content: `:80 {
bind 0.0.0.0
reverse_proxy /ws/* http://lsp:3001
reverse_proxy /* http://windmill_server:8000
}`,
},
];
return {
domains,
envs,
mounts,
};
}