mirror of
https://github.com/Dokploy/dokploy
synced 2025-06-26 18:27:59 +00:00
Merge branch 'canary' into feature/delete-docker-volumes
This commit is contained in:
@@ -1,25 +1,34 @@
|
||||
import Head from "next/head";
|
||||
import { Navbar } from "./navbar";
|
||||
import { NavigationTabs, type TabState } from "./navigation-tabs";
|
||||
|
||||
interface Props {
|
||||
children: React.ReactNode;
|
||||
tab: TabState;
|
||||
metaName?: string;
|
||||
}
|
||||
|
||||
export const DashboardLayout = ({ children, tab }: Props) => {
|
||||
export const DashboardLayout = ({ children, tab, metaName }: Props) => {
|
||||
return (
|
||||
<div>
|
||||
<div
|
||||
className="bg-radial relative flex flex-col bg-background min-h-screen w-full"
|
||||
id="app-container"
|
||||
>
|
||||
<Navbar />
|
||||
<main className="pt-6 flex w-full flex-col items-center">
|
||||
<div className="w-full max-w-8xl px-4 lg:px-8">
|
||||
<NavigationTabs tab={tab}>{children}</NavigationTabs>
|
||||
</div>
|
||||
</main>
|
||||
<>
|
||||
<Head>
|
||||
<title>
|
||||
{metaName ?? tab.charAt(0).toUpperCase() + tab.slice(1)} | Dokploy
|
||||
</title>
|
||||
</Head>
|
||||
<div>
|
||||
<div
|
||||
className="bg-radial relative flex flex-col bg-background min-h-screen w-full"
|
||||
id="app-container"
|
||||
>
|
||||
<Navbar />
|
||||
<main className="pt-6 flex w-full flex-col items-center">
|
||||
<div className="w-full max-w-8xl px-4 lg:px-8">
|
||||
<NavigationTabs tab={tab}>{children}</NavigationTabs>
|
||||
</div>
|
||||
</main>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
@@ -39,6 +39,7 @@ import type {
|
||||
GetServerSidePropsContext,
|
||||
InferGetServerSidePropsType,
|
||||
} from "next";
|
||||
import Head from "next/head";
|
||||
import Link from "next/link";
|
||||
import { useRouter } from "next/router";
|
||||
import React, { type ReactElement } from "react";
|
||||
@@ -189,6 +190,9 @@ const Project = (
|
||||
<BreadcrumbLink>{data?.name}</BreadcrumbLink>
|
||||
</BreadcrumbItem>
|
||||
</Breadcrumb>
|
||||
<Head>
|
||||
<title>Project {data?.name} | Dokploy</title>
|
||||
</Head>
|
||||
<header className="mb-6 flex w-full items-center justify-between flex-wrap gap-2">
|
||||
<div className="flex flex-col gap-2">
|
||||
<h1 className="text-xl font-bold lg:text-3xl">{data?.name}</h1>
|
||||
|
||||
@@ -41,6 +41,7 @@ import type {
|
||||
GetServerSidePropsContext,
|
||||
InferGetServerSidePropsType,
|
||||
} from "next";
|
||||
import Head from "next/head";
|
||||
import Link from "next/link";
|
||||
import { useRouter } from "next/router";
|
||||
import React, { useState, type ReactElement } from "react";
|
||||
@@ -101,6 +102,11 @@ const Service = (
|
||||
<BreadcrumbLink>{data?.name}</BreadcrumbLink>
|
||||
</BreadcrumbItem>
|
||||
</Breadcrumb>
|
||||
<Head>
|
||||
<title>
|
||||
Project {data?.project.name} | {data?.name} | Dokploy
|
||||
</title>
|
||||
</Head>
|
||||
<header className="mb-6 flex w-full items-center justify-between max-sm:flex-wrap gap-4">
|
||||
<div className="flex flex-col justify-between w-fit gap-2">
|
||||
<div className="flex flex-row items-center gap-2 xl:gap-4 flex-wrap">
|
||||
|
||||
@@ -35,6 +35,7 @@ import type {
|
||||
GetServerSidePropsContext,
|
||||
InferGetServerSidePropsType,
|
||||
} from "next";
|
||||
import Head from "next/head";
|
||||
import Link from "next/link";
|
||||
import { useRouter } from "next/router";
|
||||
import React, { useState, type ReactElement } from "react";
|
||||
@@ -94,6 +95,11 @@ const Service = (
|
||||
<BreadcrumbLink>{data?.name}</BreadcrumbLink>
|
||||
</BreadcrumbItem>
|
||||
</Breadcrumb>
|
||||
<Head>
|
||||
<title>
|
||||
Project {data?.project.name} | {data?.name} | Dokploy
|
||||
</title>
|
||||
</Head>
|
||||
<header className="mb-6 flex w-full items-center justify-between max-sm:flex-wrap gap-4">
|
||||
<div className="flex flex-col justify-between w-fit gap-2">
|
||||
<div className="flex flex-row items-center gap-2 xl:gap-4 flex-wrap">
|
||||
|
||||
@@ -35,6 +35,7 @@ import type {
|
||||
GetServerSidePropsContext,
|
||||
InferGetServerSidePropsType,
|
||||
} from "next";
|
||||
import Head from "next/head";
|
||||
import Link from "next/link";
|
||||
import { useRouter } from "next/router";
|
||||
import React, { useState, type ReactElement } from "react";
|
||||
@@ -82,6 +83,11 @@ const Mariadb = (
|
||||
<BreadcrumbLink>{data?.name}</BreadcrumbLink>
|
||||
</BreadcrumbItem>
|
||||
</Breadcrumb>
|
||||
<Head>
|
||||
<title>
|
||||
Project {data?.project.name} | {data?.name} | Dokploy
|
||||
</title>
|
||||
</Head>
|
||||
<header className="mb-6 flex w-full items-center justify-between max-sm:flex-wrap gap-4">
|
||||
<div className="flex flex-col justify-between w-fit gap-2">
|
||||
<div className="flex flex-row items-center gap-2 xl:gap-4 flex-wrap">
|
||||
|
||||
@@ -35,6 +35,7 @@ import type {
|
||||
GetServerSidePropsContext,
|
||||
InferGetServerSidePropsType,
|
||||
} from "next";
|
||||
import Head from "next/head";
|
||||
import Link from "next/link";
|
||||
import { useRouter } from "next/router";
|
||||
import React, { useState, type ReactElement } from "react";
|
||||
@@ -83,6 +84,11 @@ const Mongo = (
|
||||
<BreadcrumbLink>{data?.name}</BreadcrumbLink>
|
||||
</BreadcrumbItem>
|
||||
</Breadcrumb>
|
||||
<Head>
|
||||
<title>
|
||||
Project {data?.project.name} | {data?.name} | Dokploy
|
||||
</title>
|
||||
</Head>
|
||||
<header className="mb-6 flex w-full items-center justify-between max-sm:flex-wrap gap-4">
|
||||
<div className="flex flex-col justify-between w-fit gap-2">
|
||||
<div className="flex flex-row items-center gap-2 xl:gap-4 flex-wrap">
|
||||
|
||||
@@ -35,6 +35,7 @@ import type {
|
||||
GetServerSidePropsContext,
|
||||
InferGetServerSidePropsType,
|
||||
} from "next";
|
||||
import Head from "next/head";
|
||||
import Link from "next/link";
|
||||
import { useRouter } from "next/router";
|
||||
import React, { useState, type ReactElement } from "react";
|
||||
@@ -81,6 +82,11 @@ const MySql = (
|
||||
<BreadcrumbLink>{data?.name}</BreadcrumbLink>
|
||||
</BreadcrumbItem>
|
||||
</Breadcrumb>
|
||||
<Head>
|
||||
<title>
|
||||
Project {data?.project.name} | {data?.name} | Dokploy
|
||||
</title>
|
||||
</Head>
|
||||
<header className="mb-6 flex w-full items-center justify-between max-sm:flex-wrap gap-4">
|
||||
<div className="flex flex-col justify-between w-fit gap-2">
|
||||
<div className="flex flex-row items-center gap-2 xl:gap-4 flex-wrap">
|
||||
|
||||
@@ -35,6 +35,7 @@ import type {
|
||||
GetServerSidePropsContext,
|
||||
InferGetServerSidePropsType,
|
||||
} from "next";
|
||||
import Head from "next/head";
|
||||
import Link from "next/link";
|
||||
import { useRouter } from "next/router";
|
||||
import React, { useState, type ReactElement } from "react";
|
||||
@@ -82,6 +83,11 @@ const Postgresql = (
|
||||
<BreadcrumbLink>{data?.name}</BreadcrumbLink>
|
||||
</BreadcrumbItem>
|
||||
</Breadcrumb>
|
||||
<Head>
|
||||
<title>
|
||||
Project {data?.project.name} | {data?.name} | Dokploy
|
||||
</title>
|
||||
</Head>
|
||||
<header className="mb-6 flex w-full items-center justify-between max-sm:flex-wrap gap-4">
|
||||
<div className="flex flex-col justify-between w-fit gap-2">
|
||||
<div className="flex flex-row items-center gap-2 xl:gap-4 flex-wrap">
|
||||
|
||||
@@ -34,6 +34,7 @@ import type {
|
||||
GetServerSidePropsContext,
|
||||
InferGetServerSidePropsType,
|
||||
} from "next";
|
||||
import Head from "next/head";
|
||||
import Link from "next/link";
|
||||
import { useRouter } from "next/router";
|
||||
import React, { useState, type ReactElement } from "react";
|
||||
@@ -81,6 +82,11 @@ const Redis = (
|
||||
<BreadcrumbLink>{data?.name}</BreadcrumbLink>
|
||||
</BreadcrumbItem>
|
||||
</Breadcrumb>
|
||||
<Head>
|
||||
<title>
|
||||
Project {data?.project.name} | {data?.name} | Dokploy
|
||||
</title>
|
||||
</Head>
|
||||
<header className="mb-6 flex w-full items-center justify-between max-sm:flex-wrap gap-4">
|
||||
<div className="flex flex-col justify-between w-fit gap-2">
|
||||
<div className="flex flex-row items-center gap-2 xl:gap-4 flex-wrap">
|
||||
|
||||
@@ -21,7 +21,7 @@ export default Page;
|
||||
|
||||
Page.getLayout = (page: ReactElement) => {
|
||||
return (
|
||||
<DashboardLayout tab={"settings"}>
|
||||
<DashboardLayout tab={"settings"} metaName="Appearance">
|
||||
<SettingsLayout>{page}</SettingsLayout>
|
||||
</DashboardLayout>
|
||||
);
|
||||
|
||||
@@ -16,7 +16,7 @@ export default Page;
|
||||
|
||||
Page.getLayout = (page: ReactElement) => {
|
||||
return (
|
||||
<DashboardLayout tab={"settings"}>
|
||||
<DashboardLayout tab={"settings"} metaName="Billing">
|
||||
<SettingsLayout>{page}</SettingsLayout>
|
||||
</DashboardLayout>
|
||||
);
|
||||
|
||||
@@ -19,7 +19,7 @@ export default Page;
|
||||
|
||||
Page.getLayout = (page: ReactElement) => {
|
||||
return (
|
||||
<DashboardLayout tab={"settings"}>
|
||||
<DashboardLayout tab={"settings"} metaName="Certificates">
|
||||
<SettingsLayout>{page}</SettingsLayout>
|
||||
</DashboardLayout>
|
||||
);
|
||||
|
||||
@@ -20,7 +20,7 @@ export default Page;
|
||||
|
||||
Page.getLayout = (page: ReactElement) => {
|
||||
return (
|
||||
<DashboardLayout tab={"settings"}>
|
||||
<DashboardLayout tab={"settings"} metaName="Nodes">
|
||||
<SettingsLayout>{page}</SettingsLayout>
|
||||
</DashboardLayout>
|
||||
);
|
||||
|
||||
@@ -20,7 +20,7 @@ export default Page;
|
||||
|
||||
Page.getLayout = (page: ReactElement) => {
|
||||
return (
|
||||
<DashboardLayout tab={"settings"}>
|
||||
<DashboardLayout tab={"settings"} metaName="S3 Destinations">
|
||||
<SettingsLayout>{page}</SettingsLayout>
|
||||
</DashboardLayout>
|
||||
);
|
||||
|
||||
@@ -20,7 +20,7 @@ export default Page;
|
||||
|
||||
Page.getLayout = (page: ReactElement) => {
|
||||
return (
|
||||
<DashboardLayout tab={"settings"}>
|
||||
<DashboardLayout tab={"settings"} metaName="Git Providers">
|
||||
<SettingsLayout>{page}</SettingsLayout>
|
||||
</DashboardLayout>
|
||||
);
|
||||
|
||||
@@ -20,7 +20,7 @@ export default Page;
|
||||
|
||||
Page.getLayout = (page: ReactElement) => {
|
||||
return (
|
||||
<DashboardLayout tab={"settings"}>
|
||||
<DashboardLayout tab={"settings"} metaName="Notifications">
|
||||
<SettingsLayout>{page}</SettingsLayout>
|
||||
</DashboardLayout>
|
||||
);
|
||||
|
||||
@@ -33,7 +33,7 @@ export default Page;
|
||||
|
||||
Page.getLayout = (page: ReactElement) => {
|
||||
return (
|
||||
<DashboardLayout tab={"settings"}>
|
||||
<DashboardLayout tab={"settings"} metaName="Profile">
|
||||
<SettingsLayout>{page}</SettingsLayout>
|
||||
</DashboardLayout>
|
||||
);
|
||||
|
||||
@@ -20,7 +20,7 @@ export default Page;
|
||||
|
||||
Page.getLayout = (page: ReactElement) => {
|
||||
return (
|
||||
<DashboardLayout tab={"settings"}>
|
||||
<DashboardLayout tab={"settings"} metaName="Registry">
|
||||
<SettingsLayout>{page}</SettingsLayout>
|
||||
</DashboardLayout>
|
||||
);
|
||||
|
||||
@@ -23,7 +23,7 @@ export default Page;
|
||||
|
||||
Page.getLayout = (page: ReactElement) => {
|
||||
return (
|
||||
<DashboardLayout tab={"settings"}>
|
||||
<DashboardLayout tab={"settings"} metaName="Server">
|
||||
<SettingsLayout>{page}</SettingsLayout>
|
||||
</DashboardLayout>
|
||||
);
|
||||
|
||||
@@ -20,7 +20,7 @@ export default Page;
|
||||
|
||||
Page.getLayout = (page: ReactElement) => {
|
||||
return (
|
||||
<DashboardLayout tab={"settings"}>
|
||||
<DashboardLayout tab={"settings"} metaName="Servers">
|
||||
<SettingsLayout>{page}</SettingsLayout>
|
||||
</DashboardLayout>
|
||||
);
|
||||
|
||||
@@ -20,7 +20,7 @@ export default Page;
|
||||
|
||||
Page.getLayout = (page: ReactElement) => {
|
||||
return (
|
||||
<DashboardLayout tab={"settings"}>
|
||||
<DashboardLayout tab={"settings"} metaName="SSH Keys">
|
||||
<SettingsLayout>{page}</SettingsLayout>
|
||||
</DashboardLayout>
|
||||
);
|
||||
|
||||
@@ -20,7 +20,7 @@ export default Page;
|
||||
|
||||
Page.getLayout = (page: ReactElement) => {
|
||||
return (
|
||||
<DashboardLayout tab={"settings"}>
|
||||
<DashboardLayout tab={"settings"} metaName="Users">
|
||||
<SettingsLayout>{page}</SettingsLayout>
|
||||
</DashboardLayout>
|
||||
);
|
||||
|
||||
1
apps/dokploy/public/templates/huly.svg
Normal file
1
apps/dokploy/public/templates/huly.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 71 25"><path fill="#fff" d="M22.4 16a1.6 1.6 0 0 1 1.6 1.6v4.8a1.6 1.6 0 0 1-1.6 1.6h-4.8a1.6 1.6 0 0 1-1.6-1.6v-4.8a1.6 1.6 0 0 1 1.6-1.6zM6.4 0A1.6 1.6 0 0 1 8 1.6v4.8A1.6 1.6 0 0 1 6.4 8H1.6A1.6 1.6 0 0 1 0 6.4V1.6A1.6 1.6 0 0 1 1.6 0zM23.531 8.469c.3-.3.469-.707.469-1.132V1.6A1.6 1.6 0 0 0 22.4 0h-4.8A1.6 1.6 0 0 0 16 1.6v4.8A1.6 1.6 0 0 1 14.4 8H8.663a1.6 1.6 0 0 0-1.132.469L.47 15.53A1.6 1.6 0 0 0 0 16.663V22.4A1.6 1.6 0 0 0 1.6 24h4.8A1.6 1.6 0 0 0 8 22.4v-4.8A1.6 1.6 0 0 1 9.6 16h5.737a1.6 1.6 0 0 0 1.132-.469zM31.22 20V3.8h3.62v7.1q.42-.72 1.18-1.12.78-.42 1.78-.42 1.74 0 2.64 1.12.92 1.1.92 3.24V20h-3.62v-5.6q0-1.82-1.38-1.82-.74 0-1.14.52-.38.5-.38 1.44V20zm16.6.32q-2.46 0-3.74-1.24-1.26-1.24-1.26-3.62V9.68h3.64v5.66q0 1.76 1.38 1.76.7 0 1.02-.42t.32-1.34V9.68h3.64v5.78q0 2.38-1.28 3.62-1.26 1.24-3.72 1.24m6.546-.32V3.8h3.62V20zm5.955 4.9 2.58-5.46-4.24-9.76h3.98l2.1 6.06 1.94-6.06h3.88l-6.6 15.22z"/></svg>
|
||||
|
After Width: | Height: | Size: 996 B |
6
apps/dokploy/public/templates/langflow.svg
Normal file
6
apps/dokploy/public/templates/langflow.svg
Normal file
@@ -0,0 +1,6 @@
|
||||
<svg width="128" height="128" viewBox="0 0 128 128" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<rect width="128" height="128" rx="28" fill="black"/>
|
||||
<path d="M89.6763 65.8642L102.71 65.8642C104.285 65.8642 105.563 67.1415 105.563 68.717L105.563 77.7818C105.563 79.3573 104.285 80.6346 102.71 80.6346L91.1299 80.6346C90.3733 80.6346 89.6477 80.9351 89.1127 81.4701L71.4183 99.1645C70.8833 99.6995 70.1577 100 69.4011 100L59.5869 100C58.04 100 56.7749 98.7673 56.735 97.2209L56.4975 88.0155C56.4561 86.4116 57.7449 85.0891 59.3493 85.0891L68.0882 85.0891C68.8448 85.0891 69.5704 84.7885 70.1054 84.2535L87.6591 66.6998C88.1941 66.1648 88.9197 65.8642 89.6763 65.8642Z" fill="white"/>
|
||||
<path d="M55.9431 27.707L68.9766 27.707C70.5521 27.707 71.8293 28.9843 71.8293 30.5598L71.8293 39.6246C71.8293 41.2001 70.5521 42.4774 68.9766 42.4774L57.3967 42.4774C56.6401 42.4774 55.9144 42.7779 55.3794 43.3129L37.685 61.0073C37.15 61.5423 36.4244 61.8429 35.6678 61.8429L25.8536 61.8429C24.3067 61.8429 23.0417 60.6101 23.0018 59.0637L22.7642 49.8583C22.7228 48.2544 24.0117 46.9319 25.616 46.9319L34.3549 46.9319C35.1115 46.9319 35.8371 46.6313 36.3721 46.0963L53.9258 28.5426C54.4608 28.0076 55.1865 27.707 55.9431 27.707Z" fill="white"/>
|
||||
<path d="M89.6763 36.3423L102.71 36.3423C104.285 36.3423 105.563 37.6195 105.563 39.1951L105.563 48.2598C105.563 49.8354 104.285 51.1126 102.71 51.1126L91.1299 51.1126C90.3733 51.1126 89.6477 51.4132 89.1127 51.9482L71.4183 69.6426C70.8833 70.1776 70.1577 70.4782 69.4011 70.4782L58.5061 70.4782C57.7705 70.4782 57.0633 70.7623 56.5322 71.2714L36.7587 90.2227C36.2276 90.7318 35.5204 91.0159 34.7847 91.0159L26.1705 91.0159C24.5949 91.0159 23.3177 89.7387 23.3177 88.1632L23.3177 78.9108C23.3177 77.3353 24.5949 76.0581 26.1704 76.0581L34.7494 76.0581C35.506 76.0581 36.2316 75.7575 36.7666 75.2225L55.5864 56.4027C56.1214 55.8677 56.847 55.5672 57.6036 55.5672L68.0882 55.5672C68.8448 55.5672 69.5704 55.2666 70.1054 54.7316L87.6591 37.1778C88.1941 36.6428 88.9197 36.3423 89.6763 36.3423Z" fill="white"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.0 KiB |
3
apps/dokploy/public/templates/penpot.svg
Normal file
3
apps/dokploy/public/templates/penpot.svg
Normal file
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 7.1 KiB |
BIN
apps/dokploy/public/templates/unsend.png
Normal file
BIN
apps/dokploy/public/templates/unsend.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 13 KiB |
184
apps/dokploy/templates/huly/docker-compose.yml
Normal file
184
apps/dokploy/templates/huly/docker-compose.yml
Normal file
@@ -0,0 +1,184 @@
|
||||
name: ${DOCKER_NAME}
|
||||
version: "3"
|
||||
services:
|
||||
nginx:
|
||||
networks:
|
||||
- dokploy-network
|
||||
image: "nginx:1.21.3"
|
||||
ports:
|
||||
- 80
|
||||
volumes:
|
||||
- ../files/volumes/nginx/.huly.nginx:/etc/nginx/conf.d/default.conf
|
||||
restart: unless-stopped
|
||||
|
||||
mongodb:
|
||||
networks:
|
||||
- dokploy-network
|
||||
image: "mongo:7-jammy"
|
||||
environment:
|
||||
- PUID=1000
|
||||
- PGID=1000
|
||||
volumes:
|
||||
- db:/data/db
|
||||
restart: unless-stopped
|
||||
|
||||
minio:
|
||||
networks:
|
||||
- dokploy-network
|
||||
image: "minio/minio:RELEASE.2024-11-07T00-52-20Z"
|
||||
command: server /data --address ":9000" --console-address ":9001"
|
||||
volumes:
|
||||
- files:/data
|
||||
restart: unless-stopped
|
||||
|
||||
elastic:
|
||||
networks:
|
||||
- dokploy-network
|
||||
image: "elasticsearch:7.14.2"
|
||||
command: |
|
||||
/bin/sh -c "./bin/elasticsearch-plugin list | grep -q ingest-attachment || yes | ./bin/elasticsearch-plugin install --silent ingest-attachment;
|
||||
/usr/local/bin/docker-entrypoint.sh eswrapper"
|
||||
volumes:
|
||||
- elastic:/usr/share/elasticsearch/data
|
||||
environment:
|
||||
- ELASTICSEARCH_PORT_NUMBER=9200
|
||||
- BITNAMI_DEBUG=true
|
||||
- discovery.type=single-node
|
||||
- ES_JAVA_OPTS=-Xms1024m -Xmx1024m
|
||||
- http.cors.enabled=true
|
||||
- http.cors.allow-origin=http://localhost:8082
|
||||
healthcheck:
|
||||
interval: 20s
|
||||
retries: 10
|
||||
test: curl -s http://localhost:9200/_cluster/health | grep -vq '"status":"red"'
|
||||
restart: unless-stopped
|
||||
|
||||
rekoni:
|
||||
networks:
|
||||
- dokploy-network
|
||||
image: hardcoreeng/rekoni-service:${HULY_VERSION}
|
||||
environment:
|
||||
- SECRET=${SECRET}
|
||||
deploy:
|
||||
resources:
|
||||
limits:
|
||||
memory: 500M
|
||||
restart: unless-stopped
|
||||
|
||||
transactor:
|
||||
networks:
|
||||
- dokploy-network
|
||||
image: hardcoreeng/transactor:${HULY_VERSION}
|
||||
environment:
|
||||
- SERVER_PORT=3333
|
||||
- SERVER_SECRET=${SECRET}
|
||||
- SERVER_CURSOR_MAXTIMEMS=30000
|
||||
- DB_URL=mongodb://mongodb:27017
|
||||
- MONGO_URL=mongodb://mongodb:27017
|
||||
- STORAGE_CONFIG=minio|minio?accessKey=minioadmin&secretKey=minioadmin
|
||||
- FRONT_URL=http://localhost:8087
|
||||
- ACCOUNTS_URL=http://account:3000
|
||||
- FULLTEXT_URL=http://fulltext:4700
|
||||
- STATS_URL=http://stats:4900
|
||||
- LAST_NAME_FIRST=${LAST_NAME_FIRST:-true}
|
||||
restart: unless-stopped
|
||||
|
||||
collaborator:
|
||||
networks:
|
||||
- dokploy-network
|
||||
image: hardcoreeng/collaborator:${HULY_VERSION}
|
||||
environment:
|
||||
- COLLABORATOR_PORT=3078
|
||||
- SECRET=${SECRET}
|
||||
- ACCOUNTS_URL=http://account:3000
|
||||
- DB_URL=mongodb://mongodb:27017
|
||||
- STATS_URL=http://stats:4900
|
||||
- STORAGE_CONFIG=minio|minio?accessKey=minioadmin&secretKey=minioadmin
|
||||
restart: unless-stopped
|
||||
|
||||
account:
|
||||
networks:
|
||||
- dokploy-network
|
||||
image: hardcoreeng/account:${HULY_VERSION}
|
||||
environment:
|
||||
- SERVER_PORT=3000
|
||||
- SERVER_SECRET=${SECRET}
|
||||
- DB_URL=mongodb://mongodb:27017
|
||||
- MONGO_URL=mongodb://mongodb:27017
|
||||
- TRANSACTOR_URL=ws://transactor:3333;ws${SECURE:+s}://${HOST_ADDRESS}/_transactor
|
||||
- STORAGE_CONFIG=minio|minio?accessKey=minioadmin&secretKey=minioadmin
|
||||
- FRONT_URL=http://front:8080
|
||||
- STATS_URL=http://stats:4900
|
||||
- MODEL_ENABLED=*
|
||||
- ACCOUNTS_URL=http://localhost:3000
|
||||
- ACCOUNT_PORT=3000
|
||||
restart: unless-stopped
|
||||
|
||||
workspace:
|
||||
networks:
|
||||
- dokploy-network
|
||||
image: hardcoreeng/workspace:${HULY_VERSION}
|
||||
environment:
|
||||
- SERVER_SECRET=${SECRET}
|
||||
- DB_URL=mongodb://mongodb:27017
|
||||
- MONGO_URL=mongodb://mongodb:27017
|
||||
- TRANSACTOR_URL=ws://transactor:3333;ws${SECURE:+s}://${HOST_ADDRESS}/_transactor
|
||||
- STORAGE_CONFIG=minio|minio?accessKey=minioadmin&secretKey=minioadmin
|
||||
- MODEL_ENABLED=*
|
||||
- ACCOUNTS_URL=http://account:3000
|
||||
- STATS_URL=http://stats:4900
|
||||
restart: unless-stopped
|
||||
|
||||
front:
|
||||
networks:
|
||||
- dokploy-network
|
||||
image: hardcoreeng/front:${HULY_VERSION}
|
||||
environment:
|
||||
- SERVER_PORT=8080
|
||||
- SERVER_SECRET=${SECRET}
|
||||
- LOVE_ENDPOINT=http${SECURE:+s}://${HOST_ADDRESS}/_love
|
||||
- ACCOUNTS_URL=http${SECURE:+s}://${HOST_ADDRESS}/_accounts
|
||||
- REKONI_URL=http${SECURE:+s}://${HOST_ADDRESS}/_rekoni
|
||||
- CALENDAR_URL=http${SECURE:+s}://${HOST_ADDRESS}/_calendar
|
||||
- GMAIL_URL=http${SECURE:+s}://${HOST_ADDRESS}/_gmail
|
||||
- TELEGRAM_URL=http${SECURE:+s}://${HOST_ADDRESS}/_telegram
|
||||
- STATS_URL=http${SECURE:+s}://${HOST_ADDRESS}/_stats
|
||||
- UPLOAD_URL=/files
|
||||
- ELASTIC_URL=http://elastic:9200
|
||||
- COLLABORATOR_URL=ws${SECURE:+s}://${HOST_ADDRESS}/_collaborator
|
||||
- STORAGE_CONFIG=minio|minio?accessKey=minioadmin&secretKey=minioadmin
|
||||
- DB_URL=mongodb://mongodb:27017
|
||||
- MONGO_URL=mongodb://mongodb:27017
|
||||
- TITLE=${TITLE:-Huly Self Host}
|
||||
- DEFAULT_LANGUAGE=${DEFAULT_LANGUAGE:-en}
|
||||
- LAST_NAME_FIRST=${LAST_NAME_FIRST:-true}
|
||||
- DESKTOP_UPDATES_CHANNEL=selfhost
|
||||
restart: unless-stopped
|
||||
|
||||
fulltext:
|
||||
networks:
|
||||
- dokploy-network
|
||||
image: hardcoreeng/fulltext:${HULY_VERSION}
|
||||
environment:
|
||||
- SERVER_SECRET=${SECRET}
|
||||
- DB_URL=mongodb://mongodb:27017
|
||||
- FULLTEXT_DB_URL=http://elastic:9200
|
||||
- ELASTIC_INDEX_NAME=huly_storage_index
|
||||
- STORAGE_CONFIG=minio|minio?accessKey=minioadmin&secretKey=minioadmin
|
||||
- REKONI_URL=http://rekoni:4004
|
||||
- ACCOUNTS_URL=http://account:3000
|
||||
- STATS_URL=http://stats:4900
|
||||
restart: unless-stopped
|
||||
|
||||
stats:
|
||||
networks:
|
||||
- dokploy-network
|
||||
image: hardcoreeng/stats:${HULY_VERSION}
|
||||
environment:
|
||||
- PORT=4900
|
||||
- SERVER_SECRET=${SECRET}
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
db:
|
||||
elastic:
|
||||
files:
|
||||
152
apps/dokploy/templates/huly/index.ts
Normal file
152
apps/dokploy/templates/huly/index.ts
Normal file
@@ -0,0 +1,152 @@
|
||||
import {
|
||||
type DomainSchema,
|
||||
type Schema,
|
||||
type Template,
|
||||
generateBase64,
|
||||
generateRandomDomain,
|
||||
} from "../utils";
|
||||
|
||||
export function generate(schema: Schema): Template {
|
||||
const mainDomain = generateRandomDomain(schema);
|
||||
const hulySecret = generateBase64(64);
|
||||
const domains: DomainSchema[] = [
|
||||
{
|
||||
host: generateRandomDomain(schema),
|
||||
port: 80,
|
||||
serviceName: "nginx",
|
||||
},
|
||||
];
|
||||
|
||||
const envs = [
|
||||
"HULY_VERSION=v0.6.377",
|
||||
"DOCKER_NAME=huly",
|
||||
"",
|
||||
"# The address of the host or server from which you will access your Huly instance.",
|
||||
"# This can be a domain name (e.g., huly.example.com) or an IP address (e.g., 192.168.1.1).",
|
||||
`HOST_ADDRESS=${mainDomain}`,
|
||||
"",
|
||||
"# Set this variable to 'true' to enable SSL (HTTPS/WSS). ",
|
||||
"# Leave it empty to use non-SSL (HTTP/WS).",
|
||||
"SECURE=",
|
||||
"",
|
||||
"# Specify the IP address to bind to; leave blank to bind to all interfaces (0.0.0.0).",
|
||||
"# Do not use IP:PORT format in HTTP_BIND or HTTP_PORT.",
|
||||
"HTTP_PORT=80",
|
||||
"HTTP_BIND=",
|
||||
"",
|
||||
"# Huly specific variables",
|
||||
"TITLE=Huly",
|
||||
"DEFAULT_LANGUAGE=en",
|
||||
"LAST_NAME_FIRST=true",
|
||||
"",
|
||||
"# The following configs are auto-generated by the setup script. ",
|
||||
"# Please do not manually overwrite.",
|
||||
"",
|
||||
"# Run with --secret to regenerate.",
|
||||
`SECRET=${hulySecret}`,
|
||||
];
|
||||
|
||||
const mounts: Template["mounts"] = [
|
||||
{
|
||||
filePath: "/volumes/nginx/.huly.nginx",
|
||||
content: `server {
|
||||
listen 80;
|
||||
server_name _;
|
||||
location / {
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
proxy_pass http://front:8080;
|
||||
}
|
||||
|
||||
location /_accounts {
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
|
||||
rewrite ^/_accounts(/.*)$ $1 break;
|
||||
proxy_pass http://account:3000/;
|
||||
}
|
||||
|
||||
#location /_love {
|
||||
# proxy_set_header Host $host;
|
||||
# proxy_set_header X-Real-IP $remote_addr;
|
||||
# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
# proxy_set_header X-Forwarded-Proto $scheme;
|
||||
|
||||
# proxy_http_version 1.1;
|
||||
# proxy_set_header Upgrade $http_upgrade;
|
||||
# proxy_set_header Connection "upgrade";
|
||||
# rewrite ^/_love(/.*)$ $1 break;
|
||||
# proxy_pass http://love:8096/;
|
||||
#}
|
||||
|
||||
location /_collaborator {
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "upgrade";
|
||||
rewrite ^/_collaborator(/.*)$ $1 break;
|
||||
proxy_pass http://collaborator:3078/;
|
||||
}
|
||||
|
||||
location /_transactor {
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "upgrade";
|
||||
rewrite ^/_transactor(/.*)$ $1 break;
|
||||
proxy_pass http://transactor:3333/;
|
||||
}
|
||||
|
||||
location ~ ^/eyJ {
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "upgrade";
|
||||
proxy_pass http://transactor:3333;
|
||||
}
|
||||
|
||||
location /_rekoni {
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
|
||||
rewrite ^/_rekoni(/.*)$ $1 break;
|
||||
proxy_pass http://rekoni:4004/;
|
||||
}
|
||||
|
||||
location /_stats {
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
|
||||
rewrite ^/_stats(/.*)$ $1 break;
|
||||
proxy_pass http://stats:4900/;
|
||||
}
|
||||
}`,
|
||||
},
|
||||
];
|
||||
|
||||
return {
|
||||
domains,
|
||||
envs,
|
||||
mounts,
|
||||
};
|
||||
}
|
||||
33
apps/dokploy/templates/langflow/docker-compose.yml
Normal file
33
apps/dokploy/templates/langflow/docker-compose.yml
Normal file
@@ -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:
|
||||
28
apps/dokploy/templates/langflow/index.ts
Normal file
28
apps/dokploy/templates/langflow/index.ts
Normal file
@@ -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,
|
||||
};
|
||||
}
|
||||
213
apps/dokploy/templates/penpot/docker-compose.yml
Normal file
213
apps/dokploy/templates/penpot/docker-compose.yml
Normal file
@@ -0,0 +1,213 @@
|
||||
## Common flags:
|
||||
# demo-users
|
||||
# email-verification
|
||||
# log-emails
|
||||
# log-invitation-tokens
|
||||
# login-with-github
|
||||
# login-with-gitlab
|
||||
# login-with-google
|
||||
# login-with-ldap
|
||||
# login-with-oidc
|
||||
# login-with-password
|
||||
# prepl-server
|
||||
# registration
|
||||
# secure-session-cookies
|
||||
# smtp
|
||||
# smtp-debug
|
||||
# telemetry
|
||||
# webhooks
|
||||
##
|
||||
## You can read more about all available flags and other
|
||||
## environment variables here:
|
||||
## https://help.penpot.app/technical-guide/configuration/#advanced-configuration
|
||||
#
|
||||
# WARNING: if you're exposing Penpot to the internet, you should remove the flags
|
||||
# 'disable-secure-session-cookies' and 'disable-email-verification'
|
||||
|
||||
volumes:
|
||||
penpot_postgres_v15:
|
||||
penpot_assets:
|
||||
penpot_traefik:
|
||||
# penpot_minio:
|
||||
|
||||
services:
|
||||
|
||||
penpot-frontend:
|
||||
image: "penpotapp/frontend:2.3.2"
|
||||
restart: always
|
||||
ports:
|
||||
- 8080
|
||||
- 9001
|
||||
|
||||
volumes:
|
||||
- penpot_assets:/opt/data/assets
|
||||
|
||||
depends_on:
|
||||
- penpot-backend
|
||||
- penpot-exporter
|
||||
|
||||
networks:
|
||||
- dokploy-network
|
||||
|
||||
environment:
|
||||
PENPOT_FLAGS: disable-email-verification enable-smtp enable-prepl-server disable-secure-session-cookies
|
||||
|
||||
penpot-backend:
|
||||
image: "penpotapp/backend:2.3.2"
|
||||
restart: always
|
||||
|
||||
volumes:
|
||||
- penpot_assets:/opt/data/assets
|
||||
|
||||
depends_on:
|
||||
- penpot-postgres
|
||||
- penpot-redis
|
||||
|
||||
networks:
|
||||
- dokploy-network
|
||||
|
||||
## Configuration envronment variables for the backend
|
||||
## container.
|
||||
|
||||
environment:
|
||||
PENPOT_PUBLIC_URI: http://${DOMAIN_NAME}
|
||||
PENPOT_FLAGS: disable-email-verification enable-smtp enable-prepl-server disable-secure-session-cookies
|
||||
|
||||
## Penpot SECRET KEY. It serves as a master key from which other keys for subsystems
|
||||
## (eg http sessions, or invitations) are derived.
|
||||
##
|
||||
## If you leave it commented, all created sessions and invitations will
|
||||
## become invalid on container restart.
|
||||
##
|
||||
## If you going to uncomment this, we recommend to use a trully randomly generated
|
||||
## 512 bits base64 encoded string here. You can generate one with:
|
||||
##
|
||||
## python3 -c "import secrets; print(secrets.token_urlsafe(64))"
|
||||
|
||||
# PENPOT_SECRET_KEY: my-insecure-key
|
||||
|
||||
## The PREPL host. Mainly used for external programatic access to penpot backend
|
||||
## (example: admin). By default it will listen on `localhost` but if you are going to use
|
||||
## the `admin`, you will need to uncomment this and set the host to `0.0.0.0`.
|
||||
|
||||
# PENPOT_PREPL_HOST: 0.0.0.0
|
||||
|
||||
## Database connection parameters. Don't touch them unless you are using custom
|
||||
## postgresql connection parameters.
|
||||
|
||||
PENPOT_DATABASE_URI: postgresql://penpot-postgres/penpot
|
||||
PENPOT_DATABASE_USERNAME: penpot
|
||||
PENPOT_DATABASE_PASSWORD: penpot
|
||||
|
||||
## Redis is used for the websockets notifications. Don't touch unless the redis
|
||||
## container has different parameters or different name.
|
||||
|
||||
PENPOT_REDIS_URI: redis://penpot-redis/0
|
||||
|
||||
## Default configuration for assets storage: using filesystem based with all files
|
||||
## stored in a docker volume.
|
||||
|
||||
PENPOT_ASSETS_STORAGE_BACKEND: assets-fs
|
||||
PENPOT_STORAGE_ASSETS_FS_DIRECTORY: /opt/data/assets
|
||||
|
||||
## Also can be configured to to use a S3 compatible storage
|
||||
## service like MiniIO. Look below for minio service setup.
|
||||
|
||||
# AWS_ACCESS_KEY_ID: <KEY_ID>
|
||||
# AWS_SECRET_ACCESS_KEY: <ACCESS_KEY>
|
||||
# PENPOT_ASSETS_STORAGE_BACKEND: assets-s3
|
||||
# PENPOT_STORAGE_ASSETS_S3_ENDPOINT: http://penpot-minio:9000
|
||||
# PENPOT_STORAGE_ASSETS_S3_BUCKET: <BUKET_NAME>
|
||||
|
||||
## Telemetry. When enabled, a periodical process will send anonymous data about this
|
||||
## instance. Telemetry data will enable us to learn how the application is used,
|
||||
## based on real scenarios. If you want to help us, please leave it enabled. You can
|
||||
## audit what data we send with the code available on github.
|
||||
|
||||
PENPOT_TELEMETRY_ENABLED: true
|
||||
|
||||
## Example SMTP/Email configuration. By default, emails are sent to the mailcatch
|
||||
## service, but for production usage it is recommended to setup a real SMTP
|
||||
## provider. Emails are used to confirm user registrations & invitations. Look below
|
||||
## how the mailcatch service is configured.
|
||||
|
||||
PENPOT_SMTP_DEFAULT_FROM: no-reply@example.com
|
||||
PENPOT_SMTP_DEFAULT_REPLY_TO: no-reply@example.com
|
||||
PENPOT_SMTP_HOST: penpot-mailcatch
|
||||
PENPOT_SMTP_PORT: 1025
|
||||
PENPOT_SMTP_USERNAME:
|
||||
PENPOT_SMTP_PASSWORD:
|
||||
PENPOT_SMTP_TLS: false
|
||||
PENPOT_SMTP_SSL: false
|
||||
|
||||
penpot-exporter:
|
||||
image: "penpotapp/exporter:2.3.2"
|
||||
restart: always
|
||||
networks:
|
||||
- dokploy-network
|
||||
|
||||
environment:
|
||||
# Don't touch it; this uses an internal docker network to
|
||||
# communicate with the frontend.
|
||||
PENPOT_PUBLIC_URI: http://penpot-frontend
|
||||
|
||||
## Redis is used for the websockets notifications.
|
||||
PENPOT_REDIS_URI: redis://penpot-redis/0
|
||||
|
||||
penpot-postgres:
|
||||
image: "postgres:15"
|
||||
restart: always
|
||||
stop_signal: SIGINT
|
||||
|
||||
volumes:
|
||||
- penpot_postgres_v15:/var/lib/postgresql/data
|
||||
|
||||
networks:
|
||||
- dokploy-network
|
||||
|
||||
environment:
|
||||
- POSTGRES_INITDB_ARGS=--data-checksums
|
||||
- POSTGRES_DB=penpot
|
||||
- POSTGRES_USER=penpot
|
||||
- POSTGRES_PASSWORD=penpot
|
||||
|
||||
penpot-redis:
|
||||
image: redis:7.2
|
||||
restart: always
|
||||
networks:
|
||||
- dokploy-network
|
||||
|
||||
## A mailcatch service, used as temporal SMTP server. You can access via HTTP to the
|
||||
## port 1080 for read all emails the penpot platform has sent. Should be only used as a
|
||||
## temporal solution while no real SMTP provider is configured.
|
||||
|
||||
penpot-mailcatch:
|
||||
image: sj26/mailcatcher:latest
|
||||
restart: always
|
||||
expose:
|
||||
- '1025'
|
||||
ports:
|
||||
- 1080
|
||||
networks:
|
||||
- dokploy-network
|
||||
|
||||
## Example configuration of MiniIO (S3 compatible object storage service); If you don't
|
||||
## have preference, then just use filesystem, this is here just for the completeness.
|
||||
|
||||
# minio:
|
||||
# image: "minio/minio:latest"
|
||||
# command: minio server /mnt/data --console-address ":9001"
|
||||
# restart: always
|
||||
#
|
||||
# volumes:
|
||||
# - "penpot_minio:/mnt/data"
|
||||
#
|
||||
# environment:
|
||||
# - MINIO_ROOT_USER=minioadmin
|
||||
# - MINIO_ROOT_PASSWORD=minioadmin
|
||||
#
|
||||
# ports:
|
||||
# - 9000:9000
|
||||
# - 9001:9001
|
||||
|
||||
|
||||
27
apps/dokploy/templates/penpot/index.ts
Normal file
27
apps/dokploy/templates/penpot/index.ts
Normal file
@@ -0,0 +1,27 @@
|
||||
import {
|
||||
type DomainSchema,
|
||||
type Schema,
|
||||
type Template,
|
||||
generateBase64,
|
||||
generatePassword,
|
||||
generateRandomDomain,
|
||||
} from "../utils";
|
||||
|
||||
export function generate(schema: Schema): Template {
|
||||
const mainDomain = generateRandomDomain(schema);
|
||||
|
||||
const domains: DomainSchema[] = [
|
||||
{
|
||||
host: mainDomain,
|
||||
port: 80,
|
||||
serviceName: "penpot-frontend",
|
||||
},
|
||||
];
|
||||
|
||||
const envs = [`DOMAIN_NAME=${mainDomain}`];
|
||||
|
||||
return {
|
||||
domains,
|
||||
envs,
|
||||
};
|
||||
}
|
||||
@@ -1062,4 +1062,63 @@ export const templates: TemplateData[] = [
|
||||
tags: ["identity", "auth"],
|
||||
load: () => import("./logto/index").then((m) => m.generate),
|
||||
},
|
||||
{
|
||||
id: "penpot",
|
||||
name: "Penpot",
|
||||
version: "2.3.2",
|
||||
description:
|
||||
"Penpot is the web-based open-source design tool that bridges the gap between designers and developers.",
|
||||
logo: "penpot.svg",
|
||||
links: {
|
||||
github: "https://github.com/penpot/penpot",
|
||||
website: "https://penpot.app/",
|
||||
docs: "https://docs.penpot.app/",
|
||||
},
|
||||
tags: ["desing", "collaboration"],
|
||||
load: () => import("./penpot/index").then((m) => m.generate),
|
||||
},
|
||||
{
|
||||
id: "huly",
|
||||
name: "Huly",
|
||||
version: "0.6.377",
|
||||
description:
|
||||
"Huly — All-in-One Project Management Platform (alternative to Linear, Jira, Slack, Notion, Motion)",
|
||||
logo: "huly.svg",
|
||||
links: {
|
||||
github: "https://github.com/hcengineering/huly-selfhost",
|
||||
website: "https://huly.io/",
|
||||
docs: "https://docs.huly.io/",
|
||||
},
|
||||
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),
|
||||
},
|
||||
];
|
||||
|
||||
78
apps/dokploy/templates/unsend/docker-compose.yml
Normal file
78
apps/dokploy/templates/unsend/docker-compose.yml
Normal file
@@ -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:
|
||||
44
apps/dokploy/templates/unsend/index.ts
Normal file
44
apps/dokploy/templates/unsend/index.ts
Normal file
@@ -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,
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user