Merge pull request #691 from DrMxrcy/feat/new-templates
feat: New Templates
4
apps/dokploy/public/templates/activepieces.svg
Normal 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 |
BIN
apps/dokploy/public/templates/discord-tickets.png
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
apps/dokploy/public/templates/discordtickets.png
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
apps/dokploy/public/templates/invoiceshelf.png
Normal file
After Width: | Height: | Size: 23 KiB |
13
apps/dokploy/public/templates/peppermint.svg
Normal file
After Width: | Height: | Size: 13 KiB |
BIN
apps/dokploy/public/templates/postiz.png
Normal file
After Width: | Height: | Size: 52 KiB |
BIN
apps/dokploy/public/templates/slash.png
Normal file
After Width: | Height: | Size: 18 KiB |
29
apps/dokploy/public/templates/windmill.svg
Normal 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 |
67
apps/dokploy/templates/activepieces/docker-compose.yml
Normal 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:
|
40
apps/dokploy/templates/activepieces/index.ts
Normal 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,
|
||||
};
|
||||
}
|
54
apps/dokploy/templates/discord-tickets/docker-compose.yml
Normal 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:
|
46
apps/dokploy/templates/discord-tickets/index.ts
Normal 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,
|
||||
};
|
||||
}
|
55
apps/dokploy/templates/invoiceshelf/docker-compose.yml
Normal 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:
|
34
apps/dokploy/templates/invoiceshelf/index.ts
Normal 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,
|
||||
};
|
||||
}
|
36
apps/dokploy/templates/peppermint/docker-compose.yml
Normal 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:
|
43
apps/dokploy/templates/peppermint/index.ts
Normal 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,
|
||||
};
|
||||
}
|
64
apps/dokploy/templates/postiz/docker-compose.yml
Normal 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:
|
37
apps/dokploy/templates/postiz/index.ts
Normal 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,
|
||||
};
|
||||
}
|
37
apps/dokploy/templates/slash/docker-compose.yml
Normal 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:
|
33
apps/dokploy/templates/slash/index.ts
Normal 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,
|
||||
};
|
||||
}
|
@ -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",
|
||||
|
107
apps/dokploy/templates/windmill/docker-compose.yml
Normal 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:
|
43
apps/dokploy/templates/windmill/index.ts
Normal 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,
|
||||
};
|
||||
}
|