Merge branch 'canary' into canary

This commit is contained in:
Mauricio Siu
2025-02-09 02:37:23 -06:00
committed by GitHub
76 changed files with 9645 additions and 443 deletions

View File

@@ -14,7 +14,7 @@ import { useForm } from "react-hook-form";
import { toast } from "sonner"; import { toast } from "sonner";
import { z } from "zod"; import { z } from "zod";
import { validateAndFormatYAML } from "../../application/advanced/traefik/update-traefik-config"; import { validateAndFormatYAML } from "../../application/advanced/traefik/update-traefik-config";
import { RandomizeCompose } from "./randomize-compose"; import { ShowUtilities } from "./show-utilities";
interface Props { interface Props {
composeId: string; composeId: string;
@@ -125,7 +125,7 @@ services:
</Form> </Form>
<div className="flex justify-between flex-col lg:flex-row gap-2"> <div className="flex justify-between flex-col lg:flex-row gap-2">
<div className="w-full flex flex-col lg:flex-row gap-4 items-end"> <div className="w-full flex flex-col lg:flex-row gap-4 items-end">
<RandomizeCompose composeId={composeId} /> <ShowUtilities composeId={composeId} />
</div> </div>
<Button <Button
type="submit" type="submit"

View File

@@ -0,0 +1,191 @@
import { AlertBlock } from "@/components/shared/alert-block";
import { CodeEditor } from "@/components/shared/code-editor";
import { Button } from "@/components/ui/button";
import {
DialogDescription,
DialogHeader,
DialogTitle,
} from "@/components/ui/dialog";
import {
Form,
FormControl,
FormDescription,
FormField,
FormItem,
FormLabel,
} from "@/components/ui/form";
import { Label } from "@/components/ui/label";
import { Switch } from "@/components/ui/switch";
import { api } from "@/utils/api";
import { zodResolver } from "@hookform/resolvers/zod";
import { AlertTriangle } from "lucide-react";
import { useEffect, useState } from "react";
import { useForm } from "react-hook-form";
import { toast } from "sonner";
import { z } from "zod";
interface Props {
composeId: string;
}
const schema = z.object({
isolatedDeployment: z.boolean().optional(),
});
type Schema = z.infer<typeof schema>;
export const IsolatedDeployment = ({ composeId }: Props) => {
const utils = api.useUtils();
const [compose, setCompose] = useState<string>("");
const { mutateAsync, error, isError } =
api.compose.isolatedDeployment.useMutation();
const { mutateAsync: updateCompose } = api.compose.update.useMutation();
const { data, refetch } = api.compose.one.useQuery(
{ composeId },
{ enabled: !!composeId },
);
console.log(data);
const form = useForm<Schema>({
defaultValues: {
isolatedDeployment: false,
},
resolver: zodResolver(schema),
});
useEffect(() => {
randomizeCompose();
if (data) {
form.reset({
isolatedDeployment: data?.isolatedDeployment || false,
});
}
}, [form, form.reset, form.formState.isSubmitSuccessful, data]);
const onSubmit = async (formData: Schema) => {
await updateCompose({
composeId,
isolatedDeployment: formData?.isolatedDeployment || false,
})
.then(async (data) => {
randomizeCompose();
refetch();
toast.success("Compose updated");
})
.catch(() => {
toast.error("Error updating the compose");
});
};
const randomizeCompose = async () => {
await mutateAsync({
composeId,
suffix: data?.appName || "",
})
.then(async (data) => {
await utils.project.all.invalidate();
setCompose(data);
toast.success("Compose Isolated");
})
.catch(() => {
toast.error("Error isolating the compose");
});
};
return (
<>
<DialogHeader>
<DialogTitle>Isolate Deployment</DialogTitle>
<DialogDescription>
Use this option to isolate the deployment of this compose file.
</DialogDescription>
</DialogHeader>
<div className="text-sm text-muted-foreground flex flex-col gap-2">
<span>
This feature creates an isolated environment for your deployment by
adding unique prefixes to all resources. It establishes a dedicated
network based on your compose file's name, ensuring your services run
in isolation. This prevents conflicts when running multiple instances
of the same template or services with identical names.
</span>
<div className="space-y-4">
<div>
<h4 className="font-medium mb-2">
Resources that will be isolated:
</h4>
<ul className="list-disc list-inside">
<li>Docker volumes</li>
<li>Docker networks</li>
</ul>
</div>
</div>
</div>
{isError && <AlertBlock type="error">{error?.message}</AlertBlock>}
<Form {...form}>
<form
onSubmit={form.handleSubmit(onSubmit)}
id="hook-form-add-project"
className="grid w-full gap-4"
>
{isError && (
<div className="flex flex-row gap-4 rounded-lg items-center bg-red-50 p-2 dark:bg-red-950">
<AlertTriangle className="text-red-600 dark:text-red-400" />
<span className="text-sm text-red-600 dark:text-red-400">
{error?.message}
</span>
</div>
)}
<div className="flex flex-col lg:flex-col gap-4 w-full ">
<div>
<FormField
control={form.control}
name="isolatedDeployment"
render={({ field }) => (
<FormItem className="mt-4 flex flex-row items-center justify-between rounded-lg border p-3 shadow-sm">
<div className="space-y-0.5">
<FormLabel>Enable Randomize ({data?.appName})</FormLabel>
<FormDescription>
Enable randomize to the compose file.
</FormDescription>
</div>
<FormControl>
<Switch
checked={field.value}
onCheckedChange={field.onChange}
/>
</FormControl>
</FormItem>
)}
/>
</div>
<div className="flex flex-col lg:flex-row gap-4 w-full items-end justify-end">
<Button
form="hook-form-add-project"
type="submit"
className="lg:w-fit"
>
Save
</Button>
</div>
</div>
<div className="flex flex-col gap-4">
<Label>Preview</Label>
<pre>
<CodeEditor
value={compose || ""}
language="yaml"
readOnly
height="50rem"
/>
</pre>
</div>
</form>
</Form>
</>
);
};

View File

@@ -1,14 +1,10 @@
import { AlertBlock } from "@/components/shared/alert-block"; import { AlertBlock } from "@/components/shared/alert-block";
import { CodeEditor } from "@/components/shared/code-editor"; import { CodeEditor } from "@/components/shared/code-editor";
import { Button } from "@/components/ui/button"; import { Button } from "@/components/ui/button";
import { CardTitle } from "@/components/ui/card";
import { import {
Dialog,
DialogContent,
DialogDescription, DialogDescription,
DialogHeader, DialogHeader,
DialogTitle, DialogTitle,
DialogTrigger,
} from "@/components/ui/dialog"; } from "@/components/ui/dialog";
import { import {
Form, Form,
@@ -20,11 +16,6 @@ import {
FormMessage, FormMessage,
} from "@/components/ui/form"; } from "@/components/ui/form";
import { Input } from "@/components/ui/input"; import { Input } from "@/components/ui/input";
import {
InputOTP,
InputOTPGroup,
InputOTPSlot,
} from "@/components/ui/input-otp";
import { Switch } from "@/components/ui/switch"; import { Switch } from "@/components/ui/switch";
import { api } from "@/utils/api"; import { api } from "@/utils/api";
import { zodResolver } from "@hookform/resolvers/zod"; import { zodResolver } from "@hookform/resolvers/zod";
@@ -70,6 +61,7 @@ export const RandomizeCompose = ({ composeId }: Props) => {
const suffix = form.watch("suffix"); const suffix = form.watch("suffix");
useEffect(() => { useEffect(() => {
randomizeCompose();
if (data) { if (data) {
form.reset({ form.reset({
suffix: data?.suffix || "", suffix: data?.suffix || "",
@@ -110,126 +102,117 @@ export const RandomizeCompose = ({ composeId }: Props) => {
}; };
return ( return (
<Dialog open={isOpen} onOpenChange={setIsOpen}> <div className="w-full">
<DialogTrigger asChild onClick={() => randomizeCompose()}> <DialogHeader>
<Button className="max-lg:w-full" variant="outline"> <DialogTitle>Randomize Compose (Experimental)</DialogTitle>
<Dices className="h-4 w-4" /> <DialogDescription>
Randomize Compose Use this in case you want to deploy the same compose file and you have
</Button> conflicts with some property like volumes, networks, etc.
</DialogTrigger> </DialogDescription>
<DialogContent className="sm:max-w-6xl max-h-[50rem] overflow-y-auto"> </DialogHeader>
<DialogHeader> <div className="text-sm text-muted-foreground flex flex-col gap-2">
<DialogTitle>Randomize Compose (Experimental)</DialogTitle> <span>
<DialogDescription> This will randomize the compose file and will add a suffix to the
Use this in case you want to deploy the same compose file and you property to avoid conflicts
have conflicts with some property like volumes, networks, etc. </span>
</DialogDescription> <ul className="list-disc list-inside">
</DialogHeader> <li>volumes</li>
<div className="text-sm text-muted-foreground flex flex-col gap-2"> <li>networks</li>
<span> <li>services</li>
This will randomize the compose file and will add a suffix to the <li>configs</li>
property to avoid conflicts <li>secrets</li>
</span> </ul>
<ul className="list-disc list-inside"> <AlertBlock type="info">
<li>volumes</li> When you activate this option, we will include a env `COMPOSE_PREFIX`
<li>networks</li> variable to the compose file so you can use it in your compose file.
<li>services</li> </AlertBlock>
<li>configs</li> </div>
<li>secrets</li> {isError && <AlertBlock type="error">{error?.message}</AlertBlock>}
</ul> <Form {...form}>
<AlertBlock type="info"> <form
When you activate this option, we will include a env onSubmit={form.handleSubmit(onSubmit)}
`COMPOSE_PREFIX` variable to the compose file so you can use it in id="hook-form-add-project"
your compose file. className="grid w-full gap-4"
</AlertBlock> >
</div> {isError && (
{isError && <AlertBlock type="error">{error?.message}</AlertBlock>} <div className="flex flex-row gap-4 rounded-lg items-center bg-red-50 p-2 dark:bg-red-950">
<Form {...form}> <AlertTriangle className="text-red-600 dark:text-red-400" />
<form <span className="text-sm text-red-600 dark:text-red-400">
onSubmit={form.handleSubmit(onSubmit)} {error?.message}
id="hook-form-add-project" </span>
className="grid w-full gap-4"
>
{isError && (
<div className="flex flex-row gap-4 rounded-lg items-center bg-red-50 p-2 dark:bg-red-950">
<AlertTriangle className="text-red-600 dark:text-red-400" />
<span className="text-sm text-red-600 dark:text-red-400">
{error?.message}
</span>
</div>
)}
<div className="flex flex-col lg:flex-col gap-4 w-full ">
<div>
<FormField
control={form.control}
name="suffix"
render={({ field }) => (
<FormItem className="flex flex-col justify-center max-sm:items-center w-full">
<FormLabel>Suffix</FormLabel>
<FormControl>
<Input
placeholder="Enter a suffix (Optional, example: prod)"
{...field}
/>
</FormControl>
<FormMessage />
</FormItem>
)}
/>
<FormField
control={form.control}
name="randomize"
render={({ field }) => (
<FormItem className="mt-4 flex flex-row items-center justify-between rounded-lg border p-3 shadow-sm">
<div className="space-y-0.5">
<FormLabel>Apply Randomize</FormLabel>
<FormDescription>
Apply randomize to the compose file.
</FormDescription>
</div>
<FormControl>
<Switch
checked={field.value}
onCheckedChange={field.onChange}
/>
</FormControl>
</FormItem>
)}
/>
</div>
<div className="flex flex-col lg:flex-row gap-4 w-full items-end justify-end">
<Button
form="hook-form-add-project"
type="submit"
className="lg:w-fit"
>
Save
</Button>
<Button
type="button"
variant="secondary"
onClick={async () => {
await randomizeCompose();
}}
className="lg:w-fit"
>
Random
</Button>
</div>
</div> </div>
<pre> )}
<CodeEditor
value={compose || ""} <div className="flex flex-col lg:flex-col gap-4 w-full ">
language="yaml" <div>
readOnly <FormField
height="50rem" control={form.control}
name="suffix"
render={({ field }) => (
<FormItem className="flex flex-col justify-center max-sm:items-center w-full mt-4">
<FormLabel>Suffix</FormLabel>
<FormControl>
<Input
placeholder="Enter a suffix (Optional, example: prod)"
{...field}
/>
</FormControl>
<FormMessage />
</FormItem>
)}
/> />
</pre> <FormField
</form> control={form.control}
</Form> name="randomize"
</DialogContent> render={({ field }) => (
</Dialog> <FormItem className="mt-4 flex flex-row items-center justify-between rounded-lg border p-3 shadow-sm">
<div className="space-y-0.5">
<FormLabel>Apply Randomize</FormLabel>
<FormDescription>
Apply randomize to the compose file.
</FormDescription>
</div>
<FormControl>
<Switch
checked={field.value}
onCheckedChange={field.onChange}
/>
</FormControl>
</FormItem>
)}
/>
</div>
<div className="flex flex-col lg:flex-row gap-4 w-full items-end justify-end">
<Button
form="hook-form-add-project"
type="submit"
className="lg:w-fit"
>
Save
</Button>
<Button
type="button"
variant="secondary"
onClick={async () => {
await randomizeCompose();
}}
className="lg:w-fit"
>
Random
</Button>
</div>
</div>
<pre>
<CodeEditor
value={compose || ""}
language="yaml"
readOnly
height="50rem"
/>
</pre>
</form>
</Form>
</div>
); );
}; };

View File

@@ -0,0 +1,46 @@
import { Button } from "@/components/ui/button";
import {
Dialog,
DialogContent,
DialogDescription,
DialogHeader,
DialogTitle,
DialogTrigger,
} from "@/components/ui/dialog";
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
import { useState } from "react";
import { IsolatedDeployment } from "./isolated-deployment";
import { RandomizeCompose } from "./randomize-compose";
interface Props {
composeId: string;
}
export const ShowUtilities = ({ composeId }: Props) => {
const [isOpen, setIsOpen] = useState(false);
return (
<Dialog open={isOpen} onOpenChange={setIsOpen}>
<DialogTrigger asChild>
<Button variant="ghost">Show Utilities</Button>
</DialogTrigger>
<DialogContent className="max-h-screen overflow-y-auto sm:max-w-5xl">
<DialogHeader>
<DialogTitle>Utilities </DialogTitle>
<DialogDescription>Modify the application data</DialogDescription>
</DialogHeader>
<Tabs defaultValue="isolated">
<TabsList className="grid w-full grid-cols-2">
<TabsTrigger value="isolated">Isolated Deployment</TabsTrigger>
<TabsTrigger value="randomize">Randomize Compose</TabsTrigger>
</TabsList>
<TabsContent value="randomize" className="pt-5">
<RandomizeCompose composeId={composeId} />
</TabsContent>
<TabsContent value="isolated" className="pt-5">
<IsolatedDeployment composeId={composeId} />
</TabsContent>
</Tabs>
</DialogContent>
</Dialog>
);
};

View File

@@ -0,0 +1 @@
ALTER TABLE "compose" ADD COLUMN "deployable" boolean DEFAULT false NOT NULL;

View File

@@ -0,0 +1 @@
ALTER TABLE "compose" RENAME COLUMN "deployable" TO "isolatedDeployment";

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -449,6 +449,20 @@
"when": 1738522845992, "when": 1738522845992,
"tag": "0063_panoramic_dreadnoughts", "tag": "0063_panoramic_dreadnoughts",
"breakpoints": true "breakpoints": true
},
{
"idx": 64,
"version": "7",
"when": 1738564387043,
"tag": "0064_previous_agent_brand",
"breakpoints": true
},
{
"idx": 65,
"version": "7",
"when": 1739087857244,
"tag": "0065_daily_zaladane",
"breakpoints": true
} }
] ]
} }

View File

@@ -46,6 +46,7 @@ import {
findServerById, findServerById,
loadServices, loadServices,
randomizeComposeFile, randomizeComposeFile,
randomizeIsolatedDeploymentComposeFile,
removeCompose, removeCompose,
removeComposeDirectory, removeComposeDirectory,
removeDeploymentsByComposeId, removeDeploymentsByComposeId,
@@ -216,6 +217,21 @@ export const composeRouter = createTRPCRouter({
} }
return await randomizeComposeFile(input.composeId, input.suffix); return await randomizeComposeFile(input.composeId, input.suffix);
}), }),
isolatedDeployment: protectedProcedure
.input(apiRandomizeCompose)
.mutation(async ({ input, ctx }) => {
const compose = await findComposeById(input.composeId);
if (compose.project.adminId !== ctx.user.adminId) {
throw new TRPCError({
code: "UNAUTHORIZED",
message: "You are not authorized to randomize this compose",
});
}
return await randomizeIsolatedDeploymentComposeFile(
input.composeId,
input.suffix,
);
}),
getConvertedCompose: protectedProcedure getConvertedCompose: protectedProcedure
.input(apiFindCompose) .input(apiFindCompose)
.query(async ({ input, ctx }) => { .query(async ({ input, ctx }) => {
@@ -399,6 +415,7 @@ export const composeRouter = createTRPCRouter({
name: input.id, name: input.id,
sourceType: "raw", sourceType: "raw",
appName: `${projectName}-${generatePassword(6)}`, appName: `${projectName}-${generatePassword(6)}`,
isolatedDeployment: true,
}); });
if (ctx.user.rol === "user") { if (ctx.user.rol === "user") {

View File

@@ -4,8 +4,7 @@ services:
activepieces: activepieces:
image: activepieces/activepieces:0.35.0 image: activepieces/activepieces:0.35.0
restart: unless-stopped restart: unless-stopped
networks:
- dokploy-network
depends_on: depends_on:
postgres: postgres:
condition: service_healthy condition: service_healthy
@@ -35,8 +34,7 @@ services:
postgres: postgres:
image: postgres:14 image: postgres:14
restart: unless-stopped restart: unless-stopped
networks:
- dokploy-network
environment: environment:
POSTGRES_DB: activepieces POSTGRES_DB: activepieces
POSTGRES_PASSWORD: ${AP_POSTGRES_PASSWORD} POSTGRES_PASSWORD: ${AP_POSTGRES_PASSWORD}
@@ -52,8 +50,7 @@ services:
redis: redis:
image: redis:7 image: redis:7
restart: unless-stopped restart: unless-stopped
networks:
- dokploy-network
volumes: volumes:
- redis_data:/data - redis_data:/data
healthcheck: healthcheck:

View File

@@ -17,8 +17,7 @@ services:
interval: 5s interval: 5s
timeout: 5s timeout: 5s
retries: 5 retries: 5
networks:
- dokploy-network
volumes: volumes:
- db-data:/var/lib/postgresql/data - db-data:/var/lib/postgresql/data
environment: environment:

View File

@@ -7,8 +7,7 @@ services:
environment: environment:
POSTGRES_USER: aptabase POSTGRES_USER: aptabase
POSTGRES_PASSWORD: sTr0NGp4ssw0rd POSTGRES_PASSWORD: sTr0NGp4ssw0rd
networks:
- dokploy-network
healthcheck: healthcheck:
test: ["CMD-SHELL", "pg_isready -U aptabase"] test: ["CMD-SHELL", "pg_isready -U aptabase"]
interval: 10s interval: 10s
@@ -27,8 +26,7 @@ services:
nofile: nofile:
soft: 262144 soft: 262144
hard: 262144 hard: 262144
networks:
- dokploy-network
healthcheck: healthcheck:
test: ["CMD-SHELL", "curl -f http://localhost:8123 || exit 1"] test: ["CMD-SHELL", "curl -f http://localhost:8123 || exit 1"]
interval: 10s interval: 10s

View File

@@ -2,8 +2,7 @@ services:
apps: apps:
image: budibase.docker.scarf.sh/budibase/apps:3.2.25 image: budibase.docker.scarf.sh/budibase/apps:3.2.25
restart: unless-stopped restart: unless-stopped
networks:
- dokploy-network
environment: environment:
SELF_HOSTED: 1 SELF_HOSTED: 1
LOG_LEVEL: info LOG_LEVEL: info
@@ -43,8 +42,7 @@ services:
worker: worker:
image: budibase.docker.scarf.sh/budibase/worker:3.2.25 image: budibase.docker.scarf.sh/budibase/worker:3.2.25
restart: unless-stopped restart: unless-stopped
networks:
- dokploy-network
environment: environment:
SELF_HOSTED: 1 SELF_HOSTED: 1
LOG_LEVEL: info LOG_LEVEL: info
@@ -83,8 +81,7 @@ services:
minio: minio:
image: minio/minio:RELEASE.2024-11-07T00-52-20Z image: minio/minio:RELEASE.2024-11-07T00-52-20Z
restart: unless-stopped restart: unless-stopped
networks:
- dokploy-network
volumes: volumes:
- 'minio_data:/data' - 'minio_data:/data'
environment: environment:
@@ -104,8 +101,7 @@ services:
proxy: proxy:
image: budibase/proxy:3.2.25 image: budibase/proxy:3.2.25
restart: unless-stopped restart: unless-stopped
networks:
- dokploy-network
environment: environment:
PROXY_RATE_LIMIT_WEBHOOKS_PER_SECOND: 10 PROXY_RATE_LIMIT_WEBHOOKS_PER_SECOND: 10
PROXY_RATE_LIMIT_API_PER_SECOND: 20 PROXY_RATE_LIMIT_API_PER_SECOND: 20
@@ -137,8 +133,7 @@ services:
couchdb: couchdb:
image: budibase/couchdb:v3.3.3 image: budibase/couchdb:v3.3.3
restart: unless-stopped restart: unless-stopped
networks:
- dokploy-network
environment: environment:
COUCHDB_USER: budibase COUCHDB_USER: budibase
COUCHDB_PASSWORD: ${BB_COUCHDB_PASSWORD} COUCHDB_PASSWORD: ${BB_COUCHDB_PASSWORD}
@@ -157,8 +152,7 @@ services:
- 'couchdb3_data:/opt/couchdb/data' - 'couchdb3_data:/opt/couchdb/data'
redis: redis:
image: redis:7.2-alpine image: redis:7.2-alpine
networks:
- dokploy-network
restart: unless-stopped restart: unless-stopped
command: 'redis-server --requirepass "${BB_REDIS_PASSWORD}"' command: 'redis-server --requirepass "${BB_REDIS_PASSWORD}"'
volumes: volumes:
@@ -176,8 +170,7 @@ services:
start_period: 10s start_period: 10s
watchtower: watchtower:
restart: unless-stopped restart: unless-stopped
networks:
- dokploy-network
image: containrrr/watchtower:1.7.1 image: containrrr/watchtower:1.7.1
volumes: volumes:
- '/var/run/docker.sock:/var/run/docker.sock' - '/var/run/docker.sock:/var/run/docker.sock'

View File

@@ -1,8 +1,7 @@
services: services:
postgres: postgres:
image: postgres:16-alpine image: postgres:16-alpine
networks:
- dokploy-network
volumes: volumes:
- calcom-data:/var/lib/postgresql/data - calcom-data:/var/lib/postgresql/data
environment: environment:

View File

@@ -51,8 +51,7 @@ services:
restart: always restart: always
volumes: volumes:
- chatwoot-postgres-data:/var/lib/postgresql/data - chatwoot-postgres-data:/var/lib/postgresql/data
networks:
- dokploy-network
environment: environment:
- POSTGRES_DB=${POSTGRES_DATABASE} - POSTGRES_DB=${POSTGRES_DATABASE}
- POSTGRES_USER=${POSTGRES_USERNAME} - POSTGRES_USER=${POSTGRES_USERNAME}
@@ -63,8 +62,7 @@ services:
restart: always restart: always
volumes: volumes:
- chatwoot-redis-data:/data - chatwoot-redis-data:/data
networks:
- dokploy-network
networks: networks:
dokploy-network: dokploy-network:

View File

@@ -9,8 +9,7 @@ services:
- 443 - 443
depends_on: depends_on:
- server - server
networks:
- dokploy-network
server: server:
image: bluewaveuptime/uptime_server:latest image: bluewaveuptime/uptime_server:latest
restart: always restart: always
@@ -22,8 +21,7 @@ services:
environment: environment:
- DB_CONNECTION_STRING=mongodb://mongodb:27017/uptime_db - DB_CONNECTION_STRING=mongodb://mongodb:27017/uptime_db
- REDIS_HOST=redis - REDIS_HOST=redis
networks:
- dokploy-network
# volumes: # volumes:
# - /var/run/docker.sock:/var/run/docker.sock:ro # - /var/run/docker.sock:/var/run/docker.sock:ro
redis: redis:
@@ -33,8 +31,7 @@ services:
- 6379 - 6379
volumes: volumes:
- ../files/redis/data:/data - ../files/redis/data:/data
networks:
- dokploy-network
mongodb: mongodb:
image: bluewaveuptime/uptime_database_mongo:latest image: bluewaveuptime/uptime_database_mongo:latest
restart: always restart: always
@@ -43,5 +40,3 @@ services:
command: ["mongod", "--quiet"] command: ["mongod", "--quiet"]
ports: ports:
- 27017 - 27017
networks:
- dokploy-network

View File

@@ -1,8 +1,7 @@
services: services:
coder: coder:
image: ghcr.io/coder/coder:v2.15.3 image: ghcr.io/coder/coder:v2.15.3
networks:
- dokploy-network
volumes: volumes:
- /var/run/docker.sock:/var/run/docker.sock - /var/run/docker.sock:/var/run/docker.sock
group_add: group_add:
@@ -17,8 +16,7 @@ services:
db: db:
image: postgres:17 image: postgres:17
networks:
- dokploy-network
environment: environment:
- POSTGRES_PASSWORD - POSTGRES_PASSWORD
- POSTGRES_USER - POSTGRES_USER

View File

@@ -3,8 +3,7 @@ services:
image: postgis/postgis:13-master image: postgis/postgis:13-master
volumes: volumes:
- directus_database:/var/lib/postgresql/data - directus_database:/var/lib/postgresql/data
networks:
- dokploy-network
environment: environment:
POSTGRES_USER: "directus" POSTGRES_USER: "directus"
POSTGRES_PASSWORD: ${DATABASE_PASSWORD} POSTGRES_PASSWORD: ${DATABASE_PASSWORD}
@@ -26,8 +25,7 @@ services:
retries: 5 retries: 5
start_interval: 5s start_interval: 5s
start_period: 30s start_period: 30s
networks:
- dokploy-network
directus: directus:
image: directus/directus:11.0.2 image: directus/directus:11.0.2

View File

@@ -4,8 +4,7 @@ services:
tickets-postgres: tickets-postgres:
image: mysql:8 image: mysql:8
restart: unless-stopped restart: unless-stopped
networks:
- dokploy-network
volumes: volumes:
- tickets-mysql-data:/var/lib/mysql - tickets-mysql-data:/var/lib/mysql
environment: environment:
@@ -25,8 +24,7 @@ services:
tickets-postgres: tickets-postgres:
condition: service_healthy condition: service_healthy
restart: unless-stopped restart: unless-stopped
networks:
- dokploy-network
volumes: volumes:
- tickets-app-data:/home/container/user - tickets-app-data:/home/container/user
- /etc/timezone:/etc/timezone:ro - /etc/timezone:/etc/timezone:ro

View File

@@ -3,8 +3,7 @@ version: '3.7'
services: services:
discourse-db: discourse-db:
image: docker.io/bitnami/postgresql:17 image: docker.io/bitnami/postgresql:17
networks:
- dokploy-network
volumes: volumes:
- discourse-postgresql-data:/bitnami/postgresql - discourse-postgresql-data:/bitnami/postgresql
environment: environment:
@@ -20,8 +19,7 @@ services:
discourse-redis: discourse-redis:
image: docker.io/bitnami/redis:7.4 image: docker.io/bitnami/redis:7.4
networks:
- dokploy-network
volumes: volumes:
- discourse-redis-data:/bitnami/redis - discourse-redis-data:/bitnami/redis
environment: environment:
@@ -35,8 +33,7 @@ services:
discourse-app: discourse-app:
image: docker.io/bitnami/discourse:3.3.2 image: docker.io/bitnami/discourse:3.3.2
networks:
- dokploy-network
volumes: volumes:
- discourse-data:/bitnami/discourse - discourse-data:/bitnami/discourse
depends_on: depends_on:
@@ -63,8 +60,7 @@ services:
discourse-sidekiq: discourse-sidekiq:
image: docker.io/bitnami/discourse:3.3.2 image: docker.io/bitnami/discourse:3.3.2
networks:
- dokploy-network
volumes: volumes:
- discourse-sidekiq-data:/bitnami/discourse - discourse-sidekiq-data:/bitnami/discourse
depends_on: depends_on:

View File

@@ -12,8 +12,7 @@ services:
- DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB}?schema=public - DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB}?schema=public
- REDIS_URL=redis://redis:6379 - REDIS_URL=redis://redis:6379
restart: unless-stopped restart: unless-stopped
networks:
- dokploy-network
volumes: volumes:
- docmost:/app/data/storage - docmost:/app/data/storage
@@ -24,16 +23,14 @@ services:
- POSTGRES_USER - POSTGRES_USER
- POSTGRES_PASSWORD - POSTGRES_PASSWORD
restart: unless-stopped restart: unless-stopped
networks:
- dokploy-network
volumes: volumes:
- db_docmost_data:/var/lib/postgresql/data - db_docmost_data:/var/lib/postgresql/data
redis: redis:
image: redis:7.2-alpine image: redis:7.2-alpine
restart: unless-stopped restart: unless-stopped
networks:
- dokploy-network
volumes: volumes:
- redis_docmost_data:/data - redis_docmost_data:/data

View File

@@ -2,8 +2,7 @@ version: "3.8"
services: services:
postgres: postgres:
image: postgres:16 image: postgres:16
networks:
- dokploy-network
volumes: volumes:
- documenso-data:/var/lib/postgresql/data - documenso-data:/var/lib/postgresql/data
environment: environment:

View File

@@ -4,16 +4,14 @@ services:
image: plantuml/plantuml-server image: plantuml/plantuml-server
ports: ports:
- "8080" - "8080"
networks:
- dokploy-network
volumes: volumes:
- fonts_volume:/usr/share/fonts/drawio - fonts_volume:/usr/share/fonts/drawio
image-export: image-export:
image: jgraph/export-server image: jgraph/export-server
ports: ports:
- "8000" - "8000"
networks:
- dokploy-network
volumes: volumes:
- fonts_volume:/usr/share/fonts/drawio - fonts_volume:/usr/share/fonts/drawio
environment: environment:
@@ -28,8 +26,7 @@ services:
depends_on: depends_on:
- plantuml-server - plantuml-server
- image-export - image-export
networks:
- dokploy-network
environment: environment:
RAWIO_SELF_CONTAINED: 1 RAWIO_SELF_CONTAINED: 1
DRAWIO_USE_HTTP: 1 DRAWIO_USE_HTTP: 1

View File

@@ -4,8 +4,7 @@ services:
restart: always restart: always
volumes: volumes:
- evolution-instances:/evolution/instances - evolution-instances:/evolution/instances
networks:
- dokploy-network
environment: environment:
- SERVER_URL=${SERVER_URL} - SERVER_URL=${SERVER_URL}
- AUTHENTICATION_TYPE=${AUTHENTICATION_TYPE} - AUTHENTICATION_TYPE=${AUTHENTICATION_TYPE}
@@ -36,8 +35,7 @@ services:
restart: always restart: always
volumes: volumes:
- evolution-postgres-data:/var/lib/postgresql/data - evolution-postgres-data:/var/lib/postgresql/data
networks:
- dokploy-network
environment: environment:
- POSTGRES_DB=${POSTGRES_DATABASE} - POSTGRES_DB=${POSTGRES_DATABASE}
- POSTGRES_USER=${POSTGRES_USERNAME} - POSTGRES_USER=${POSTGRES_USERNAME}
@@ -48,8 +46,7 @@ services:
restart: always restart: always
volumes: volumes:
- evolution-redis-data:/data - evolution-redis-data:/data
networks:
- dokploy-network
networks: networks:
dokploy-network: dokploy-network:

View File

@@ -2,6 +2,5 @@ version: "3.8"
services: services:
excalidraw: excalidraw:
networks:
- dokploy-network
image: excalidraw/excalidraw:latest image: excalidraw/excalidraw:latest

View File

@@ -18,8 +18,7 @@ services:
- postgres:/var/lib/postgresql/data - postgres:/var/lib/postgresql/data
environment: environment:
- POSTGRES_PASSWORD=postgres - POSTGRES_PASSWORD=postgres
networks:
- dokploy-network
formbricks: formbricks:
restart: always restart: always

View File

@@ -17,8 +17,7 @@ services:
db: db:
image: mysql:8.0 image: mysql:8.0
restart: always restart: always
networks:
- dokploy-network
environment: environment:
MYSQL_ROOT_PASSWORD: example MYSQL_ROOT_PASSWORD: example
volumes: volumes:

View File

@@ -11,8 +11,7 @@ services:
- GITEA__database__USER=gitea - GITEA__database__USER=gitea
- GITEA__database__PASSWD=gitea - GITEA__database__PASSWD=gitea
restart: always restart: always
networks:
- dokploy-network
volumes: volumes:
- gitea_server:/data - gitea_server:/data
- /etc/timezone:/etc/timezone:ro - /etc/timezone:/etc/timezone:ro
@@ -27,8 +26,7 @@ services:
- POSTGRES_USER=gitea - POSTGRES_USER=gitea
- POSTGRES_PASSWORD=gitea - POSTGRES_PASSWORD=gitea
- POSTGRES_DB=gitea - POSTGRES_DB=gitea
networks:
- dokploy-network
volumes: volumes:
- gitea_db:/var/lib/postgresql/data - gitea_db:/var/lib/postgresql/data

View File

@@ -20,13 +20,11 @@ services:
restart: unless-stopped restart: unless-stopped
volumes: volumes:
- pg-data:/var/lib/postgresql/data - pg-data:/var/lib/postgresql/data
networks:
- dokploy-network
redis: redis:
image: redis image: redis
restart: unless-stopped restart: unless-stopped
networks:
- dokploy-network
web: web:
image: glitchtip/glitchtip:v4.0 image: glitchtip/glitchtip:v4.0
depends_on: *default-depends_on depends_on: *default-depends_on
@@ -44,15 +42,13 @@ services:
restart: unless-stopped restart: unless-stopped
volumes: volumes:
- uploads:/code/uploads - uploads:/code/uploads
networks:
- dokploy-network
migrate: migrate:
image: glitchtip/glitchtip:v4.0 image: glitchtip/glitchtip:v4.0
depends_on: *default-depends_on depends_on: *default-depends_on
command: "./manage.py migrate" command: "./manage.py migrate"
environment: *default-environment environment: *default-environment
networks:
- dokploy-network
volumes: volumes:
pg-data: pg-data:

View File

@@ -4,8 +4,7 @@ services:
restart: always restart: always
volumes: volumes:
- glpi-mysql-data:/var/lib/mysql - glpi-mysql-data:/var/lib/mysql
networks:
- dokploy-network
glpi-web: glpi-web:
image: elestio/glpi:10.0.16 image: elestio/glpi:10.0.16
@@ -16,8 +15,7 @@ services:
- glpi-www-data:/var/www/html/glpi - glpi-www-data:/var/www/html/glpi
environment: environment:
- TIMEZONE=Europe/Brussels - TIMEZONE=Europe/Brussels
networks:
- dokploy-network
volumes: volumes:
glpi-mysql-data: glpi-mysql-data:

View File

@@ -28,8 +28,7 @@ services:
postgres: postgres:
image: elestio/postgres:16 image: elestio/postgres:16
restart: always restart: always
networks:
- dokploy-network
environment: environment:
- POSTGRES_DB - POSTGRES_DB
- POSTGRES_USER - POSTGRES_USER

View File

@@ -2,8 +2,7 @@ name: ${DOCKER_NAME}
version: "3" version: "3"
services: services:
nginx: nginx:
networks:
- dokploy-network
image: "nginx:1.21.3" image: "nginx:1.21.3"
ports: ports:
- 80 - 80
@@ -12,8 +11,7 @@ services:
restart: unless-stopped restart: unless-stopped
mongodb: mongodb:
networks:
- dokploy-network
image: "mongo:7-jammy" image: "mongo:7-jammy"
environment: environment:
- PUID=1000 - PUID=1000
@@ -23,8 +21,7 @@ services:
restart: unless-stopped restart: unless-stopped
minio: minio:
networks:
- dokploy-network
image: "minio/minio:RELEASE.2024-11-07T00-52-20Z" image: "minio/minio:RELEASE.2024-11-07T00-52-20Z"
command: server /data --address ":9000" --console-address ":9001" command: server /data --address ":9000" --console-address ":9001"
volumes: volumes:
@@ -32,8 +29,7 @@ services:
restart: unless-stopped restart: unless-stopped
elastic: elastic:
networks:
- dokploy-network
image: "elasticsearch:7.14.2" image: "elasticsearch:7.14.2"
command: | command: |
/bin/sh -c "./bin/elasticsearch-plugin list | grep -q ingest-attachment || yes | ./bin/elasticsearch-plugin install --silent ingest-attachment; /bin/sh -c "./bin/elasticsearch-plugin list | grep -q ingest-attachment || yes | ./bin/elasticsearch-plugin install --silent ingest-attachment;
@@ -54,8 +50,7 @@ services:
restart: unless-stopped restart: unless-stopped
rekoni: rekoni:
networks:
- dokploy-network
image: hardcoreeng/rekoni-service:${HULY_VERSION} image: hardcoreeng/rekoni-service:${HULY_VERSION}
environment: environment:
- SECRET=${SECRET} - SECRET=${SECRET}
@@ -66,8 +61,7 @@ services:
restart: unless-stopped restart: unless-stopped
transactor: transactor:
networks:
- dokploy-network
image: hardcoreeng/transactor:${HULY_VERSION} image: hardcoreeng/transactor:${HULY_VERSION}
environment: environment:
- SERVER_PORT=3333 - SERVER_PORT=3333
@@ -84,8 +78,7 @@ services:
restart: unless-stopped restart: unless-stopped
collaborator: collaborator:
networks:
- dokploy-network
image: hardcoreeng/collaborator:${HULY_VERSION} image: hardcoreeng/collaborator:${HULY_VERSION}
environment: environment:
- COLLABORATOR_PORT=3078 - COLLABORATOR_PORT=3078
@@ -97,8 +90,7 @@ services:
restart: unless-stopped restart: unless-stopped
account: account:
networks:
- dokploy-network
image: hardcoreeng/account:${HULY_VERSION} image: hardcoreeng/account:${HULY_VERSION}
environment: environment:
- SERVER_PORT=3000 - SERVER_PORT=3000
@@ -115,8 +107,7 @@ services:
restart: unless-stopped restart: unless-stopped
workspace: workspace:
networks:
- dokploy-network
image: hardcoreeng/workspace:${HULY_VERSION} image: hardcoreeng/workspace:${HULY_VERSION}
environment: environment:
- SERVER_SECRET=${SECRET} - SERVER_SECRET=${SECRET}
@@ -130,8 +121,7 @@ services:
restart: unless-stopped restart: unless-stopped
front: front:
networks:
- dokploy-network
image: hardcoreeng/front:${HULY_VERSION} image: hardcoreeng/front:${HULY_VERSION}
environment: environment:
- SERVER_PORT=8080 - SERVER_PORT=8080
@@ -156,8 +146,7 @@ services:
restart: unless-stopped restart: unless-stopped
fulltext: fulltext:
networks:
- dokploy-network
image: hardcoreeng/fulltext:${HULY_VERSION} image: hardcoreeng/fulltext:${HULY_VERSION}
environment: environment:
- SERVER_SECRET=${SECRET} - SERVER_SECRET=${SECRET}
@@ -171,8 +160,7 @@ services:
restart: unless-stopped restart: unless-stopped
stats: stats:
networks:
- dokploy-network
image: hardcoreeng/stats:${HULY_VERSION} image: hardcoreeng/stats:${HULY_VERSION}
environment: environment:
- PORT=4900 - PORT=4900

View File

@@ -3,8 +3,7 @@ version: "3.9"
services: services:
immich-server: immich-server:
image: ghcr.io/immich-app/immich-server:v1.121.0 image: ghcr.io/immich-app/immich-server:v1.121.0
networks:
- dokploy-network
volumes: volumes:
- immich-library:/usr/src/app/upload - immich-library:/usr/src/app/upload
- /etc/localtime:/etc/localtime:ro - /etc/localtime:/etc/localtime:ro
@@ -38,8 +37,7 @@ services:
immich-machine-learning: immich-machine-learning:
image: ghcr.io/immich-app/immich-machine-learning:v1.121.0 image: ghcr.io/immich-app/immich-machine-learning:v1.121.0
networks:
- dokploy-network
volumes: volumes:
- immich-model-cache:/cache - immich-model-cache:/cache
environment: environment:
@@ -55,8 +53,7 @@ services:
immich-redis: immich-redis:
image: redis:6.2-alpine image: redis:6.2-alpine
networks:
- dokploy-network
volumes: volumes:
- immich-redis-data:/data - immich-redis-data:/data
healthcheck: healthcheck:
@@ -68,8 +65,7 @@ services:
immich-database: immich-database:
image: tensorchord/pgvecto-rs:pg14-v0.2.0 image: tensorchord/pgvecto-rs:pg14-v0.2.0
networks:
- dokploy-network
volumes: volumes:
- immich-postgres:/var/lib/postgresql/data - immich-postgres:/var/lib/postgresql/data
environment: environment:

View File

@@ -19,8 +19,7 @@ services:
- SMTP_SECURE=true - SMTP_SECURE=true
command: npm run migration:latest command: npm run migration:latest
pull_policy: always pull_policy: always
networks:
- dokploy-network
backend: backend:
restart: unless-stopped restart: unless-stopped
@@ -46,8 +45,7 @@ services:
- SMTP_USERNAME - SMTP_USERNAME
- SMTP_PASSWORD - SMTP_PASSWORD
- SMTP_SECURE=true - SMTP_SECURE=true
networks:
- dokploy-network
redis: redis:
image: redis:7.4.1 image: redis:7.4.1
@@ -55,8 +53,7 @@ services:
restart: always restart: always
environment: environment:
- ALLOW_EMPTY_PASSWORD=yes - ALLOW_EMPTY_PASSWORD=yes
networks:
- dokploy-network
volumes: volumes:
- redis_infisical_data:/data - redis_infisical_data:/data
@@ -69,8 +66,7 @@ services:
- POSTGRES_DB - POSTGRES_DB
volumes: volumes:
- pg_infisical_data:/var/lib/postgresql/data - pg_infisical_data:/var/lib/postgresql/data
networks:
- dokploy-network
healthcheck: healthcheck:
test: "pg_isready --username=${POSTGRES_USER} && psql --username=${POSTGRES_USER} --list" test: "pg_isready --username=${POSTGRES_USER} && psql --username=${POSTGRES_USER} --list"
interval: 5s interval: 5s

View File

@@ -3,8 +3,7 @@ version: "3.8"
services: services:
invoiceshelf-postgres: invoiceshelf-postgres:
image: postgres:15 image: postgres:15
networks:
- dokploy-network
volumes: volumes:
- invoiceshelf-postgres-data:/var/lib/postgresql/data - invoiceshelf-postgres-data:/var/lib/postgresql/data
environment: environment:
@@ -19,8 +18,7 @@ services:
invoiceshelf-app: invoiceshelf-app:
image: invoiceshelf/invoiceshelf:latest image: invoiceshelf/invoiceshelf:latest
networks:
- dokploy-network
volumes: volumes:
- invoiceshelf-app-data:/data - invoiceshelf-app-data:/data
- invoiceshelf-app-conf:/conf - invoiceshelf-app-conf:/conf

View File

@@ -16,8 +16,7 @@ services:
depends_on: depends_on:
db: db:
condition: service_healthy condition: service_healthy
networks:
- dokploy-network
db: db:
image: mariadb:10.11 image: mariadb:10.11
restart: unless-stopped restart: unless-stopped
@@ -39,8 +38,7 @@ services:
timeout: 5s timeout: 5s
retries: 5 retries: 5
start_period: 30s start_period: 30s
networks:
- dokploy-network
networks: networks:
dokploy-network: dokploy-network:

View File

@@ -12,8 +12,7 @@ services:
# This variable defines where the logs, file storage, monitor data and secret keys are stored. # This variable defines where the logs, file storage, monitor data and secret keys are stored.
volumes: volumes:
- langflow-data:/app/langflow - langflow-data:/app/langflow
networks:
- dokploy-network
postgres-langflow: postgres-langflow:
image: postgres:16 image: postgres:16
@@ -25,8 +24,7 @@ services:
- 5432 - 5432
volumes: volumes:
- langflow-postgres:/var/lib/postgresql/data - langflow-postgres:/var/lib/postgresql/data
networks:
- dokploy-network
volumes: volumes:
langflow-postgres: langflow-postgres:

View File

@@ -3,8 +3,7 @@ services:
image: postgres:17-alpine image: postgres:17-alpine
ports: ports:
- 5432 - 5432
networks:
- dokploy-network
environment: environment:
- POSTGRES_PASSWORD=listmonk - POSTGRES_PASSWORD=listmonk
- POSTGRES_USER=listmonk - POSTGRES_USER=listmonk
@@ -20,8 +19,7 @@ services:
setup: setup:
image: listmonk/listmonk:v4.1.0 image: listmonk/listmonk:v4.1.0
networks:
- dokploy-network
volumes: volumes:
- ../files/config.toml:/listmonk/config.toml - ../files/config.toml:/listmonk/config.toml
depends_on: depends_on:

View File

@@ -8,8 +8,7 @@ services:
ports: ports:
- 3001 - 3001
- 3002 - 3002
networks:
- dokploy-network
environment: environment:
TRUST_PROXY_HEADER: 1 TRUST_PROXY_HEADER: 1
DB_URL: postgres://logto:${LOGTO_POSTGRES_PASSWORD}@postgres:5432/logto DB_URL: postgres://logto:${LOGTO_POSTGRES_PASSWORD}@postgres:5432/logto
@@ -20,8 +19,7 @@ services:
postgres: postgres:
image: postgres:17-alpine image: postgres:17-alpine
user: postgres user: postgres
networks:
- dokploy-network
environment: environment:
POSTGRES_USER: logto POSTGRES_USER: logto
POSTGRES_PASSWORD: ${LOGTO_POSTGRES_PASSWORD} POSTGRES_PASSWORD: ${LOGTO_POSTGRES_PASSWORD}

View File

@@ -24,8 +24,7 @@ services:
interval: 5s interval: 5s
timeout: 5s timeout: 5s
retries: 5 retries: 5
networks:
- dokploy-network
volumes: volumes:
- db-data:/var/lib/postgresql/data - db-data:/var/lib/postgresql/data
environment: environment:

View File

@@ -22,5 +22,4 @@ services:
POSTGRES_USER: metabase POSTGRES_USER: metabase
POSTGRES_DB: metabaseappdb POSTGRES_DB: metabaseappdb
POSTGRES_PASSWORD: mysecretpassword POSTGRES_PASSWORD: mysecretpassword
networks:
- dokploy-network

View File

@@ -2,8 +2,7 @@ services:
nextcloud: nextcloud:
image: nextcloud:30.0.2 image: nextcloud:30.0.2
restart: always restart: always
networks:
- dokploy-network
ports: ports:
- 80 - 80
volumes: volumes:
@@ -19,8 +18,7 @@ services:
nextcloud_db: nextcloud_db:
image: mariadb image: mariadb
restart: always restart: always
networks:
- dokploy-network
volumes: volumes:
- nextcloud_db_data:/var/lib/mysql - nextcloud_db_data:/var/lib/mysql
environment: environment:

View File

@@ -13,8 +13,7 @@ services:
root_db: root_db:
image: postgres:17 image: postgres:17
restart: always restart: always
networks:
- dokploy-network
environment: environment:
POSTGRES_DB: root_db POSTGRES_DB: root_db
POSTGRES_PASSWORD: password POSTGRES_PASSWORD: password

View File

@@ -15,8 +15,7 @@ services:
db: db:
image: postgres:13 image: postgres:13
networks:
- dokploy-network
environment: environment:
- POSTGRES_DB=postgres - POSTGRES_DB=postgres
- POSTGRES_USER=odoo - POSTGRES_USER=odoo

View File

@@ -3,8 +3,7 @@ services:
ollama: ollama:
volumes: volumes:
- ollama:/root/.ollama - ollama:/root/.ollama
networks:
- dokploy-network
pull_policy: always pull_policy: always
tty: true tty: true
restart: unless-stopped restart: unless-stopped

View File

@@ -46,8 +46,7 @@ services:
- penpot-backend - penpot-backend
- penpot-exporter - penpot-exporter
networks:
- dokploy-network
environment: environment:
PENPOT_FLAGS: disable-email-verification enable-smtp enable-prepl-server disable-secure-session-cookies PENPOT_FLAGS: disable-email-verification enable-smtp enable-prepl-server disable-secure-session-cookies
@@ -63,8 +62,7 @@ services:
- penpot-postgres - penpot-postgres
- penpot-redis - penpot-redis
networks:
- dokploy-network
## Configuration envronment variables for the backend ## Configuration envronment variables for the backend
## container. ## container.
@@ -143,8 +141,7 @@ services:
penpot-exporter: penpot-exporter:
image: "penpotapp/exporter:2.3.2" image: "penpotapp/exporter:2.3.2"
restart: always restart: always
networks:
- dokploy-network
environment: environment:
# Don't touch it; this uses an internal docker network to # Don't touch it; this uses an internal docker network to
@@ -162,8 +159,7 @@ services:
volumes: volumes:
- penpot_postgres_v15:/var/lib/postgresql/data - penpot_postgres_v15:/var/lib/postgresql/data
networks:
- dokploy-network
environment: environment:
- POSTGRES_INITDB_ARGS=--data-checksums - POSTGRES_INITDB_ARGS=--data-checksums
@@ -174,8 +170,7 @@ services:
penpot-redis: penpot-redis:
image: redis:7.2 image: redis:7.2
restart: always restart: always
networks:
- dokploy-network
## A mailcatch service, used as temporal SMTP server. You can access via HTTP to the ## 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 ## port 1080 for read all emails the penpot platform has sent. Should be only used as a
@@ -188,8 +183,7 @@ services:
- '1025' - '1025'
ports: ports:
- 1080 - 1080
networks:
- dokploy-network
## Example configuration of MiniIO (S3 compatible object storage service); If you don't ## 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. ## have preference, then just use filesystem, this is here just for the completeness.

View File

@@ -4,8 +4,7 @@ services:
peppermint-postgres: peppermint-postgres:
image: postgres:latest image: postgres:latest
restart: always restart: always
networks:
- dokploy-network
volumes: volumes:
- peppermint-postgres-data:/var/lib/postgresql/data - peppermint-postgres-data:/var/lib/postgresql/data
environment: environment:
@@ -21,8 +20,7 @@ services:
peppermint-app: peppermint-app:
image: pepperlabs/peppermint:latest image: pepperlabs/peppermint:latest
restart: always restart: always
networks:
- dokploy-network
depends_on: depends_on:
peppermint-postgres: peppermint-postgres:
condition: service_healthy condition: service_healthy

View File

@@ -7,8 +7,7 @@ services:
security_opt: security_opt:
- seccomp:unconfined - seccomp:unconfined
- apparmor:unconfined - apparmor:unconfined
networks:
- dokploy-network
environment: environment:
PHOTOPRISM_ADMIN_USER: "admin" PHOTOPRISM_ADMIN_USER: "admin"
PHOTOPRISM_ADMIN_PASSWORD: ${ADMIN_PASSWORD} PHOTOPRISM_ADMIN_PASSWORD: ${ADMIN_PASSWORD}
@@ -57,8 +56,7 @@ services:
image: mariadb:11 image: mariadb:11
restart: unless-stopped restart: unless-stopped
stop_grace_period: 5s stop_grace_period: 5s
networks:
- dokploy-network
security_opt: security_opt:
- seccomp:unconfined - seccomp:unconfined
- apparmor:unconfined - apparmor:unconfined

View File

@@ -10,8 +10,7 @@ services:
MYSQL_PASSWORD: ${MYSQL_PASSWORD} MYSQL_PASSWORD: ${MYSQL_PASSWORD}
volumes: volumes:
- db_data:/var/lib/mysql - db_data:/var/lib/mysql
networks:
- dokploy-network
phpmyadmin: phpmyadmin:
image: phpmyadmin/phpmyadmin:5.2.1 image: phpmyadmin/phpmyadmin:5.2.1

View File

@@ -3,8 +3,7 @@ services:
plausible_db: plausible_db:
image: postgres:16-alpine image: postgres:16-alpine
restart: always restart: always
networks:
- dokploy-network
volumes: volumes:
- db-data:/var/lib/postgresql/data - db-data:/var/lib/postgresql/data
environment: environment:
@@ -13,8 +12,7 @@ services:
plausible_events_db: plausible_events_db:
image: clickhouse/clickhouse-server:24.3.3.102-alpine image: clickhouse/clickhouse-server:24.3.3.102-alpine
restart: always restart: always
networks:
- dokploy-network
volumes: volumes:
- event-data:/var/lib/clickhouse - event-data:/var/lib/clickhouse
- event-logs:/var/log/clickhouse-server - event-logs:/var/log/clickhouse-server

View File

@@ -6,8 +6,7 @@ services:
volumes: volumes:
- /var/run/docker.sock:/var/run/docker.sock - /var/run/docker.sock:/var/run/docker.sock
- /var/lib/docker/volumes:/var/lib/docker/volumes - /var/lib/docker/volumes:/var/lib/docker/volumes
networks:
- dokploy-network
deploy: deploy:
mode: global mode: global

View File

@@ -4,8 +4,7 @@ services:
postiz-app: postiz-app:
image: ghcr.io/gitroomhq/postiz-app:latest image: ghcr.io/gitroomhq/postiz-app:latest
restart: always restart: always
networks:
- dokploy-network
environment: environment:
MAIN_URL: "https://${POSTIZ_HOST}" MAIN_URL: "https://${POSTIZ_HOST}"
FRONTEND_URL: "https://${POSTIZ_HOST}" FRONTEND_URL: "https://${POSTIZ_HOST}"
@@ -30,8 +29,7 @@ services:
postiz-postgres: postiz-postgres:
image: postgres:17-alpine image: postgres:17-alpine
restart: always restart: always
networks:
- dokploy-network
environment: environment:
POSTGRES_PASSWORD: ${DB_PASSWORD} POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_USER: ${DB_USER} POSTGRES_USER: ${DB_USER}
@@ -47,8 +45,7 @@ services:
postiz-redis: postiz-redis:
image: redis:7.2 image: redis:7.2
restart: always restart: always
networks:
- dokploy-network
healthcheck: healthcheck:
test: redis-cli ping test: redis-cli ping
interval: 10s interval: 10s

View File

@@ -28,8 +28,7 @@ services:
MONGODB_ADVERTISED_HOSTNAME: mongodb MONGODB_ADVERTISED_HOSTNAME: mongodb
MONGODB_ENABLE_JOURNAL: true MONGODB_ENABLE_JOURNAL: true
ALLOW_EMPTY_PASSWORD: yes ALLOW_EMPTY_PASSWORD: yes
networks:
- dokploy-network
volumes: volumes:
mongodb_data: { driver: local } mongodb_data: { driver: local }

View File

@@ -9,8 +9,7 @@ services:
- ROUNDCUBEMAIL_SKIN=elastic - ROUNDCUBEMAIL_SKIN=elastic
- ROUNDCUBEMAIL_DEFAULT_HOST=${DEFAULT_HOST} - ROUNDCUBEMAIL_DEFAULT_HOST=${DEFAULT_HOST}
- ROUNDCUBEMAIL_SMTP_SERVER=${SMTP_SERVER} - ROUNDCUBEMAIL_SMTP_SERVER=${SMTP_SERVER}
networks:
- dokploy-network
networks: networks:
dokploy-network: dokploy-network:

View File

@@ -3,8 +3,7 @@ version: '3.7'
services: services:
ryot-app: ryot-app:
image: ignisda/ryot:v7.10 image: ignisda/ryot:v7.10
networks:
- dokploy-network
environment: environment:
- DATABASE_URL=postgres://postgres:${POSTGRES_PASSWORD}@ryot-db:5432/postgres - DATABASE_URL=postgres://postgres:${POSTGRES_PASSWORD}@ryot-db:5432/postgres
- SERVER_ADMIN_ACCESS_TOKEN=${ADMIN_ACCESS_TOKEN} - SERVER_ADMIN_ACCESS_TOKEN=${ADMIN_ACCESS_TOKEN}
@@ -19,8 +18,7 @@ services:
ryot-db: ryot-db:
image: postgres:16-alpine image: postgres:16-alpine
networks:
- dokploy-network
volumes: volumes:
- ryot-postgres-data:/var/lib/postgresql/data - ryot-postgres-data:/var/lib/postgresql/data
environment: environment:

View File

@@ -3,8 +3,7 @@ version: "3.8"
services: services:
slash-app: slash-app:
image: yourselfhosted/slash:latest image: yourselfhosted/slash:latest
networks:
- dokploy-network
volumes: volumes:
- slash-app-data:/var/opt/slash - slash-app-data:/var/opt/slash
environment: environment:
@@ -17,8 +16,7 @@ services:
slash-postgres: slash-postgres:
image: postgres:16-alpine image: postgres:16-alpine
networks:
- dokploy-network
volumes: volumes:
- slash-postgres-data:/var/lib/postgresql/data - slash-postgres-data:/var/lib/postgresql/data
environment: environment:

View File

@@ -11,8 +11,7 @@ services:
studio: studio:
container_name: supabase-studio container_name: supabase-studio
image: supabase/studio:20240729-ce42139 image: supabase/studio:20240729-ce42139
networks:
- dokploy-network
restart: unless-stopped restart: unless-stopped
healthcheck: healthcheck:
test: test:
@@ -53,8 +52,7 @@ services:
container_name: supabase-kong container_name: supabase-kong
image: kong:2.8.1 image: kong:2.8.1
restart: unless-stopped restart: unless-stopped
networks:
- dokploy-network
# https://unix.stackexchange.com/a/294837 # https://unix.stackexchange.com/a/294837
entrypoint: bash -c 'eval "echo \"$$(cat ~/temp.yml)\"" > ~/kong.yml && /docker-entrypoint.sh kong docker-start' entrypoint: bash -c 'eval "echo \"$$(cat ~/temp.yml)\"" > ~/kong.yml && /docker-entrypoint.sh kong docker-start'
#ports: #ports:
@@ -85,8 +83,7 @@ services:
auth: auth:
container_name: supabase-auth container_name: supabase-auth
image: supabase/gotrue:v2.158.1 image: supabase/gotrue:v2.158.1
networks:
- dokploy-network
depends_on: depends_on:
db: db:
# Disable this if you are using an external Postgres database # Disable this if you are using an external Postgres database
@@ -157,8 +154,7 @@ services:
rest: rest:
container_name: supabase-rest container_name: supabase-rest
image: postgrest/postgrest:v12.2.0 image: postgrest/postgrest:v12.2.0
networks:
- dokploy-network
depends_on: depends_on:
db: db:
# Disable this if you are using an external Postgres database # Disable this if you are using an external Postgres database
@@ -180,8 +176,7 @@ services:
# This container name looks inconsistent but is correct because realtime constructs tenant id by parsing the subdomain # This container name looks inconsistent but is correct because realtime constructs tenant id by parsing the subdomain
container_name: realtime-dev.supabase-realtime container_name: realtime-dev.supabase-realtime
image: supabase/realtime:v2.30.23 image: supabase/realtime:v2.30.23
networks:
- dokploy-network
depends_on: depends_on:
db: db:
# Disable this if you are using an external Postgres database # Disable this if you are using an external Postgres database
@@ -226,8 +221,7 @@ services:
storage: storage:
container_name: supabase-storage container_name: supabase-storage
image: supabase/storage-api:v1.0.6 image: supabase/storage-api:v1.0.6
networks:
- dokploy-network
depends_on: depends_on:
db: db:
# Disable this if you are using an external Postgres database # Disable this if you are using an external Postgres database
@@ -271,8 +265,7 @@ services:
imgproxy: imgproxy:
container_name: supabase-imgproxy container_name: supabase-imgproxy
image: darthsim/imgproxy:v3.8.0 image: darthsim/imgproxy:v3.8.0
networks:
- dokploy-network
healthcheck: healthcheck:
test: ["CMD", "imgproxy", "health"] test: ["CMD", "imgproxy", "health"]
timeout: 5s timeout: 5s
@@ -289,8 +282,7 @@ services:
meta: meta:
container_name: supabase-meta container_name: supabase-meta
image: supabase/postgres-meta:v0.83.2 image: supabase/postgres-meta:v0.83.2
networks:
- dokploy-network
depends_on: depends_on:
db: db:
# Disable this if you are using an external Postgres database # Disable this if you are using an external Postgres database
@@ -310,8 +302,7 @@ services:
container_name: supabase-edge-functions container_name: supabase-edge-functions
image: supabase/edge-runtime:v1.56.0 image: supabase/edge-runtime:v1.56.0
restart: unless-stopped restart: unless-stopped
networks:
- dokploy-network
depends_on: depends_on:
analytics: analytics:
condition: service_healthy condition: service_healthy
@@ -333,8 +324,7 @@ services:
analytics: analytics:
container_name: supabase-analytics container_name: supabase-analytics
image: supabase/logflare:1.4.0 image: supabase/logflare:1.4.0
networks:
- dokploy-network
healthcheck: healthcheck:
test: ["CMD", "curl", "http://localhost:4000/health"] test: ["CMD", "curl", "http://localhost:4000/health"]
timeout: 5s timeout: 5s
@@ -380,8 +370,7 @@ services:
db: db:
container_name: supabase-db container_name: supabase-db
image: supabase/postgres:15.1.1.78 image: supabase/postgres:15.1.1.78
networks:
- dokploy-network
healthcheck: healthcheck:
test: pg_isready -U postgres -h localhost test: pg_isready -U postgres -h localhost
interval: 5s interval: 5s
@@ -430,8 +419,7 @@ services:
vector: vector:
container_name: supabase-vector container_name: supabase-vector
image: timberio/vector:0.28.1-alpine image: timberio/vector:0.28.1-alpine
networks:
- dokploy-network
healthcheck: healthcheck:
test: test:
[ [

View File

@@ -43,8 +43,7 @@ services:
interval: 30s interval: 30s
timeout: 10s timeout: 10s
retries: 3 retries: 3
networks:
- dokploy-network
superset_redis: superset_redis:
image: redis image: redis
@@ -57,8 +56,7 @@ services:
interval: 30s interval: 30s
timeout: 10s timeout: 10s
retries: 3 retries: 3
networks:
- dokploy-network
volumes: volumes:
superset_postgres_data: superset_postgres_data:

View File

@@ -41,8 +41,7 @@ services:
- POSTGRES_DB=${POSTGRES_DB} - POSTGRES_DB=${POSTGRES_DB}
- POSTGRES_USER=${POSTGRES_USER} - POSTGRES_USER=${POSTGRES_USER}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD} - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
networks:
- dokploy-network
healthcheck: healthcheck:
test: test:
[ [
@@ -58,8 +57,7 @@ services:
environment: environment:
- TZ=${TIMEZONE} - TZ=${TIMEZONE}
- PRISMA_DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB} - PRISMA_DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB}
networks:
- dokploy-network
depends_on: depends_on:
teable-db: teable-db:
condition: service_healthy condition: service_healthy

View File

@@ -1467,8 +1467,8 @@ export const templates: TemplateData[] = [
}, },
tags: ["hrms", "payroll", "leaves", "expenses", "attendance", "performace"], tags: ["hrms", "payroll", "leaves", "expenses", "attendance", "performace"],
load: () => import("./frappe-hr/index").then((m) => m.generate), load: () => import("./frappe-hr/index").then((m) => m.generate),
}, },
{ {
id: "formbricks", id: "formbricks",
name: "Formbricks", name: "Formbricks",
version: "v3.1.3", version: "v3.1.3",
@@ -1482,6 +1482,5 @@ export const templates: TemplateData[] = [
}, },
tags: ["forms", "analytics"], tags: ["forms", "analytics"],
load: () => import("./formbricks/index").then((m) => m.generate), load: () => import("./formbricks/index").then((m) => m.generate),
}, },
]; ];

View File

@@ -4,8 +4,7 @@ services:
twenty-change-vol-ownership: twenty-change-vol-ownership:
image: ubuntu image: ubuntu
user: root user: root
networks:
- dokploy-network
volumes: volumes:
- twenty-server-local-data:/tmp/server-local-data - twenty-server-local-data:/tmp/server-local-data
- twenty-docker-data:/tmp/docker-data - twenty-docker-data:/tmp/docker-data
@@ -16,8 +15,7 @@ services:
twenty-server: twenty-server:
image: twentycrm/twenty:latest image: twentycrm/twenty:latest
networks:
- dokploy-network
volumes: volumes:
- twenty-server-local-data:/app/packages/twenty-server/${STORAGE_LOCAL_PATH:-.local-storage} - twenty-server-local-data:/app/packages/twenty-server/${STORAGE_LOCAL_PATH:-.local-storage}
- twenty-docker-data:/app/docker-data - twenty-docker-data:/app/docker-data
@@ -45,8 +43,7 @@ services:
twenty-worker: twenty-worker:
image: twentycrm/twenty:latest image: twentycrm/twenty:latest
networks:
- dokploy-network
command: ["yarn", "worker:prod"] command: ["yarn", "worker:prod"]
environment: environment:
PG_DATABASE_URL: postgres://${DB_USER}:${DB_PASSWORD}@twenty-postgres:5432/twenty PG_DATABASE_URL: postgres://${DB_USER}:${DB_PASSWORD}@twenty-postgres:5432/twenty
@@ -65,8 +62,7 @@ services:
twenty-postgres: twenty-postgres:
image: postgres:16-alpine image: postgres:16-alpine
networks:
- dokploy-network
volumes: volumes:
- twenty-postgres-data:/var/lib/postgresql/data - twenty-postgres-data:/var/lib/postgresql/data
environment: environment:
@@ -82,8 +78,7 @@ services:
twenty-redis: twenty-redis:
image: redis:latest image: redis:latest
networks:
- dokploy-network
volumes: volumes:
- twenty-redis-data:/data - twenty-redis-data:/data
healthcheck: healthcheck:

View File

@@ -13,8 +13,7 @@ services:
POSTGRES_USER: typebot POSTGRES_USER: typebot
POSTGRES_DB: typebot POSTGRES_DB: typebot
POSTGRES_PASSWORD: typebot POSTGRES_PASSWORD: typebot
networks:
- dokploy-network
typebot-builder: typebot-builder:
image: baptistearno/typebot-builder:2.27 image: baptistearno/typebot-builder:2.27

View File

@@ -22,8 +22,7 @@ services:
interval: 5s interval: 5s
timeout: 5s timeout: 5s
retries: 5 retries: 5
networks:
- dokploy-network
volumes: volumes:
- db-data:/var/lib/postgresql/data - db-data:/var/lib/postgresql/data
environment: environment:

View File

@@ -29,8 +29,7 @@ services:
restart: unless-stopped restart: unless-stopped
depends_on: depends_on:
- unifi-db - unifi-db
networks:
- dokploy-network
unifi-db: unifi-db:
image: mongo:4.4 image: mongo:4.4
@@ -40,8 +39,7 @@ services:
ports: ports:
- 27017 - 27017
restart: unless-stopped restart: unless-stopped
networks:
- dokploy-network
networks: networks:
dokploy-network: dokploy-network:

View File

@@ -3,8 +3,7 @@ name: unsend-prod
services: services:
unsend-db-prod: unsend-db-prod:
image: postgres:16 image: postgres:16
networks:
- dokploy-network
restart: always restart: always
environment: environment:
- POSTGRES_USER=${POSTGRES_USER:?err} - POSTGRES_USER=${POSTGRES_USER:?err}
@@ -22,8 +21,7 @@ services:
unsend-redis-prod: unsend-redis-prod:
image: redis:7 image: redis:7
networks:
- dokploy-network
restart: always restart: always
# ports: # ports:
# - "6379:6379" # - "6379:6379"
@@ -33,8 +31,7 @@ services:
unsend-storage-prod: unsend-storage-prod:
image: minio/minio:RELEASE.2024-11-07T00-52-20Z image: minio/minio:RELEASE.2024-11-07T00-52-20Z
networks:
- dokploy-network
ports: ports:
- 9002 - 9002
- 9001 - 9001
@@ -48,8 +45,6 @@ services:
unsend: unsend:
image: unsend/unsend:v1.3.2 image: unsend/unsend:v1.3.2
networks:
- dokploy-network
restart: always restart: always
ports: ports:
- ${PORT:-3000} - ${PORT:-3000}

View File

@@ -7,8 +7,7 @@ services:
restart: unless-stopped restart: unless-stopped
volumes: volumes:
- windmill-postgres-data:/var/lib/postgresql/data - windmill-postgres-data:/var/lib/postgresql/data
networks:
- dokploy-network
environment: environment:
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: windmill POSTGRES_DB: windmill
@@ -20,8 +19,7 @@ services:
windmill-server: windmill-server:
image: ghcr.io/windmill-labs/windmill:main image: ghcr.io/windmill-labs/windmill:main
networks:
- dokploy-network
restart: unless-stopped restart: unless-stopped
environment: environment:
- DATABASE_URL=${DATABASE_URL} - DATABASE_URL=${DATABASE_URL}
@@ -42,8 +40,7 @@ services:
cpus: "1" cpus: "1"
memory: 2048M memory: 2048M
restart: unless-stopped restart: unless-stopped
networks:
- dokploy-network
environment: environment:
- DATABASE_URL=${DATABASE_URL} - DATABASE_URL=${DATABASE_URL}
- MODE=worker - MODE=worker
@@ -65,8 +62,7 @@ services:
cpus: "0.1" cpus: "0.1"
memory: 128M memory: 128M
restart: unless-stopped restart: unless-stopped
networks:
- dokploy-network
environment: environment:
- DATABASE_URL=${DATABASE_URL} - DATABASE_URL=${DATABASE_URL}
- MODE=worker - MODE=worker
@@ -82,16 +78,14 @@ services:
windmill-lsp: windmill-lsp:
image: ghcr.io/windmill-labs/windmill-lsp:latest image: ghcr.io/windmill-labs/windmill-lsp:latest
restart: unless-stopped restart: unless-stopped
networks:
- dokploy-network
volumes: volumes:
- windmill-lsp-cache:/root/.cache - windmill-lsp-cache:/root/.cache
windmill-caddy: windmill-caddy:
image: ghcr.io/windmill-labs/caddy-l4:latest image: ghcr.io/windmill-labs/caddy-l4:latest
restart: unless-stopped restart: unless-stopped
networks:
- dokploy-network
volumes: volumes:
- ../files/Caddyfile:/etc/caddy/Caddyfile - ../files/Caddyfile:/etc/caddy/Caddyfile
environment: environment:

View File

@@ -12,8 +12,6 @@ services:
db: db:
image: mysql:5.7.34 image: mysql:5.7.34
networks:
- dokploy-network
environment: environment:
MYSQL_DATABASE: exampledb MYSQL_DATABASE: exampledb
MYSQL_USER: exampleuser MYSQL_USER: exampleuser

View File

@@ -3,8 +3,7 @@ version: '3.7'
services: services:
yourls-app: yourls-app:
image: yourls:1.9.2 image: yourls:1.9.2
networks:
- dokploy-network
environment: environment:
YOURLS_SITE: https://${YOURLS_HOST} YOURLS_SITE: https://${YOURLS_HOST}
YOURLS_USER: ${YOURLS_ADMIN_USER} YOURLS_USER: ${YOURLS_ADMIN_USER}
@@ -22,8 +21,7 @@ services:
yourls-mysql: yourls-mysql:
image: mysql:5.7 image: mysql:5.7
networks:
- dokploy-network
environment: environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: yourls MYSQL_DATABASE: yourls

View File

@@ -2,8 +2,7 @@ version: "3"
services: services:
postgres: postgres:
image: postgres:15 image: postgres:15
networks:
- dokploy-network
restart: unless-stopped restart: unless-stopped
environment: environment:
- POSTGRES_USER=postgres - POSTGRES_USER=postgres

View File

@@ -69,6 +69,7 @@ export const compose = pgTable("compose", {
composePath: text("composePath").notNull().default("./docker-compose.yml"), composePath: text("composePath").notNull().default("./docker-compose.yml"),
suffix: text("suffix").notNull().default(""), suffix: text("suffix").notNull().default(""),
randomize: boolean("randomize").notNull().default(false), randomize: boolean("randomize").notNull().default(false),
isolatedDeployment: boolean("isolatedDeployment").notNull().default(false),
composeStatus: applicationStatus("composeStatus").notNull().default("idle"), composeStatus: applicationStatus("composeStatus").notNull().default("idle"),
projectId: text("projectId") projectId: text("projectId")
.notNull() .notNull()

View File

@@ -73,6 +73,7 @@ export * from "./utils/builders/utils";
export * from "./utils/cluster/upload"; export * from "./utils/cluster/upload";
export * from "./utils/docker/compose"; export * from "./utils/docker/compose";
export * from "./utils/docker/collision";
export * from "./utils/docker/domain"; export * from "./utils/docker/domain";
export * from "./utils/docker/utils"; export * from "./utils/docker/utils";
export * from "./utils/docker/types"; export * from "./utils/docker/types";

View File

@@ -34,6 +34,12 @@ export const buildCompose = async (compose: ComposeNested, logPath: string) => {
await writeDomainsToCompose(compose, domains); await writeDomainsToCompose(compose, domains);
createEnvFile(compose); createEnvFile(compose);
if (compose.isolatedDeployment) {
await execAsync(
`docker network inspect ${compose.appName} >/dev/null 2>&1 || docker network create --attachable ${compose.appName}`,
);
}
const logContent = ` const logContent = `
App Name: ${appName} App Name: ${appName}
Build Compose 🐳 Build Compose 🐳
@@ -73,6 +79,12 @@ export const buildCompose = async (compose: ComposeNested, logPath: string) => {
}, },
); );
if (compose.isolatedDeployment) {
await execAsync(
`docker network connect ${compose.appName} $(docker ps --filter "name=dokploy-traefik" -q) >/dev/null 2>&1`,
);
}
writeStream.write("Docker Compose Deployed: ✅"); writeStream.write("Docker Compose Deployed: ✅");
} catch (error) { } catch (error) {
writeStream.write(`Error ❌ ${(error as Error).message}`); writeStream.write(`Error ❌ ${(error as Error).message}`);
@@ -128,9 +140,10 @@ Compose Type: ${composeType} ✅`;
cd "${projectPath}"; cd "${projectPath}";
${exportEnvCommand} ${exportEnvCommand}
${compose.isolatedDeployment ? `docker network inspect ${compose.appName} >/dev/null 2>&1 || docker network create --attachable ${compose.appName}` : ""}
docker ${command.split(" ").join(" ")} >> "${logPath}" 2>&1 || { echo "Error: ❌ Docker command failed" >> "${logPath}"; exit 1; } docker ${command.split(" ").join(" ")} >> "${logPath}" 2>&1 || { echo "Error: ❌ Docker command failed" >> "${logPath}"; exit 1; }
${compose.isolatedDeployment ? `docker network connect ${compose.appName} $(docker ps --filter "name=dokploy-traefik" -q) >/dev/null 2>&1` : ""}
echo "Docker Compose Deployed: ✅" >> "${logPath}" echo "Docker Compose Deployed: ✅" >> "${logPath}"
} || { } || {

View File

@@ -0,0 +1,46 @@
import { findComposeById } from "@dokploy/server/services/compose";
import { dump, load } from "js-yaml";
import { addAppNameToAllServiceNames } from "./collision/root-network";
import { generateRandomHash } from "./compose";
import { addSuffixToAllVolumes } from "./compose/volume";
import type { ComposeSpecification } from "./types";
export const addAppNameToPreventCollision = (
composeData: ComposeSpecification,
appName: string,
): ComposeSpecification => {
let updatedComposeData = { ...composeData };
updatedComposeData = addAppNameToAllServiceNames(updatedComposeData, appName);
updatedComposeData = addSuffixToAllVolumes(updatedComposeData, appName);
return updatedComposeData;
};
export const randomizeIsolatedDeploymentComposeFile = async (
composeId: string,
suffix?: string,
) => {
const compose = await findComposeById(composeId);
const composeFile = compose.composeFile;
const composeData = load(composeFile) as ComposeSpecification;
const randomSuffix = suffix || compose.appName || generateRandomHash();
const newComposeFile = addAppNameToPreventCollision(
composeData,
randomSuffix,
);
return dump(newComposeFile);
};
export const randomizeDeployableSpecificationFile = (
composeSpec: ComposeSpecification,
suffix?: string,
) => {
if (!suffix) {
return composeSpec;
}
const newComposeFile = addAppNameToPreventCollision(composeSpec, suffix);
return newComposeFile;
};

View File

@@ -0,0 +1,62 @@
import _ from "lodash";
import type { ComposeSpecification, DefinitionsService } from "../types";
export const addAppNameToRootNetwork = (
composeData: ComposeSpecification,
appName: string,
): ComposeSpecification => {
const updatedComposeData = { ...composeData };
// Initialize networks if it doesn't exist
if (!updatedComposeData.networks) {
updatedComposeData.networks = {};
}
// Add the new network with the app name
updatedComposeData.networks[appName] = {
name: appName,
external: true,
};
return updatedComposeData;
};
export const addAppNameToServiceNetworks = (
services: { [key: string]: DefinitionsService },
appName: string,
): { [key: string]: DefinitionsService } => {
return _.mapValues(services, (service) => {
if (!service.networks) {
service.networks = [appName];
return service;
}
if (Array.isArray(service.networks)) {
if (!service.networks.includes(appName)) {
service.networks.push(appName);
}
} else {
service.networks[appName] = {};
}
return service;
});
};
export const addAppNameToAllServiceNames = (
composeData: ComposeSpecification,
appName: string,
): ComposeSpecification => {
let updatedComposeData = { ...composeData };
updatedComposeData = addAppNameToRootNetwork(updatedComposeData, appName);
if (updatedComposeData.services) {
updatedComposeData.services = addAppNameToServiceNetworks(
updatedComposeData.services,
appName,
);
}
return updatedComposeData;
};

View File

@@ -26,6 +26,7 @@ import {
createComposeFileRaw, createComposeFileRaw,
createComposeFileRawRemote, createComposeFileRawRemote,
} from "../providers/raw"; } from "../providers/raw";
import { randomizeDeployableSpecificationFile } from "./collision";
import { randomizeSpecificationFile } from "./compose"; import { randomizeSpecificationFile } from "./compose";
import type { import type {
ComposeSpecification, ComposeSpecification,
@@ -190,7 +191,13 @@ export const addDomainToCompose = async (
return null; return null;
} }
if (compose.randomize) { if (compose.isolatedDeployment) {
const randomized = randomizeDeployableSpecificationFile(
result,
compose.suffix || compose.appName,
);
result = randomized;
} else if (compose.randomize) {
const randomized = randomizeSpecificationFile(result, compose.suffix); const randomized = randomizeSpecificationFile(result, compose.suffix);
result = randomized; result = randomized;
} }
@@ -240,14 +247,18 @@ export const addDomainToCompose = async (
labels.push(...httpLabels); labels.push(...httpLabels);
} }
// Add the dokploy-network to the service if (!compose.isolatedDeployment) {
result.services[serviceName].networks = addDokployNetworkToService( // Add the dokploy-network to the service
result.services[serviceName].networks, result.services[serviceName].networks = addDokployNetworkToService(
); result.services[serviceName].networks,
);
}
} }
// Add dokploy-network to the root of the compose file // Add dokploy-network to the root of the compose file
result.networks = addDokployNetworkToRoot(result.networks); if (!compose.isolatedDeployment) {
result.networks = addDokployNetworkToRoot(result.networks);
}
return result; return result;
}; };