From 4f092b2fb335d0c4b38aa8f9b79ee575426d42ec Mon Sep 17 00:00:00 2001 From: DrMxrcy Date: Tue, 12 Nov 2024 13:12:31 -0500 Subject: [PATCH] Add: InvoiceShelf --- .../dokploy/public/templates/invoiceshelf.png | Bin 0 -> 23342 bytes .../templates/invoiceshelf/docker-compose.yml | 55 ++++++++++++++++++ apps/dokploy/templates/invoiceshelf/index.ts | 34 +++++++++++ apps/dokploy/templates/templates.ts | 14 +++++ 4 files changed, 103 insertions(+) create mode 100644 apps/dokploy/public/templates/invoiceshelf.png create mode 100644 apps/dokploy/templates/invoiceshelf/docker-compose.yml create mode 100644 apps/dokploy/templates/invoiceshelf/index.ts diff --git a/apps/dokploy/public/templates/invoiceshelf.png b/apps/dokploy/public/templates/invoiceshelf.png new file mode 100644 index 0000000000000000000000000000000000000000..cee025e02bfe560d72279438c4e9507530e5b233 GIT binary patch literal 23342 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 JPDHLkV1hXjTBra3 literal 0 HcmV?d00001 diff --git a/apps/dokploy/templates/invoiceshelf/docker-compose.yml b/apps/dokploy/templates/invoiceshelf/docker-compose.yml new file mode 100644 index 00000000..ac4c8d26 --- /dev/null +++ b/apps/dokploy/templates/invoiceshelf/docker-compose.yml @@ -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: \ No newline at end of file diff --git a/apps/dokploy/templates/invoiceshelf/index.ts b/apps/dokploy/templates/invoiceshelf/index.ts new file mode 100644 index 00000000..2e7c5cf7 --- /dev/null +++ b/apps/dokploy/templates/invoiceshelf/index.ts @@ -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, + }; +} \ No newline at end of file diff --git a/apps/dokploy/templates/templates.ts b/apps/dokploy/templates/templates.ts index c41b0e8d..27b4921f 100644 --- a/apps/dokploy/templates/templates.ts +++ b/apps/dokploy/templates/templates.ts @@ -744,4 +744,18 @@ export const templates: TemplateData[] = [ 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), + }, ];