From 0e8a3c36f3a6f23d152ff45948a5853a3225ab60 Mon Sep 17 00:00:00 2001
From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com>
Date: Sun, 27 Oct 2024 18:12:23 -0600
Subject: [PATCH 1/2] feat(dokploy): add stirling
---
apps/dokploy/public/templates/stirling.svg | 17 ++++++++++++
.../templates/soketi/docker-compose.yml | 27 ++++++++++++-------
.../templates/stirling/docker-compose.yml | 12 +++++++++
apps/dokploy/templates/stirling/index.ts | 22 +++++++++++++++
apps/dokploy/templates/templates.ts | 14 ++++++++++
5 files changed, 82 insertions(+), 10 deletions(-)
create mode 100644 apps/dokploy/public/templates/stirling.svg
create mode 100644 apps/dokploy/templates/stirling/docker-compose.yml
create mode 100644 apps/dokploy/templates/stirling/index.ts
diff --git a/apps/dokploy/public/templates/stirling.svg b/apps/dokploy/public/templates/stirling.svg
new file mode 100644
index 00000000..0db55164
--- /dev/null
+++ b/apps/dokploy/public/templates/stirling.svg
@@ -0,0 +1,17 @@
+
diff --git a/apps/dokploy/templates/soketi/docker-compose.yml b/apps/dokploy/templates/soketi/docker-compose.yml
index 1784cdc7..2df68165 100644
--- a/apps/dokploy/templates/soketi/docker-compose.yml
+++ b/apps/dokploy/templates/soketi/docker-compose.yml
@@ -1,12 +1,19 @@
-version: "3"
-
+version: '3.3'
services:
- soketi:
- image: quay.io/soketi/soketi:1.4-16-debian
- container_name: soketi
+ stirling-pdf:
+ image: frooodle/s-pdf:0.30.1
+ ports:
+ - '8080'
+ volumes:
+ - training-data:/usr/share/tessdata #Required for extra OCR languages
+ - extra-configs:/configs
+ # - /location/of/customFiles:/customFiles/
+ # - /location/of/logs:/logs/
environment:
- SOKETI_DEBUG: "1"
- SOKETI_HOST: "0.0.0.0"
- SOKETI_PORT: "6001"
- SOKETI_METRICS_SERVER_PORT: "9601"
- restart: unless-stopped
+ - DOCKER_ENABLE_SECURITY=false
+ - INSTALL_BOOK_AND_ADVANCED_HTML_OPS=false
+ - LANGS=en_GB
+
+volumes:
+ training-data: {}
+ extra-configs: {}
\ No newline at end of file
diff --git a/apps/dokploy/templates/stirling/docker-compose.yml b/apps/dokploy/templates/stirling/docker-compose.yml
new file mode 100644
index 00000000..1784cdc7
--- /dev/null
+++ b/apps/dokploy/templates/stirling/docker-compose.yml
@@ -0,0 +1,12 @@
+version: "3"
+
+services:
+ soketi:
+ image: quay.io/soketi/soketi:1.4-16-debian
+ container_name: soketi
+ environment:
+ SOKETI_DEBUG: "1"
+ SOKETI_HOST: "0.0.0.0"
+ SOKETI_PORT: "6001"
+ SOKETI_METRICS_SERVER_PORT: "9601"
+ restart: unless-stopped
diff --git a/apps/dokploy/templates/stirling/index.ts b/apps/dokploy/templates/stirling/index.ts
new file mode 100644
index 00000000..a8df5e33
--- /dev/null
+++ b/apps/dokploy/templates/stirling/index.ts
@@ -0,0 +1,22 @@
+import {
+ type DomainSchema,
+ type Schema,
+ type Template,
+ generateRandomDomain,
+} from "../utils";
+
+export function generate(schema: Schema): Template {
+ const mainDomain = generateRandomDomain(schema);
+
+ const domains: DomainSchema[] = [
+ {
+ host: mainDomain,
+ port: 8080,
+ serviceName: "stirling-pdf",
+ },
+ ];
+
+ return {
+ domains,
+ };
+}
diff --git a/apps/dokploy/templates/templates.ts b/apps/dokploy/templates/templates.ts
index 372af8bb..86eb9942 100644
--- a/apps/dokploy/templates/templates.ts
+++ b/apps/dokploy/templates/templates.ts
@@ -557,4 +557,18 @@ export const templates: TemplateData[] = [
tags: ["cloud", "monitoring"],
load: () => import("./portainer/index").then((m) => m.generate),
},
+ {
+ id: "stirling",
+ name: "Stirling PDF",
+ version: "0.30.1",
+ description: "A locally hosted one-stop shop for all your PDF needs",
+ logo: "stirling.svg",
+ links: {
+ github: "https://github.com/Stirling-Tools/Stirling-PDF",
+ website: "https://www.stirlingpdf.com/",
+ docs: "https://docs.stirlingpdf.com/",
+ },
+ tags: ["pdf", "tools"],
+ load: () => import("./portainer/index").then((m) => m.generate),
+ },
];
From cf666ceb19672c0cda4a963ee1c1ea296b994bde Mon Sep 17 00:00:00 2001
From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com>
Date: Sun, 27 Oct 2024 20:48:42 -0600
Subject: [PATCH 2/2] feat(dokploy): add lobe chat
---
apps/dokploy/public/templates/lobe-chat.png | Bin 0 -> 9294 bytes
apps/dokploy/server/api/routers/compose.ts | 4 ++--
.../templates/lobe-chat/docker-compose.yml | 12 ++++++++++
apps/dokploy/templates/lobe-chat/index.ts | 22 ++++++++++++++++++
apps/dokploy/templates/templates.ts | 16 ++++++++++++-
5 files changed, 51 insertions(+), 3 deletions(-)
create mode 100644 apps/dokploy/public/templates/lobe-chat.png
create mode 100644 apps/dokploy/templates/lobe-chat/docker-compose.yml
create mode 100644 apps/dokploy/templates/lobe-chat/index.ts
diff --git a/apps/dokploy/public/templates/lobe-chat.png b/apps/dokploy/public/templates/lobe-chat.png
new file mode 100644
index 0000000000000000000000000000000000000000..cc29879cf45b0e3ba319e05068d8dbc09d3a4878
GIT binary patch
literal 9294
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
literal 0
HcmV?d00001
diff --git a/apps/dokploy/server/api/routers/compose.ts b/apps/dokploy/server/api/routers/compose.ts
index e9ccd33b..441e1f80 100644
--- a/apps/dokploy/server/api/routers/compose.ts
+++ b/apps/dokploy/server/api/routers/compose.ts
@@ -357,9 +357,9 @@ export const composeRouter = createTRPCRouter({
const generate = await loadTemplateModule(input.id as TemplatesKeys);
const admin = await findAdminById(ctx.user.adminId);
- let serverIp = admin.serverIp;
+ let serverIp = admin.serverIp || "127.0.0.1";
- if (!admin.serverIp) {
+ if (!serverIp) {
throw new TRPCError({
code: "NOT_FOUND",
message:
diff --git a/apps/dokploy/templates/lobe-chat/docker-compose.yml b/apps/dokploy/templates/lobe-chat/docker-compose.yml
new file mode 100644
index 00000000..67614090
--- /dev/null
+++ b/apps/dokploy/templates/lobe-chat/docker-compose.yml
@@ -0,0 +1,12 @@
+version: '3.8'
+
+services:
+ lobe-chat:
+ image: lobehub/lobe-chat:v1.26.1
+ restart: always
+ ports:
+ - 3210
+ environment:
+ OPENAI_API_KEY: sk-xxxx
+ OPENAI_PROXY_URL: https://api-proxy.com/v1
+ ACCESS_CODE: lobe66
\ No newline at end of file
diff --git a/apps/dokploy/templates/lobe-chat/index.ts b/apps/dokploy/templates/lobe-chat/index.ts
new file mode 100644
index 00000000..a07a4e09
--- /dev/null
+++ b/apps/dokploy/templates/lobe-chat/index.ts
@@ -0,0 +1,22 @@
+import {
+ type DomainSchema,
+ type Schema,
+ type Template,
+ generateRandomDomain,
+} from "../utils";
+
+export function generate(schema: Schema): Template {
+ const mainDomain = generateRandomDomain(schema);
+
+ const domains: DomainSchema[] = [
+ {
+ host: mainDomain,
+ port: 3210,
+ serviceName: "lobe-chat",
+ },
+ ];
+
+ return {
+ domains,
+ };
+}
diff --git a/apps/dokploy/templates/templates.ts b/apps/dokploy/templates/templates.ts
index 86eb9942..c43ffc20 100644
--- a/apps/dokploy/templates/templates.ts
+++ b/apps/dokploy/templates/templates.ts
@@ -569,6 +569,20 @@ export const templates: TemplateData[] = [
docs: "https://docs.stirlingpdf.com/",
},
tags: ["pdf", "tools"],
- load: () => import("./portainer/index").then((m) => m.generate),
+ load: () => import("./stirling/index").then((m) => m.generate),
+ },
+ {
+ id: "lobe-chat",
+ name: "Lobe Chat",
+ version: "v1.26.1",
+ description: "Lobe Chat - an open-source, modern-design AI chat framework.",
+ logo: "lobe-chat.png",
+ links: {
+ github: "https://github.com/lobehub/lobe-chat",
+ website: "https://chat-preview.lobehub.com/",
+ docs: "https://lobehub.com/docs/self-hosting/platform/docker-compose",
+ },
+ tags: ["IA", "chat"],
+ load: () => import("./lobe-chat/index").then((m) => m.generate),
},
];