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,19 +102,12 @@ export const RandomizeCompose = ({ composeId }: Props) => {
}; };
return ( return (
<Dialog open={isOpen} onOpenChange={setIsOpen}> <div className="w-full">
<DialogTrigger asChild onClick={() => randomizeCompose()}>
<Button className="max-lg:w-full" variant="outline">
<Dices className="h-4 w-4" />
Randomize Compose
</Button>
</DialogTrigger>
<DialogContent className="sm:max-w-6xl max-h-[50rem] overflow-y-auto">
<DialogHeader> <DialogHeader>
<DialogTitle>Randomize Compose (Experimental)</DialogTitle> <DialogTitle>Randomize Compose (Experimental)</DialogTitle>
<DialogDescription> <DialogDescription>
Use this in case you want to deploy the same compose file and you Use this in case you want to deploy the same compose file and you have
have conflicts with some property like volumes, networks, etc. conflicts with some property like volumes, networks, etc.
</DialogDescription> </DialogDescription>
</DialogHeader> </DialogHeader>
<div className="text-sm text-muted-foreground flex flex-col gap-2"> <div className="text-sm text-muted-foreground flex flex-col gap-2">
@@ -138,9 +123,8 @@ export const RandomizeCompose = ({ composeId }: Props) => {
<li>secrets</li> <li>secrets</li>
</ul> </ul>
<AlertBlock type="info"> <AlertBlock type="info">
When you activate this option, we will include a env When you activate this option, we will include a env `COMPOSE_PREFIX`
`COMPOSE_PREFIX` variable to the compose file so you can use it in variable to the compose file so you can use it in your compose file.
your compose file.
</AlertBlock> </AlertBlock>
</div> </div>
{isError && <AlertBlock type="error">{error?.message}</AlertBlock>} {isError && <AlertBlock type="error">{error?.message}</AlertBlock>}
@@ -165,7 +149,7 @@ export const RandomizeCompose = ({ composeId }: Props) => {
control={form.control} control={form.control}
name="suffix" name="suffix"
render={({ field }) => ( render={({ field }) => (
<FormItem className="flex flex-col justify-center max-sm:items-center w-full"> <FormItem className="flex flex-col justify-center max-sm:items-center w-full mt-4">
<FormLabel>Suffix</FormLabel> <FormLabel>Suffix</FormLabel>
<FormControl> <FormControl>
<Input <Input
@@ -229,7 +213,6 @@ export const RandomizeCompose = ({ composeId }: Props) => {
</pre> </pre>
</form> </form>
</Form> </Form>
</DialogContent> </div>
</Dialog>
); );
}; };

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

@@ -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}`);
@@ -129,8 +141,9 @@ 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);
} }
if (!compose.isolatedDeployment) {
// Add the dokploy-network to the service // Add the dokploy-network to the service
result.services[serviceName].networks = addDokployNetworkToService( result.services[serviceName].networks = addDokployNetworkToService(
result.services[serviceName].networks, result.services[serviceName].networks,
); );
} }
}
// Add dokploy-network to the root of the compose file // Add dokploy-network to the root of the compose file
if (!compose.isolatedDeployment) {
result.networks = addDokployNetworkToRoot(result.networks); result.networks = addDokployNetworkToRoot(result.networks);
}
return result; return result;
}; };