Compare commits
72 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
56af89468a | ||
|
|
b1502f5f82 | ||
|
|
c78b8cfead | ||
|
|
48c4ec55f9 | ||
|
|
2ebb02dc20 | ||
|
|
9ca3ab3845 | ||
|
|
0baf9d8962 | ||
|
|
71c609df0e | ||
|
|
450302b2c2 | ||
|
|
71a007a4b3 | ||
|
|
871931b460 | ||
|
|
3a7bb5016c | ||
|
|
23b59076b8 | ||
|
|
2ddfc83f36 | ||
|
|
ba54124a56 | ||
|
|
64bdf07dbd | ||
|
|
8366219266 | ||
|
|
f38fb96eaf | ||
|
|
3b1ade804f | ||
|
|
fd69b45e5e | ||
|
|
12034e460e | ||
|
|
2b5a1d90b0 | ||
|
|
e7195c8acf | ||
|
|
9ace0f38cd | ||
|
|
796e50ed5f | ||
|
|
ed54df9bd2 | ||
|
|
bf6c2698d4 | ||
|
|
bbdda014d8 | ||
|
|
d9c83b7010 | ||
|
|
209029214e | ||
|
|
9de3bf3c32 | ||
|
|
2c65fc22b0 | ||
|
|
6688b14753 | ||
|
|
6ea2a82bb0 | ||
|
|
e01347673e | ||
|
|
030c8a312d | ||
|
|
6b9fd596e5 | ||
|
|
7e36433144 | ||
|
|
0a6554c275 | ||
|
|
fcc55355f2 | ||
|
|
78e606876a | ||
|
|
7e99baa267 | ||
|
|
92c03bb7cc | ||
|
|
3a5ecb2f64 | ||
|
|
c0a00f4957 | ||
|
|
a8f94540f9 | ||
|
|
3e2cfe6eb8 | ||
|
|
b2d5090b36 | ||
|
|
0a0f53e9de | ||
|
|
17ce03e529 | ||
|
|
f44512a437 | ||
|
|
8379068fe3 | ||
|
|
a71de72a3c | ||
|
|
b024060eed | ||
|
|
56b26ce0d5 | ||
|
|
a9e3a65782 | ||
|
|
7a472df753 | ||
|
|
bd809c8dca | ||
|
|
48642979c5 | ||
|
|
46411a5f4e | ||
|
|
82cf0643d7 | ||
|
|
65780ee852 | ||
|
|
9d988c9a9b | ||
|
|
eb211b933e | ||
|
|
20eb6d7985 | ||
|
|
d424524d69 | ||
|
|
6f2148c060 | ||
|
|
97b77e526d | ||
|
|
077f47f2d8 | ||
|
|
5d6847b970 | ||
|
|
79fca72d06 | ||
|
|
62a3707c10 |
BIN
.github/sponsors/openalternative.png
vendored
Normal file
|
After Width: | Height: | Size: 4.1 KiB |
@@ -93,6 +93,7 @@ For detailed documentation, visit [docs.dokploy.com](https://docs.dokploy.com).
|
|||||||
<a href="https://cloudblast.io/?ref=dokploy "><img src="https://cloudblast.io/img/logo-icon.193cf13e.svg" width="250px" alt="Cloudblast.io"/></a>
|
<a href="https://cloudblast.io/?ref=dokploy "><img src="https://cloudblast.io/img/logo-icon.193cf13e.svg" width="250px" alt="Cloudblast.io"/></a>
|
||||||
<a href="https://startupfa.me/?ref=dokploy "><img src=".github/sponsors/startupfame.png" width="65px" alt="Startupfame"/></a>
|
<a href="https://startupfa.me/?ref=dokploy "><img src=".github/sponsors/startupfame.png" width="65px" alt="Startupfame"/></a>
|
||||||
<a href="https://itsdb-center.com?ref=dokploy "><img src=".github/sponsors/its.png" width="65px" alt="Itsdb-center"/></a>
|
<a href="https://itsdb-center.com?ref=dokploy "><img src=".github/sponsors/its.png" width="65px" alt="Itsdb-center"/></a>
|
||||||
|
<a href="https://openalternative.co/?ref=dokploy "><img src=".github/sponsors/openalternative.png" width="65px" alt="Openalternative"/></a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
### Community Backers 🤝
|
### Community Backers 🤝
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
};
|
||||||
@@ -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>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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>
|
||||||
|
);
|
||||||
|
};
|
||||||
@@ -1,3 +1,5 @@
|
|||||||
|
import { badgeStateColor } from "@/components/dashboard/application/logs/show";
|
||||||
|
import { Badge } from "@/components/ui/badge";
|
||||||
import { Button } from "@/components/ui/button";
|
import { Button } from "@/components/ui/button";
|
||||||
import {
|
import {
|
||||||
Card,
|
Card,
|
||||||
@@ -96,7 +98,10 @@ export const ComposeFreeMonitoring = ({
|
|||||||
key={container.containerId}
|
key={container.containerId}
|
||||||
value={container.name}
|
value={container.name}
|
||||||
>
|
>
|
||||||
{container.name} ({container.containerId}) {container.state}
|
{container.name} ({container.containerId}){" "}
|
||||||
|
<Badge variant={badgeStateColor(container.state)}>
|
||||||
|
{container.state}
|
||||||
|
</Badge>
|
||||||
</SelectItem>
|
</SelectItem>
|
||||||
))}
|
))}
|
||||||
<SelectLabel>Containers ({data?.length})</SelectLabel>
|
<SelectLabel>Containers ({data?.length})</SelectLabel>
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
import { badgeStateColor } from "@/components/dashboard/application/logs/show";
|
||||||
|
import { Badge } from "@/components/ui/badge";
|
||||||
import { Button } from "@/components/ui/button";
|
import { Button } from "@/components/ui/button";
|
||||||
import {
|
import {
|
||||||
Card,
|
Card,
|
||||||
@@ -102,7 +104,9 @@ export const ComposePaidMonitoring = ({
|
|||||||
value={container.name}
|
value={container.name}
|
||||||
>
|
>
|
||||||
{container.name} ({container.containerId}){" "}
|
{container.name} ({container.containerId}){" "}
|
||||||
{container.state}
|
<Badge variant={badgeStateColor(container.state)}>
|
||||||
|
{container.state}
|
||||||
|
</Badge>
|
||||||
</SelectItem>
|
</SelectItem>
|
||||||
))}
|
))}
|
||||||
<SelectLabel>Containers ({data?.length})</SelectLabel>
|
<SelectLabel>Containers ({data?.length})</SelectLabel>
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import { BreadcrumbSidebar } from "@/components/shared/breadcrumb-sidebar";
|
import { BreadcrumbSidebar } from "@/components/shared/breadcrumb-sidebar";
|
||||||
import { DateTooltip } from "@/components/shared/date-tooltip";
|
import { DateTooltip } from "@/components/shared/date-tooltip";
|
||||||
|
import { StatusTooltip } from "@/components/shared/status-tooltip";
|
||||||
import {
|
import {
|
||||||
AlertDialog,
|
AlertDialog,
|
||||||
AlertDialogAction,
|
AlertDialogAction,
|
||||||
@@ -176,8 +177,11 @@ export const ShowProjects = () => {
|
|||||||
<div key={app.applicationId}>
|
<div key={app.applicationId}>
|
||||||
<DropdownMenuSeparator />
|
<DropdownMenuSeparator />
|
||||||
<DropdownMenuGroup>
|
<DropdownMenuGroup>
|
||||||
<DropdownMenuLabel className="font-normal capitalize text-xs">
|
<DropdownMenuLabel className="font-normal capitalize text-xs flex items-center justify-between">
|
||||||
{app.name}
|
{app.name}
|
||||||
|
<StatusTooltip
|
||||||
|
status={app.applicationStatus}
|
||||||
|
/>
|
||||||
</DropdownMenuLabel>
|
</DropdownMenuLabel>
|
||||||
<DropdownMenuSeparator />
|
<DropdownMenuSeparator />
|
||||||
{app.domains.map((domain) => (
|
{app.domains.map((domain) => (
|
||||||
@@ -209,8 +213,11 @@ export const ShowProjects = () => {
|
|||||||
<div key={comp.composeId}>
|
<div key={comp.composeId}>
|
||||||
<DropdownMenuSeparator />
|
<DropdownMenuSeparator />
|
||||||
<DropdownMenuGroup>
|
<DropdownMenuGroup>
|
||||||
<DropdownMenuLabel className="font-normal capitalize text-xs">
|
<DropdownMenuLabel className="font-normal capitalize text-xs flex items-center justify-between">
|
||||||
{comp.name}
|
{comp.name}
|
||||||
|
<StatusTooltip
|
||||||
|
status={comp.composeStatus}
|
||||||
|
/>
|
||||||
</DropdownMenuLabel>
|
</DropdownMenuLabel>
|
||||||
<DropdownMenuSeparator />
|
<DropdownMenuSeparator />
|
||||||
{comp.domains.map((domain) => (
|
{comp.domains.map((domain) => (
|
||||||
|
|||||||
1
apps/dokploy/drizzle/0064_previous_agent_brand.sql
Normal file
@@ -0,0 +1 @@
|
|||||||
|
ALTER TABLE "compose" ADD COLUMN "deployable" boolean DEFAULT false NOT NULL;
|
||||||
1
apps/dokploy/drizzle/0065_daily_zaladane.sql
Normal file
@@ -0,0 +1 @@
|
|||||||
|
ALTER TABLE "compose" RENAME COLUMN "deployable" TO "isolatedDeployment";
|
||||||
4485
apps/dokploy/drizzle/meta/0064_snapshot.json
Normal file
4485
apps/dokploy/drizzle/meta/0065_snapshot.json
Normal 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
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "dokploy",
|
"name": "dokploy",
|
||||||
"version": "v0.18.0",
|
"version": "v0.18.4",
|
||||||
"private": true,
|
"private": true,
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ import {
|
|||||||
import { ProjectLayout } from "@/components/layouts/project-layout";
|
import { ProjectLayout } from "@/components/layouts/project-layout";
|
||||||
import { BreadcrumbSidebar } from "@/components/shared/breadcrumb-sidebar";
|
import { BreadcrumbSidebar } from "@/components/shared/breadcrumb-sidebar";
|
||||||
import { DateTooltip } from "@/components/shared/date-tooltip";
|
import { DateTooltip } from "@/components/shared/date-tooltip";
|
||||||
|
import { DialogAction } from "@/components/shared/dialog-action";
|
||||||
import { StatusTooltip } from "@/components/shared/status-tooltip";
|
import { StatusTooltip } from "@/components/shared/status-tooltip";
|
||||||
import { Button } from "@/components/ui/button";
|
import { Button } from "@/components/ui/button";
|
||||||
import {
|
import {
|
||||||
@@ -23,6 +24,7 @@ import {
|
|||||||
CardHeader,
|
CardHeader,
|
||||||
CardTitle,
|
CardTitle,
|
||||||
} from "@/components/ui/card";
|
} from "@/components/ui/card";
|
||||||
|
import { Checkbox } from "@/components/ui/checkbox";
|
||||||
import {
|
import {
|
||||||
Command,
|
Command,
|
||||||
CommandEmpty,
|
CommandEmpty,
|
||||||
@@ -50,21 +52,26 @@ import type { findProjectById } from "@dokploy/server";
|
|||||||
import { validateRequest } from "@dokploy/server";
|
import { validateRequest } from "@dokploy/server";
|
||||||
import { createServerSideHelpers } from "@trpc/react-query/server";
|
import { createServerSideHelpers } from "@trpc/react-query/server";
|
||||||
import {
|
import {
|
||||||
|
Ban,
|
||||||
|
Check,
|
||||||
|
CheckCircle2,
|
||||||
|
ChevronsUpDown,
|
||||||
CircuitBoard,
|
CircuitBoard,
|
||||||
FolderInput,
|
FolderInput,
|
||||||
GlobeIcon,
|
GlobeIcon,
|
||||||
Loader2,
|
Loader2,
|
||||||
PlusIcon,
|
PlusIcon,
|
||||||
Search,
|
Search,
|
||||||
|
X,
|
||||||
} from "lucide-react";
|
} from "lucide-react";
|
||||||
import { Check, ChevronsUpDown, X } from "lucide-react";
|
|
||||||
import type {
|
import type {
|
||||||
GetServerSidePropsContext,
|
GetServerSidePropsContext,
|
||||||
InferGetServerSidePropsType,
|
InferGetServerSidePropsType,
|
||||||
} from "next";
|
} from "next";
|
||||||
import Head from "next/head";
|
import Head from "next/head";
|
||||||
import { useRouter } from "next/router";
|
import { useRouter } from "next/router";
|
||||||
import React, { useMemo, useState, type ReactElement } from "react";
|
import { type ReactElement, useMemo, useState } from "react";
|
||||||
|
import { toast } from "sonner";
|
||||||
import superjson from "superjson";
|
import superjson from "superjson";
|
||||||
|
|
||||||
export type Services = {
|
export type Services = {
|
||||||
@@ -191,6 +198,7 @@ export const extractServices = (data: Project | undefined) => {
|
|||||||
const Project = (
|
const Project = (
|
||||||
props: InferGetServerSidePropsType<typeof getServerSideProps>,
|
props: InferGetServerSidePropsType<typeof getServerSideProps>,
|
||||||
) => {
|
) => {
|
||||||
|
const [isBulkActionLoading, setIsBulkActionLoading] = useState(false);
|
||||||
const { projectId } = props;
|
const { projectId } = props;
|
||||||
const { data: auth } = api.auth.get.useQuery();
|
const { data: auth } = api.auth.get.useQuery();
|
||||||
const { data: user } = api.user.byAuthId.useQuery(
|
const { data: user } = api.user.byAuthId.useQuery(
|
||||||
@@ -201,7 +209,7 @@ const Project = (
|
|||||||
enabled: !!auth?.id && auth?.rol === "user",
|
enabled: !!auth?.id && auth?.rol === "user",
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
const { data, isLoading } = api.project.one.useQuery({ projectId });
|
const { data, isLoading, refetch } = api.project.one.useQuery({ projectId });
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
|
|
||||||
const emptyServices =
|
const emptyServices =
|
||||||
@@ -228,6 +236,70 @@ const Project = (
|
|||||||
|
|
||||||
const [selectedTypes, setSelectedTypes] = useState<string[]>([]);
|
const [selectedTypes, setSelectedTypes] = useState<string[]>([]);
|
||||||
const [openCombobox, setOpenCombobox] = useState(false);
|
const [openCombobox, setOpenCombobox] = useState(false);
|
||||||
|
const [selectedServices, setSelectedServices] = useState<string[]>([]);
|
||||||
|
const [isDropdownOpen, setIsDropdownOpen] = useState(false);
|
||||||
|
|
||||||
|
const handleSelectAll = () => {
|
||||||
|
if (selectedServices.length === filteredServices.length) {
|
||||||
|
setSelectedServices([]);
|
||||||
|
} else {
|
||||||
|
setSelectedServices(filteredServices.map((service) => service.id));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleServiceSelect = (serviceId: string, event: React.MouseEvent) => {
|
||||||
|
event.stopPropagation();
|
||||||
|
setSelectedServices((prev) =>
|
||||||
|
prev.includes(serviceId)
|
||||||
|
? prev.filter((id) => id !== serviceId)
|
||||||
|
: [...prev, serviceId],
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
const composeActions = {
|
||||||
|
start: api.compose.start.useMutation(),
|
||||||
|
stop: api.compose.stop.useMutation(),
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleBulkStart = async () => {
|
||||||
|
let success = 0;
|
||||||
|
setIsBulkActionLoading(true);
|
||||||
|
for (const serviceId of selectedServices) {
|
||||||
|
try {
|
||||||
|
await composeActions.start.mutateAsync({ composeId: serviceId });
|
||||||
|
success++;
|
||||||
|
} catch (error) {
|
||||||
|
toast.error(`Error starting service ${serviceId}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (success > 0) {
|
||||||
|
toast.success(`${success} services started successfully`);
|
||||||
|
refetch();
|
||||||
|
}
|
||||||
|
setIsBulkActionLoading(false);
|
||||||
|
setSelectedServices([]);
|
||||||
|
setIsDropdownOpen(false);
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleBulkStop = async () => {
|
||||||
|
let success = 0;
|
||||||
|
setIsBulkActionLoading(true);
|
||||||
|
for (const serviceId of selectedServices) {
|
||||||
|
try {
|
||||||
|
await composeActions.stop.mutateAsync({ composeId: serviceId });
|
||||||
|
success++;
|
||||||
|
} catch (error) {
|
||||||
|
toast.error(`Error stopping service ${serviceId}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (success > 0) {
|
||||||
|
toast.success(`${success} services stopped successfully`);
|
||||||
|
refetch();
|
||||||
|
}
|
||||||
|
setSelectedServices([]);
|
||||||
|
setIsDropdownOpen(false);
|
||||||
|
setIsBulkActionLoading(false);
|
||||||
|
};
|
||||||
|
|
||||||
const filteredServices = useMemo(() => {
|
const filteredServices = useMemo(() => {
|
||||||
if (!applications) return [];
|
if (!applications) return [];
|
||||||
@@ -309,78 +381,151 @@ const Project = (
|
|||||||
</div>
|
</div>
|
||||||
) : (
|
) : (
|
||||||
<>
|
<>
|
||||||
<div className="flex flex-row gap-2 items-center">
|
<div className="flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between">
|
||||||
<div className="w-full relative">
|
<div className="flex items-center gap-4">
|
||||||
<Input
|
<div className="flex items-center gap-2">
|
||||||
placeholder="Filter services..."
|
<Checkbox
|
||||||
value={searchQuery}
|
checked={selectedServices.length > 0}
|
||||||
onChange={(e) => setSearchQuery(e.target.value)}
|
className={cn(
|
||||||
className="pr-10"
|
"data-[state=checked]:bg-primary",
|
||||||
/>
|
selectedServices.length > 0 &&
|
||||||
<Search className="absolute right-3 top-1/2 -translate-y-1/2 size-4 text-muted-foreground" />
|
selectedServices.length <
|
||||||
|
filteredServices.length &&
|
||||||
|
"bg-primary/50",
|
||||||
|
)}
|
||||||
|
onCheckedChange={handleSelectAll}
|
||||||
|
/>
|
||||||
|
<span className="text-sm">
|
||||||
|
Select All{" "}
|
||||||
|
{selectedServices.length > 0 &&
|
||||||
|
`(${selectedServices.length}/${filteredServices.length})`}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<DropdownMenu
|
||||||
|
open={isDropdownOpen}
|
||||||
|
onOpenChange={setIsDropdownOpen}
|
||||||
|
>
|
||||||
|
<DropdownMenuTrigger asChild>
|
||||||
|
<Button
|
||||||
|
variant="outline"
|
||||||
|
disabled={selectedServices.length === 0}
|
||||||
|
isLoading={isBulkActionLoading}
|
||||||
|
>
|
||||||
|
Bulk Actions
|
||||||
|
</Button>
|
||||||
|
</DropdownMenuTrigger>
|
||||||
|
<DropdownMenuContent align="end">
|
||||||
|
<DropdownMenuLabel>Actions</DropdownMenuLabel>
|
||||||
|
<DropdownMenuSeparator />
|
||||||
|
<DialogAction
|
||||||
|
title="Start Services"
|
||||||
|
description={`Are you sure you want to start ${selectedServices.length} services?`}
|
||||||
|
type="default"
|
||||||
|
onClick={handleBulkStart}
|
||||||
|
>
|
||||||
|
<Button
|
||||||
|
variant="ghost"
|
||||||
|
className="w-full justify-start"
|
||||||
|
>
|
||||||
|
<CheckCircle2 className="mr-2 h-4 w-4" />
|
||||||
|
Start
|
||||||
|
</Button>
|
||||||
|
</DialogAction>
|
||||||
|
<DialogAction
|
||||||
|
title="Stop Services"
|
||||||
|
description={`Are you sure you want to stop ${selectedServices.length} services?`}
|
||||||
|
type="destructive"
|
||||||
|
onClick={handleBulkStop}
|
||||||
|
>
|
||||||
|
<Button
|
||||||
|
variant="ghost"
|
||||||
|
className="w-full justify-start text-destructive"
|
||||||
|
>
|
||||||
|
<Ban className="mr-2 h-4 w-4" />
|
||||||
|
Stop
|
||||||
|
</Button>
|
||||||
|
</DialogAction>
|
||||||
|
</DropdownMenuContent>
|
||||||
|
</DropdownMenu>
|
||||||
</div>
|
</div>
|
||||||
<Popover open={openCombobox} onOpenChange={setOpenCombobox}>
|
|
||||||
<PopoverTrigger asChild>
|
<div className="flex flex-col gap-2 sm:flex-row sm:gap-4 sm:items-center">
|
||||||
<Button
|
<div className="w-full relative">
|
||||||
variant="outline"
|
<Input
|
||||||
aria-expanded={openCombobox}
|
placeholder="Filter services..."
|
||||||
className="min-w-[200px] justify-between"
|
value={searchQuery}
|
||||||
>
|
onChange={(e) => setSearchQuery(e.target.value)}
|
||||||
{selectedTypes.length === 0
|
className="pr-10"
|
||||||
? "Select types..."
|
/>
|
||||||
: `${selectedTypes.length} selected`}
|
<Search className="absolute right-3 top-1/2 -translate-y-1/2 size-4 text-muted-foreground" />
|
||||||
<ChevronsUpDown className="ml-2 h-4 w-4 shrink-0 opacity-50" />
|
</div>
|
||||||
</Button>
|
<Popover
|
||||||
</PopoverTrigger>
|
open={openCombobox}
|
||||||
<PopoverContent className="w-[200px] p-0">
|
onOpenChange={setOpenCombobox}
|
||||||
<Command>
|
>
|
||||||
<CommandInput placeholder="Search type..." />
|
<PopoverTrigger asChild>
|
||||||
<CommandEmpty>No type found.</CommandEmpty>
|
<Button
|
||||||
<CommandGroup>
|
variant="outline"
|
||||||
{serviceTypes.map((type) => (
|
aria-expanded={openCombobox}
|
||||||
|
className="min-w-[200px] justify-between"
|
||||||
|
>
|
||||||
|
{selectedTypes.length === 0
|
||||||
|
? "Select types..."
|
||||||
|
: `${selectedTypes.length} selected`}
|
||||||
|
<ChevronsUpDown className="ml-2 h-4 w-4 shrink-0 opacity-50" />
|
||||||
|
</Button>
|
||||||
|
</PopoverTrigger>
|
||||||
|
<PopoverContent className="w-[200px] p-0">
|
||||||
|
<Command>
|
||||||
|
<CommandInput placeholder="Search type..." />
|
||||||
|
<CommandEmpty>No type found.</CommandEmpty>
|
||||||
|
<CommandGroup>
|
||||||
|
{serviceTypes.map((type) => (
|
||||||
|
<CommandItem
|
||||||
|
key={type.value}
|
||||||
|
onSelect={() => {
|
||||||
|
setSelectedTypes((prev) =>
|
||||||
|
prev.includes(type.value)
|
||||||
|
? prev.filter((t) => t !== type.value)
|
||||||
|
: [...prev, type.value],
|
||||||
|
);
|
||||||
|
setOpenCombobox(false);
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<div className="flex flex-row">
|
||||||
|
<Check
|
||||||
|
className={cn(
|
||||||
|
"mr-2 h-4 w-4",
|
||||||
|
selectedTypes.includes(type.value)
|
||||||
|
? "opacity-100"
|
||||||
|
: "opacity-0",
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
{type.icon && (
|
||||||
|
<type.icon className="mr-2 h-4 w-4" />
|
||||||
|
)}
|
||||||
|
{type.label}
|
||||||
|
</div>
|
||||||
|
</CommandItem>
|
||||||
|
))}
|
||||||
<CommandItem
|
<CommandItem
|
||||||
key={type.value}
|
|
||||||
onSelect={() => {
|
onSelect={() => {
|
||||||
setSelectedTypes((prev) =>
|
setSelectedTypes([]);
|
||||||
prev.includes(type.value)
|
|
||||||
? prev.filter((t) => t !== type.value)
|
|
||||||
: [...prev, type.value],
|
|
||||||
);
|
|
||||||
setOpenCombobox(false);
|
setOpenCombobox(false);
|
||||||
}}
|
}}
|
||||||
|
className="border-t"
|
||||||
>
|
>
|
||||||
<div className="flex flex-row">
|
<div className="flex flex-row items-center">
|
||||||
<Check
|
<X className="mr-2 h-4 w-4" />
|
||||||
className={cn(
|
Clear filters
|
||||||
"mr-2 h-4 w-4",
|
|
||||||
selectedTypes.includes(type.value)
|
|
||||||
? "opacity-100"
|
|
||||||
: "opacity-0",
|
|
||||||
)}
|
|
||||||
/>
|
|
||||||
{type.icon && (
|
|
||||||
<type.icon className="mr-2 h-4 w-4" />
|
|
||||||
)}
|
|
||||||
{type.label}
|
|
||||||
</div>
|
</div>
|
||||||
</CommandItem>
|
</CommandItem>
|
||||||
))}
|
</CommandGroup>
|
||||||
<CommandItem
|
</Command>
|
||||||
onSelect={() => {
|
</PopoverContent>
|
||||||
setSelectedTypes([]);
|
</Popover>
|
||||||
setOpenCombobox(false);
|
</div>
|
||||||
}}
|
|
||||||
className="border-t"
|
|
||||||
>
|
|
||||||
<div className="flex flex-row items-center">
|
|
||||||
<X className="mr-2 h-4 w-4" />
|
|
||||||
Clear filters
|
|
||||||
</div>
|
|
||||||
</CommandItem>
|
|
||||||
</CommandGroup>
|
|
||||||
</Command>
|
|
||||||
</PopoverContent>
|
|
||||||
</Popover>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="flex w-full gap-8">
|
<div className="flex w-full gap-8">
|
||||||
@@ -418,6 +563,27 @@ const Project = (
|
|||||||
<StatusTooltip status={service.status} />
|
<StatusTooltip status={service.status} />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div
|
||||||
|
className={cn(
|
||||||
|
"absolute -left-3 -bottom-3 size-9 translate-y-1 rounded-full p-0 transition-all duration-200 z-10 bg-background border",
|
||||||
|
selectedServices.includes(service.id)
|
||||||
|
? "opacity-100 translate-y-0"
|
||||||
|
: "opacity-0 group-hover:translate-y-0 group-hover:opacity-100",
|
||||||
|
)}
|
||||||
|
onClick={(e) =>
|
||||||
|
handleServiceSelect(service.id, e)
|
||||||
|
}
|
||||||
|
>
|
||||||
|
<div className="h-full w-full flex items-center justify-center">
|
||||||
|
<Checkbox
|
||||||
|
checked={selectedServices.includes(
|
||||||
|
service.id,
|
||||||
|
)}
|
||||||
|
className="data-[state=checked]:bg-primary"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<CardHeader>
|
<CardHeader>
|
||||||
<CardTitle className="flex items-center justify-between">
|
<CardTitle className="flex items-center justify-between">
|
||||||
<div className="flex flex-row items-center gap-2 justify-between w-full">
|
<div className="flex flex-row items-center gap-2 justify-between w-full">
|
||||||
|
|||||||
9
apps/dokploy/public/templates/appwrite.svg
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<svg class="max-w-full" xmlns="http://www.w3.org/2000/svg" width="112" height="98" viewBox="0 0 112 98"
|
||||||
|
fill="none">
|
||||||
|
<path
|
||||||
|
d="M111.1 73.4729V97.9638H48.8706C30.7406 97.9638 14.9105 88.114 6.44112 73.4729C5.2099 71.3444 4.13229 69.1113 3.22835 66.7935C1.45387 62.2516 0.338421 57.3779 0 52.2926V45.6712C0.0734729 44.5379 0.189248 43.4135 0.340647 42.3025C0.650124 40.0227 1.11768 37.7918 1.73218 35.6232C7.54544 15.0641 26.448 0 48.8706 0C71.2932 0 90.1935 15.0641 96.0068 35.6232H69.3985C65.0302 28.9216 57.4692 24.491 48.8706 24.491C40.272 24.491 32.711 28.9216 28.3427 35.6232C27.0113 37.6604 25.9782 39.9069 25.3014 42.3025C24.7002 44.4266 24.3796 46.6664 24.3796 48.9819C24.3796 56.0019 27.3319 62.3295 32.0653 66.7935C36.4515 70.9369 42.3649 73.4729 48.8706 73.4729H111.1Z"
|
||||||
|
fill="#FD366E" />
|
||||||
|
<path
|
||||||
|
d="M111.1 42.3027V66.7937H65.6759C70.4094 62.3297 73.3616 56.0021 73.3616 48.9821C73.3616 46.6666 73.041 44.4268 72.4399 42.3027H111.1Z"
|
||||||
|
fill="#FD366E" />
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 986 B |
5
apps/dokploy/public/templates/convex.svg
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
<svg width="184" height="188" viewBox="0 0 184 188" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M108.092 130.021C126.258 128.003 143.385 118.323 152.815 102.167C148.349 142.128 104.653 167.385 68.9858 151.878C65.6992 150.453 62.8702 148.082 60.9288 145.034C52.9134 132.448 50.2786 116.433 54.0644 101.899C64.881 120.567 86.8748 132.01 108.092 130.021Z" fill="#F3B01C"/>
|
||||||
|
<path d="M53.4012 90.1735C46.0375 107.191 45.7186 127.114 54.7463 143.51C22.9759 119.608 23.3226 68.4578 54.358 44.7949C57.2286 42.6078 60.64 41.3097 64.2178 41.1121C78.9312 40.336 93.8804 46.0225 104.364 56.6193C83.0637 56.831 62.318 70.4756 53.4012 90.1735Z" fill="#8D2676"/>
|
||||||
|
<path d="M114.637 61.8552C103.89 46.8701 87.0686 36.6684 68.6387 36.358C104.264 20.1876 148.085 46.4045 152.856 85.1654C153.3 88.7635 152.717 92.4322 151.122 95.6775C144.466 109.195 132.124 119.679 117.702 123.559C128.269 103.96 126.965 80.0151 114.637 61.8552Z" fill="#EE342F"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 948 B |
5
apps/dokploy/public/templates/frappe-hr.svg
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
<svg width="101" height="101" viewBox="0 0 101 101" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M72.2667 0.422852H29.4096C13.63 0.422852 0.838135 13.2147 0.838135 28.9943V71.8514C0.838135 87.631 13.63 100.423 29.4096 100.423H72.2667C88.0463 100.423 100.838 87.631 100.838 71.8514V28.9943C100.838 13.2147 88.0463 0.422852 72.2667 0.422852Z" fill="#06B58B"/>
|
||||||
|
<path d="M31.1592 78.9948L26.3379 73.7091C33.0879 67.602 41.7664 64.209 50.8021 64.209C59.8378 64.209 68.5522 67.5662 75.2665 73.7091L70.4449 78.9948C65.0164 74.0662 58.0521 71.3518 50.8021 71.3518C43.5521 71.3518 36.5523 74.0662 31.1237 78.9948H31.1592Z" fill="white"/>
|
||||||
|
<path d="M54.1236 21.8516H33.1948V28.9944H54.1236C58.0521 28.9944 61.2664 32.2087 61.2664 36.1373V42.7801C61.2664 46.7087 58.0521 49.9229 54.1236 49.9229H47.4805C43.552 49.9229 40.3377 46.7087 40.3377 42.7801V38.28H33.1948V42.7801C33.1948 50.6729 39.5877 57.0658 47.4805 57.0658H54.1236C62.0164 57.0658 68.4093 50.6729 68.4093 42.7801V36.1373C68.4093 28.2444 62.0164 21.8516 54.1236 21.8516Z" fill="white"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.0 KiB |
BIN
apps/dokploy/public/templates/outline.png
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
BIN
apps/dokploy/public/templates/registry.png
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
apps/dokploy/public/templates/trilium.png
Normal file
|
After Width: | Height: | Size: 24 KiB |
@@ -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") {
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
887
apps/dokploy/templates/appwrite/docker-compose.yml
Normal file
@@ -0,0 +1,887 @@
|
|||||||
|
version: "3.8"
|
||||||
|
|
||||||
|
x-logging: &x-logging
|
||||||
|
logging:
|
||||||
|
driver: "json-file"
|
||||||
|
options:
|
||||||
|
max-file: "5"
|
||||||
|
max-size: "10m"
|
||||||
|
|
||||||
|
services:
|
||||||
|
appwrite:
|
||||||
|
image: appwrite/appwrite:1.6.0
|
||||||
|
container_name: appwrite
|
||||||
|
<<: *x-logging
|
||||||
|
restart: unless-stopped
|
||||||
|
networks:
|
||||||
|
- dokploy-network
|
||||||
|
labels:
|
||||||
|
- traefik.enable=true
|
||||||
|
- traefik.constraint-label-stack=appwrite
|
||||||
|
volumes:
|
||||||
|
- appwrite-uploads:/storage/uploads:rw
|
||||||
|
- appwrite-cache:/storage/cache:rw
|
||||||
|
- appwrite-config:/storage/config:rw
|
||||||
|
- appwrite-certificates:/storage/certificates:rw
|
||||||
|
- appwrite-functions:/storage/functions:rw
|
||||||
|
depends_on:
|
||||||
|
- mariadb
|
||||||
|
- redis
|
||||||
|
environment:
|
||||||
|
- _APP_ENV
|
||||||
|
- _APP_WORKER_PER_CORE
|
||||||
|
- _APP_LOCALE
|
||||||
|
- _APP_CONSOLE_WHITELIST_ROOT
|
||||||
|
- _APP_CONSOLE_WHITELIST_EMAILS
|
||||||
|
- _APP_CONSOLE_SESSION_ALERTS
|
||||||
|
- _APP_CONSOLE_WHITELIST_IPS
|
||||||
|
- _APP_CONSOLE_HOSTNAMES
|
||||||
|
- _APP_SYSTEM_EMAIL_NAME
|
||||||
|
- _APP_SYSTEM_EMAIL_ADDRESS
|
||||||
|
- _APP_EMAIL_SECURITY
|
||||||
|
- _APP_SYSTEM_RESPONSE_FORMAT
|
||||||
|
- _APP_OPTIONS_ABUSE
|
||||||
|
- _APP_OPTIONS_ROUTER_PROTECTION
|
||||||
|
- _APP_OPTIONS_FORCE_HTTPS
|
||||||
|
- _APP_OPTIONS_FUNCTIONS_FORCE_HTTPS
|
||||||
|
- _APP_OPENSSL_KEY_V1
|
||||||
|
- _APP_DOMAIN
|
||||||
|
- _APP_DOMAIN_TARGET
|
||||||
|
- _APP_DOMAIN_FUNCTIONS
|
||||||
|
- _APP_REDIS_HOST
|
||||||
|
- _APP_REDIS_PORT
|
||||||
|
- _APP_REDIS_USER
|
||||||
|
- _APP_REDIS_PASS
|
||||||
|
- _APP_DB_HOST
|
||||||
|
- _APP_DB_PORT
|
||||||
|
- _APP_DB_SCHEMA
|
||||||
|
- _APP_DB_USER
|
||||||
|
- _APP_DB_PASS
|
||||||
|
- _APP_SMTP_HOST
|
||||||
|
- _APP_SMTP_PORT
|
||||||
|
- _APP_SMTP_SECURE
|
||||||
|
- _APP_SMTP_USERNAME
|
||||||
|
- _APP_SMTP_PASSWORD
|
||||||
|
- _APP_USAGE_STATS
|
||||||
|
- _APP_STORAGE_LIMIT
|
||||||
|
- _APP_STORAGE_PREVIEW_LIMIT
|
||||||
|
- _APP_STORAGE_ANTIVIRUS
|
||||||
|
- _APP_STORAGE_ANTIVIRUS_HOST
|
||||||
|
- _APP_STORAGE_ANTIVIRUS_PORT
|
||||||
|
- _APP_STORAGE_DEVICE
|
||||||
|
- _APP_STORAGE_S3_ACCESS_KEY
|
||||||
|
- _APP_STORAGE_S3_SECRET
|
||||||
|
- _APP_STORAGE_S3_REGION
|
||||||
|
- _APP_STORAGE_S3_BUCKET
|
||||||
|
- _APP_STORAGE_DO_SPACES_ACCESS_KEY
|
||||||
|
- _APP_STORAGE_DO_SPACES_SECRET
|
||||||
|
- _APP_STORAGE_DO_SPACES_REGION
|
||||||
|
- _APP_STORAGE_DO_SPACES_BUCKET
|
||||||
|
- _APP_STORAGE_BACKBLAZE_ACCESS_KEY
|
||||||
|
- _APP_STORAGE_BACKBLAZE_SECRET
|
||||||
|
- _APP_STORAGE_BACKBLAZE_REGION
|
||||||
|
- _APP_STORAGE_BACKBLAZE_BUCKET
|
||||||
|
- _APP_STORAGE_LINODE_ACCESS_KEY
|
||||||
|
- _APP_STORAGE_LINODE_SECRET
|
||||||
|
- _APP_STORAGE_LINODE_REGION
|
||||||
|
- _APP_STORAGE_LINODE_BUCKET
|
||||||
|
- _APP_STORAGE_WASABI_ACCESS_KEY
|
||||||
|
- _APP_STORAGE_WASABI_SECRET
|
||||||
|
- _APP_STORAGE_WASABI_REGION
|
||||||
|
- _APP_STORAGE_WASABI_BUCKET
|
||||||
|
- _APP_FUNCTIONS_SIZE_LIMIT
|
||||||
|
- _APP_FUNCTIONS_TIMEOUT
|
||||||
|
- _APP_FUNCTIONS_BUILD_TIMEOUT
|
||||||
|
- _APP_FUNCTIONS_CPUS
|
||||||
|
- _APP_FUNCTIONS_MEMORY
|
||||||
|
- _APP_FUNCTIONS_RUNTIMES
|
||||||
|
- _APP_EXECUTOR_SECRET
|
||||||
|
- _APP_EXECUTOR_HOST
|
||||||
|
- _APP_LOGGING_CONFIG
|
||||||
|
- _APP_MAINTENANCE_INTERVAL
|
||||||
|
- _APP_MAINTENANCE_DELAY
|
||||||
|
- _APP_MAINTENANCE_RETENTION_EXECUTION
|
||||||
|
- _APP_MAINTENANCE_RETENTION_CACHE
|
||||||
|
- _APP_MAINTENANCE_RETENTION_ABUSE
|
||||||
|
- _APP_MAINTENANCE_RETENTION_AUDIT
|
||||||
|
- _APP_MAINTENANCE_RETENTION_USAGE_HOURLY
|
||||||
|
- _APP_MAINTENANCE_RETENTION_SCHEDULES
|
||||||
|
- _APP_SMS_PROVIDER
|
||||||
|
- _APP_SMS_FROM
|
||||||
|
- _APP_GRAPHQL_MAX_BATCH_SIZE
|
||||||
|
- _APP_GRAPHQL_MAX_COMPLEXITY
|
||||||
|
- _APP_GRAPHQL_MAX_DEPTH
|
||||||
|
- _APP_VCS_GITHUB_APP_NAME
|
||||||
|
- _APP_VCS_GITHUB_PRIVATE_KEY
|
||||||
|
- _APP_VCS_GITHUB_APP_ID
|
||||||
|
- _APP_VCS_GITHUB_WEBHOOK_SECRET
|
||||||
|
- _APP_VCS_GITHUB_CLIENT_SECRET
|
||||||
|
- _APP_VCS_GITHUB_CLIENT_ID
|
||||||
|
- _APP_MIGRATIONS_FIREBASE_CLIENT_ID
|
||||||
|
- _APP_MIGRATIONS_FIREBASE_CLIENT_SECRET
|
||||||
|
- _APP_ASSISTANT_OPENAI_API_KEY
|
||||||
|
|
||||||
|
appwrite-console:
|
||||||
|
image: appwrite/console:5.0.12
|
||||||
|
container_name: appwrite-console
|
||||||
|
<<: *x-logging
|
||||||
|
restart: unless-stopped
|
||||||
|
networks:
|
||||||
|
- dokploy-network
|
||||||
|
labels:
|
||||||
|
- "traefik.enable=true"
|
||||||
|
- "traefik.constraint-label-stack=appwrite"
|
||||||
|
environment:
|
||||||
|
- _APP_ENV
|
||||||
|
- _APP_WORKER_PER_CORE
|
||||||
|
- _APP_LOCALE
|
||||||
|
- _APP_CONSOLE_WHITELIST_ROOT
|
||||||
|
- _APP_CONSOLE_WHITELIST_EMAILS
|
||||||
|
- _APP_CONSOLE_SESSION_ALERTS
|
||||||
|
- _APP_CONSOLE_WHITELIST_IPS
|
||||||
|
- _APP_CONSOLE_HOSTNAMES
|
||||||
|
- _APP_SYSTEM_EMAIL_NAME
|
||||||
|
- _APP_SYSTEM_EMAIL_ADDRESS
|
||||||
|
- _APP_EMAIL_SECURITY
|
||||||
|
- _APP_SYSTEM_RESPONSE_FORMAT
|
||||||
|
- _APP_OPTIONS_ABUSE
|
||||||
|
- _APP_OPTIONS_ROUTER_PROTECTION
|
||||||
|
- _APP_OPTIONS_FORCE_HTTPS
|
||||||
|
- _APP_OPTIONS_FUNCTIONS_FORCE_HTTPS
|
||||||
|
- _APP_OPENSSL_KEY_V1
|
||||||
|
- _APP_DOMAIN
|
||||||
|
- _APP_DOMAIN_TARGET
|
||||||
|
- _APP_DOMAIN_FUNCTIONS
|
||||||
|
- _APP_REDIS_HOST
|
||||||
|
- _APP_REDIS_PORT
|
||||||
|
- _APP_REDIS_USER
|
||||||
|
- _APP_REDIS_PASS
|
||||||
|
- _APP_DB_HOST
|
||||||
|
- _APP_DB_PORT
|
||||||
|
- _APP_DB_SCHEMA
|
||||||
|
- _APP_DB_USER
|
||||||
|
- _APP_DB_PASS
|
||||||
|
- _APP_SMTP_HOST
|
||||||
|
- _APP_SMTP_PORT
|
||||||
|
- _APP_SMTP_SECURE
|
||||||
|
- _APP_SMTP_USERNAME
|
||||||
|
- _APP_SMTP_PASSWORD
|
||||||
|
- _APP_USAGE_STATS
|
||||||
|
- _APP_STORAGE_LIMIT
|
||||||
|
- _APP_STORAGE_PREVIEW_LIMIT
|
||||||
|
- _APP_STORAGE_ANTIVIRUS
|
||||||
|
- _APP_STORAGE_ANTIVIRUS_HOST
|
||||||
|
- _APP_STORAGE_ANTIVIRUS_PORT
|
||||||
|
- _APP_STORAGE_DEVICE
|
||||||
|
- _APP_STORAGE_S3_ACCESS_KEY
|
||||||
|
- _APP_STORAGE_S3_SECRET
|
||||||
|
- _APP_STORAGE_S3_REGION
|
||||||
|
- _APP_STORAGE_S3_BUCKET
|
||||||
|
- _APP_STORAGE_DO_SPACES_ACCESS_KEY
|
||||||
|
- _APP_STORAGE_DO_SPACES_SECRET
|
||||||
|
- _APP_STORAGE_DO_SPACES_REGION
|
||||||
|
- _APP_STORAGE_DO_SPACES_BUCKET
|
||||||
|
- _APP_STORAGE_BACKBLAZE_ACCESS_KEY
|
||||||
|
- _APP_STORAGE_BACKBLAZE_SECRET
|
||||||
|
- _APP_STORAGE_BACKBLAZE_REGION
|
||||||
|
- _APP_STORAGE_BACKBLAZE_BUCKET
|
||||||
|
- _APP_STORAGE_LINODE_ACCESS_KEY
|
||||||
|
- _APP_STORAGE_LINODE_SECRET
|
||||||
|
- _APP_STORAGE_LINODE_REGION
|
||||||
|
- _APP_STORAGE_LINODE_BUCKET
|
||||||
|
- _APP_STORAGE_WASABI_ACCESS_KEY
|
||||||
|
- _APP_STORAGE_WASABI_SECRET
|
||||||
|
- _APP_STORAGE_WASABI_REGION
|
||||||
|
- _APP_STORAGE_WASABI_BUCKET
|
||||||
|
|
||||||
|
appwrite-realtime:
|
||||||
|
image: appwrite/appwrite:1.6.0
|
||||||
|
entrypoint: realtime
|
||||||
|
container_name: appwrite-realtime
|
||||||
|
<<: *x-logging
|
||||||
|
restart: unless-stopped
|
||||||
|
networks:
|
||||||
|
- dokploy-network
|
||||||
|
depends_on:
|
||||||
|
- mariadb
|
||||||
|
- redis
|
||||||
|
labels:
|
||||||
|
- "traefik.enable=true"
|
||||||
|
- "traefik.constraint-label-stack=appwrite"
|
||||||
|
environment:
|
||||||
|
- _APP_ENV
|
||||||
|
- _APP_WORKER_PER_CORE
|
||||||
|
- _APP_OPTIONS_ABUSE
|
||||||
|
- _APP_OPTIONS_ROUTER_PROTECTION
|
||||||
|
- _APP_OPENSSL_KEY_V1
|
||||||
|
- _APP_REDIS_HOST
|
||||||
|
- _APP_REDIS_PORT
|
||||||
|
- _APP_REDIS_USER
|
||||||
|
- _APP_REDIS_PASS
|
||||||
|
- _APP_DB_HOST
|
||||||
|
- _APP_DB_PORT
|
||||||
|
- _APP_DB_SCHEMA
|
||||||
|
- _APP_DB_USER
|
||||||
|
- _APP_DB_PASS
|
||||||
|
- _APP_USAGE_STATS
|
||||||
|
- _APP_LOGGING_CONFIG
|
||||||
|
|
||||||
|
appwrite-worker-audits:
|
||||||
|
image: appwrite/appwrite:1.6.0
|
||||||
|
entrypoint: worker-audits
|
||||||
|
<<: *x-logging
|
||||||
|
container_name: appwrite-worker-audits
|
||||||
|
restart: unless-stopped
|
||||||
|
networks:
|
||||||
|
- dokploy-network
|
||||||
|
depends_on:
|
||||||
|
- redis
|
||||||
|
- mariadb
|
||||||
|
environment:
|
||||||
|
- _APP_ENV
|
||||||
|
- _APP_WORKER_PER_CORE
|
||||||
|
- _APP_OPENSSL_KEY_V1
|
||||||
|
- _APP_REDIS_HOST
|
||||||
|
- _APP_REDIS_PORT
|
||||||
|
- _APP_REDIS_USER
|
||||||
|
- _APP_REDIS_PASS
|
||||||
|
- _APP_DB_HOST
|
||||||
|
- _APP_DB_PORT
|
||||||
|
- _APP_DB_SCHEMA
|
||||||
|
- _APP_DB_USER
|
||||||
|
- _APP_DB_PASS
|
||||||
|
- _APP_LOGGING_CONFIG
|
||||||
|
|
||||||
|
appwrite-worker-webhooks:
|
||||||
|
image: appwrite/appwrite:1.6.0
|
||||||
|
entrypoint: worker-webhooks
|
||||||
|
<<: *x-logging
|
||||||
|
container_name: appwrite-worker-webhooks
|
||||||
|
restart: unless-stopped
|
||||||
|
networks:
|
||||||
|
- dokploy-network
|
||||||
|
depends_on:
|
||||||
|
- redis
|
||||||
|
- mariadb
|
||||||
|
environment:
|
||||||
|
- _APP_ENV
|
||||||
|
- _APP_WORKER_PER_CORE
|
||||||
|
- _APP_OPENSSL_KEY_V1
|
||||||
|
- _APP_EMAIL_SECURITY
|
||||||
|
- _APP_SYSTEM_SECURITY_EMAIL_ADDRESS
|
||||||
|
- _APP_DB_HOST
|
||||||
|
- _APP_DB_PORT
|
||||||
|
- _APP_DB_SCHEMA
|
||||||
|
- _APP_DB_USER
|
||||||
|
- _APP_DB_PASS
|
||||||
|
- _APP_REDIS_HOST
|
||||||
|
- _APP_REDIS_PORT
|
||||||
|
- _APP_REDIS_USER
|
||||||
|
- _APP_REDIS_PASS
|
||||||
|
- _APP_LOGGING_CONFIG
|
||||||
|
|
||||||
|
appwrite-worker-deletes:
|
||||||
|
image: appwrite/appwrite:1.6.0
|
||||||
|
entrypoint: worker-deletes
|
||||||
|
<<: *x-logging
|
||||||
|
container_name: appwrite-worker-deletes
|
||||||
|
restart: unless-stopped
|
||||||
|
networks:
|
||||||
|
- dokploy-network
|
||||||
|
depends_on:
|
||||||
|
- redis
|
||||||
|
- mariadb
|
||||||
|
volumes:
|
||||||
|
- appwrite-uploads:/storage/uploads:rw
|
||||||
|
- appwrite-cache:/storage/cache:rw
|
||||||
|
- appwrite-functions:/storage/functions:rw
|
||||||
|
- appwrite-builds:/storage/builds:rw
|
||||||
|
- appwrite-certificates:/storage/certificates:rw
|
||||||
|
environment:
|
||||||
|
- _APP_ENV
|
||||||
|
- _APP_WORKER_PER_CORE
|
||||||
|
- _APP_OPENSSL_KEY_V1
|
||||||
|
- _APP_REDIS_HOST
|
||||||
|
- _APP_REDIS_PORT
|
||||||
|
- _APP_REDIS_USER
|
||||||
|
- _APP_REDIS_PASS
|
||||||
|
- _APP_DB_HOST
|
||||||
|
- _APP_DB_PORT
|
||||||
|
- _APP_DB_SCHEMA
|
||||||
|
- _APP_DB_USER
|
||||||
|
- _APP_DB_PASS
|
||||||
|
- _APP_STORAGE_DEVICE
|
||||||
|
- _APP_STORAGE_S3_ACCESS_KEY
|
||||||
|
- _APP_STORAGE_S3_SECRET
|
||||||
|
- _APP_STORAGE_S3_REGION
|
||||||
|
- _APP_STORAGE_S3_BUCKET
|
||||||
|
- _APP_STORAGE_DO_SPACES_ACCESS_KEY
|
||||||
|
- _APP_STORAGE_DO_SPACES_SECRET
|
||||||
|
- _APP_STORAGE_DO_SPACES_REGION
|
||||||
|
- _APP_STORAGE_DO_SPACES_BUCKET
|
||||||
|
- _APP_STORAGE_BACKBLAZE_ACCESS_KEY
|
||||||
|
- _APP_STORAGE_BACKBLAZE_SECRET
|
||||||
|
- _APP_STORAGE_BACKBLAZE_REGION
|
||||||
|
- _APP_STORAGE_BACKBLAZE_BUCKET
|
||||||
|
- _APP_STORAGE_LINODE_ACCESS_KEY
|
||||||
|
- _APP_STORAGE_LINODE_SECRET
|
||||||
|
- _APP_STORAGE_LINODE_REGION
|
||||||
|
- _APP_STORAGE_LINODE_BUCKET
|
||||||
|
- _APP_STORAGE_WASABI_ACCESS_KEY
|
||||||
|
- _APP_STORAGE_WASABI_SECRET
|
||||||
|
- _APP_STORAGE_WASABI_REGION
|
||||||
|
- _APP_STORAGE_WASABI_BUCKET
|
||||||
|
- _APP_LOGGING_CONFIG
|
||||||
|
- _APP_EXECUTOR_SECRET
|
||||||
|
- _APP_EXECUTOR_HOST
|
||||||
|
- _APP_MAINTENANCE_RETENTION_ABUSE
|
||||||
|
- _APP_MAINTENANCE_RETENTION_AUDIT
|
||||||
|
- _APP_MAINTENANCE_RETENTION_EXECUTION
|
||||||
|
|
||||||
|
appwrite-worker-databases:
|
||||||
|
image: appwrite/appwrite:1.6.0
|
||||||
|
entrypoint: worker-databases
|
||||||
|
<<: *x-logging
|
||||||
|
container_name: appwrite-worker-databases
|
||||||
|
restart: unless-stopped
|
||||||
|
networks:
|
||||||
|
- dokploy-network
|
||||||
|
depends_on:
|
||||||
|
- redis
|
||||||
|
- mariadb
|
||||||
|
environment:
|
||||||
|
- _APP_ENV
|
||||||
|
- _APP_WORKER_PER_CORE
|
||||||
|
- _APP_OPENSSL_KEY_V1
|
||||||
|
- _APP_REDIS_HOST
|
||||||
|
- _APP_REDIS_PORT
|
||||||
|
- _APP_REDIS_USER
|
||||||
|
- _APP_REDIS_PASS
|
||||||
|
- _APP_DB_HOST
|
||||||
|
- _APP_DB_PORT
|
||||||
|
- _APP_DB_SCHEMA
|
||||||
|
- _APP_DB_USER
|
||||||
|
- _APP_DB_PASS
|
||||||
|
- _APP_LOGGING_CONFIG
|
||||||
|
|
||||||
|
appwrite-worker-builds:
|
||||||
|
image: appwrite/appwrite:1.6.0
|
||||||
|
entrypoint: worker-builds
|
||||||
|
<<: *x-logging
|
||||||
|
container_name: appwrite-worker-builds
|
||||||
|
restart: unless-stopped
|
||||||
|
networks:
|
||||||
|
- dokploy-network
|
||||||
|
depends_on:
|
||||||
|
- redis
|
||||||
|
- mariadb
|
||||||
|
volumes:
|
||||||
|
- appwrite-functions:/storage/functions:rw
|
||||||
|
- appwrite-builds:/storage/builds:rw
|
||||||
|
environment:
|
||||||
|
- _APP_ENV
|
||||||
|
- _APP_WORKER_PER_CORE
|
||||||
|
- _APP_OPENSSL_KEY_V1
|
||||||
|
- _APP_EXECUTOR_SECRET
|
||||||
|
- _APP_EXECUTOR_HOST
|
||||||
|
- _APP_REDIS_HOST
|
||||||
|
- _APP_REDIS_PORT
|
||||||
|
- _APP_REDIS_USER
|
||||||
|
- _APP_REDIS_PASS
|
||||||
|
- _APP_DB_HOST
|
||||||
|
- _APP_DB_PORT
|
||||||
|
- _APP_DB_SCHEMA
|
||||||
|
- _APP_DB_USER
|
||||||
|
- _APP_DB_PASS
|
||||||
|
- _APP_LOGGING_CONFIG
|
||||||
|
- _APP_VCS_GITHUB_APP_NAME
|
||||||
|
- _APP_VCS_GITHUB_PRIVATE_KEY
|
||||||
|
- _APP_VCS_GITHUB_APP_ID
|
||||||
|
- _APP_FUNCTIONS_TIMEOUT
|
||||||
|
- _APP_FUNCTIONS_BUILD_TIMEOUT
|
||||||
|
- _APP_FUNCTIONS_CPUS
|
||||||
|
- _APP_FUNCTIONS_MEMORY
|
||||||
|
- _APP_FUNCTIONS_SIZE_LIMIT
|
||||||
|
- _APP_OPTIONS_FORCE_HTTPS
|
||||||
|
- _APP_OPTIONS_FUNCTIONS_FORCE_HTTPS
|
||||||
|
- _APP_DOMAIN
|
||||||
|
- _APP_STORAGE_DEVICE
|
||||||
|
- _APP_STORAGE_S3_ACCESS_KEY
|
||||||
|
- _APP_STORAGE_S3_SECRET
|
||||||
|
- _APP_STORAGE_S3_REGION
|
||||||
|
- _APP_STORAGE_S3_BUCKET
|
||||||
|
- _APP_STORAGE_DO_SPACES_ACCESS_KEY
|
||||||
|
- _APP_STORAGE_DO_SPACES_SECRET
|
||||||
|
- _APP_STORAGE_DO_SPACES_REGION
|
||||||
|
- _APP_STORAGE_DO_SPACES_BUCKET
|
||||||
|
- _APP_STORAGE_BACKBLAZE_ACCESS_KEY
|
||||||
|
- _APP_STORAGE_BACKBLAZE_SECRET
|
||||||
|
- _APP_STORAGE_BACKBLAZE_REGION
|
||||||
|
- _APP_STORAGE_BACKBLAZE_BUCKET
|
||||||
|
- _APP_STORAGE_LINODE_ACCESS_KEY
|
||||||
|
- _APP_STORAGE_LINODE_SECRET
|
||||||
|
- _APP_STORAGE_LINODE_REGION
|
||||||
|
- _APP_STORAGE_LINODE_BUCKET
|
||||||
|
- _APP_STORAGE_WASABI_ACCESS_KEY
|
||||||
|
- _APP_STORAGE_WASABI_SECRET
|
||||||
|
- _APP_STORAGE_WASABI_REGION
|
||||||
|
- _APP_STORAGE_WASABI_BUCKET
|
||||||
|
|
||||||
|
appwrite-worker-certificates:
|
||||||
|
image: appwrite/appwrite:1.6.0
|
||||||
|
entrypoint: worker-certificates
|
||||||
|
<<: *x-logging
|
||||||
|
container_name: appwrite-worker-certificates
|
||||||
|
restart: unless-stopped
|
||||||
|
networks:
|
||||||
|
- dokploy-network
|
||||||
|
depends_on:
|
||||||
|
- redis
|
||||||
|
- mariadb
|
||||||
|
volumes:
|
||||||
|
- appwrite-config:/storage/config:rw
|
||||||
|
- appwrite-certificates:/storage/certificates:rw
|
||||||
|
environment:
|
||||||
|
- _APP_ENV
|
||||||
|
- _APP_WORKER_PER_CORE
|
||||||
|
- _APP_OPENSSL_KEY_V1
|
||||||
|
- _APP_DOMAIN
|
||||||
|
- _APP_DOMAIN_TARGET
|
||||||
|
- _APP_DOMAIN_FUNCTIONS
|
||||||
|
- _APP_EMAIL_CERTIFICATES
|
||||||
|
- _APP_REDIS_HOST
|
||||||
|
- _APP_REDIS_PORT
|
||||||
|
- _APP_REDIS_USER
|
||||||
|
- _APP_REDIS_PASS
|
||||||
|
- _APP_DB_HOST
|
||||||
|
- _APP_DB_PORT
|
||||||
|
- _APP_DB_SCHEMA
|
||||||
|
- _APP_DB_USER
|
||||||
|
- _APP_DB_PASS
|
||||||
|
- _APP_LOGGING_CONFIG
|
||||||
|
|
||||||
|
appwrite-worker-functions:
|
||||||
|
image: appwrite/appwrite:1.6.0
|
||||||
|
entrypoint: worker-functions
|
||||||
|
<<: *x-logging
|
||||||
|
container_name: appwrite-worker-functions
|
||||||
|
restart: unless-stopped
|
||||||
|
networks:
|
||||||
|
- dokploy-network
|
||||||
|
depends_on:
|
||||||
|
- redis
|
||||||
|
- mariadb
|
||||||
|
- openruntimes-executor
|
||||||
|
environment:
|
||||||
|
- _APP_ENV
|
||||||
|
- _APP_WORKER_PER_CORE
|
||||||
|
- _APP_OPENSSL_KEY_V1
|
||||||
|
- _APP_DOMAIN
|
||||||
|
- _APP_OPTIONS_FORCE_HTTPS
|
||||||
|
- _APP_REDIS_HOST
|
||||||
|
- _APP_REDIS_PORT
|
||||||
|
- _APP_REDIS_USER
|
||||||
|
- _APP_REDIS_PASS
|
||||||
|
- _APP_DB_HOST
|
||||||
|
- _APP_DB_PORT
|
||||||
|
- _APP_DB_SCHEMA
|
||||||
|
- _APP_DB_USER
|
||||||
|
- _APP_DB_PASS
|
||||||
|
- _APP_FUNCTIONS_TIMEOUT
|
||||||
|
- _APP_FUNCTIONS_BUILD_TIMEOUT
|
||||||
|
- _APP_FUNCTIONS_CPUS
|
||||||
|
- _APP_FUNCTIONS_MEMORY
|
||||||
|
- _APP_EXECUTOR_SECRET
|
||||||
|
- _APP_EXECUTOR_HOST
|
||||||
|
- _APP_USAGE_STATS
|
||||||
|
- _APP_DOCKER_HUB_USERNAME
|
||||||
|
- _APP_DOCKER_HUB_PASSWORD
|
||||||
|
- _APP_LOGGING_CONFIG
|
||||||
|
|
||||||
|
appwrite-worker-mails:
|
||||||
|
image: appwrite/appwrite:1.6.0
|
||||||
|
entrypoint: worker-mails
|
||||||
|
<<: *x-logging
|
||||||
|
container_name: appwrite-worker-mails
|
||||||
|
restart: unless-stopped
|
||||||
|
networks:
|
||||||
|
- dokploy-network
|
||||||
|
depends_on:
|
||||||
|
- redis
|
||||||
|
environment:
|
||||||
|
- _APP_ENV
|
||||||
|
- _APP_WORKER_PER_CORE
|
||||||
|
- _APP_OPENSSL_KEY_V1
|
||||||
|
- _APP_SYSTEM_EMAIL_NAME
|
||||||
|
- _APP_SYSTEM_EMAIL_ADDRESS
|
||||||
|
- _APP_DB_HOST
|
||||||
|
- _APP_DB_PORT
|
||||||
|
- _APP_DB_SCHEMA
|
||||||
|
- _APP_DB_USER
|
||||||
|
- _APP_DB_PASS
|
||||||
|
- _APP_REDIS_HOST
|
||||||
|
- _APP_REDIS_PORT
|
||||||
|
- _APP_REDIS_USER
|
||||||
|
- _APP_REDIS_PASS
|
||||||
|
- _APP_SMTP_HOST
|
||||||
|
- _APP_SMTP_PORT
|
||||||
|
- _APP_SMTP_SECURE
|
||||||
|
- _APP_SMTP_USERNAME
|
||||||
|
- _APP_SMTP_PASSWORD
|
||||||
|
- _APP_LOGGING_CONFIG
|
||||||
|
|
||||||
|
appwrite-worker-messaging:
|
||||||
|
image: appwrite/appwrite:1.6.0
|
||||||
|
entrypoint: worker-messaging
|
||||||
|
container_name: appwrite-worker-messaging
|
||||||
|
<<: *x-logging
|
||||||
|
restart: unless-stopped
|
||||||
|
networks:
|
||||||
|
- dokploy-network
|
||||||
|
volumes:
|
||||||
|
- appwrite-uploads:/storage/uploads:rw
|
||||||
|
depends_on:
|
||||||
|
- redis
|
||||||
|
environment:
|
||||||
|
- _APP_ENV
|
||||||
|
- _APP_WORKER_PER_CORE
|
||||||
|
- _APP_OPENSSL_KEY_V1
|
||||||
|
- _APP_REDIS_HOST
|
||||||
|
- _APP_REDIS_PORT
|
||||||
|
- _APP_REDIS_USER
|
||||||
|
- _APP_REDIS_PASS
|
||||||
|
- _APP_DB_HOST
|
||||||
|
- _APP_DB_PORT
|
||||||
|
- _APP_DB_SCHEMA
|
||||||
|
- _APP_DB_USER
|
||||||
|
- _APP_DB_PASS
|
||||||
|
- _APP_LOGGING_CONFIG
|
||||||
|
- _APP_SMS_FROM
|
||||||
|
- _APP_SMS_PROVIDER
|
||||||
|
- _APP_STORAGE_DEVICE
|
||||||
|
- _APP_STORAGE_S3_ACCESS_KEY
|
||||||
|
- _APP_STORAGE_S3_SECRET
|
||||||
|
- _APP_STORAGE_S3_REGION
|
||||||
|
- _APP_STORAGE_S3_BUCKET
|
||||||
|
- _APP_STORAGE_DO_SPACES_ACCESS_KEY
|
||||||
|
- _APP_STORAGE_DO_SPACES_SECRET
|
||||||
|
- _APP_STORAGE_DO_SPACES_REGION
|
||||||
|
- _APP_STORAGE_DO_SPACES_BUCKET
|
||||||
|
- _APP_STORAGE_BACKBLAZE_ACCESS_KEY
|
||||||
|
- _APP_STORAGE_BACKBLAZE_SECRET
|
||||||
|
- _APP_STORAGE_BACKBLAZE_REGION
|
||||||
|
- _APP_STORAGE_BACKBLAZE_BUCKET
|
||||||
|
- _APP_STORAGE_LINODE_ACCESS_KEY
|
||||||
|
- _APP_STORAGE_LINODE_SECRET
|
||||||
|
- _APP_STORAGE_LINODE_REGION
|
||||||
|
- _APP_STORAGE_LINODE_BUCKET
|
||||||
|
- _APP_STORAGE_WASABI_ACCESS_KEY
|
||||||
|
- _APP_STORAGE_WASABI_SECRET
|
||||||
|
- _APP_STORAGE_WASABI_REGION
|
||||||
|
- _APP_STORAGE_WASABI_BUCKET
|
||||||
|
|
||||||
|
appwrite-worker-migrations:
|
||||||
|
image: appwrite/appwrite:1.6.0
|
||||||
|
entrypoint: worker-migrations
|
||||||
|
<<: *x-logging
|
||||||
|
container_name: appwrite-worker-migrations
|
||||||
|
restart: unless-stopped
|
||||||
|
networks:
|
||||||
|
- dokploy-network
|
||||||
|
depends_on:
|
||||||
|
- mariadb
|
||||||
|
environment:
|
||||||
|
- _APP_ENV
|
||||||
|
- _APP_WORKER_PER_CORE
|
||||||
|
- _APP_OPENSSL_KEY_V1
|
||||||
|
- _APP_DOMAIN
|
||||||
|
- _APP_DOMAIN_TARGET
|
||||||
|
- _APP_EMAIL_SECURITY
|
||||||
|
- _APP_REDIS_HOST
|
||||||
|
- _APP_REDIS_PORT
|
||||||
|
- _APP_REDIS_USER
|
||||||
|
- _APP_REDIS_PASS
|
||||||
|
- _APP_DB_HOST
|
||||||
|
- _APP_DB_PORT
|
||||||
|
- _APP_DB_SCHEMA
|
||||||
|
- _APP_DB_USER
|
||||||
|
- _APP_DB_PASS
|
||||||
|
- _APP_LOGGING_CONFIG
|
||||||
|
- _APP_MIGRATIONS_FIREBASE_CLIENT_ID
|
||||||
|
- _APP_MIGRATIONS_FIREBASE_CLIENT_SECRET
|
||||||
|
|
||||||
|
appwrite-task-maintenance:
|
||||||
|
image: appwrite/appwrite:1.6.0
|
||||||
|
entrypoint: maintenance
|
||||||
|
<<: *x-logging
|
||||||
|
container_name: appwrite-task-maintenance
|
||||||
|
restart: unless-stopped
|
||||||
|
networks:
|
||||||
|
- dokploy-network
|
||||||
|
depends_on:
|
||||||
|
- redis
|
||||||
|
environment:
|
||||||
|
- _APP_ENV
|
||||||
|
- _APP_WORKER_PER_CORE
|
||||||
|
- _APP_DOMAIN
|
||||||
|
- _APP_DOMAIN_TARGET
|
||||||
|
- _APP_DOMAIN_FUNCTIONS
|
||||||
|
- _APP_OPENSSL_KEY_V1
|
||||||
|
- _APP_REDIS_HOST
|
||||||
|
- _APP_REDIS_PORT
|
||||||
|
- _APP_REDIS_USER
|
||||||
|
- _APP_REDIS_PASS
|
||||||
|
- _APP_DB_HOST
|
||||||
|
- _APP_DB_PORT
|
||||||
|
- _APP_DB_SCHEMA
|
||||||
|
- _APP_DB_USER
|
||||||
|
- _APP_DB_PASS
|
||||||
|
- _APP_MAINTENANCE_INTERVAL
|
||||||
|
- _APP_MAINTENANCE_RETENTION_EXECUTION
|
||||||
|
- _APP_MAINTENANCE_RETENTION_CACHE
|
||||||
|
- _APP_MAINTENANCE_RETENTION_ABUSE
|
||||||
|
- _APP_MAINTENANCE_RETENTION_AUDIT
|
||||||
|
- _APP_MAINTENANCE_RETENTION_USAGE_HOURLY
|
||||||
|
- _APP_MAINTENANCE_RETENTION_SCHEDULES
|
||||||
|
|
||||||
|
appwrite-worker-usage:
|
||||||
|
image: appwrite/appwrite:1.6.0
|
||||||
|
entrypoint: worker-usage
|
||||||
|
container_name: appwrite-worker-usage
|
||||||
|
<<: *x-logging
|
||||||
|
restart: unless-stopped
|
||||||
|
networks:
|
||||||
|
- dokploy-network
|
||||||
|
depends_on:
|
||||||
|
- redis
|
||||||
|
- mariadb
|
||||||
|
environment:
|
||||||
|
- _APP_ENV
|
||||||
|
- _APP_WORKER_PER_CORE
|
||||||
|
- _APP_OPENSSL_KEY_V1
|
||||||
|
- _APP_DB_HOST
|
||||||
|
- _APP_DB_PORT
|
||||||
|
- _APP_DB_SCHEMA
|
||||||
|
- _APP_DB_USER
|
||||||
|
- _APP_DB_PASS
|
||||||
|
- _APP_REDIS_HOST
|
||||||
|
- _APP_REDIS_PORT
|
||||||
|
- _APP_REDIS_USER
|
||||||
|
- _APP_REDIS_PASS
|
||||||
|
- _APP_USAGE_STATS
|
||||||
|
- _APP_LOGGING_CONFIG
|
||||||
|
- _APP_USAGE_AGGREGATION_INTERVAL
|
||||||
|
|
||||||
|
appwrite-worker-usage-dump:
|
||||||
|
image: appwrite/appwrite:1.6.0
|
||||||
|
entrypoint: worker-usage-dump
|
||||||
|
container_name: appwrite-worker-usage-dump
|
||||||
|
<<: *x-logging
|
||||||
|
networks:
|
||||||
|
- dokploy-network
|
||||||
|
depends_on:
|
||||||
|
- redis
|
||||||
|
- mariadb
|
||||||
|
environment:
|
||||||
|
- _APP_ENV
|
||||||
|
- _APP_WORKER_PER_CORE
|
||||||
|
- _APP_OPENSSL_KEY_V1
|
||||||
|
- _APP_DB_HOST
|
||||||
|
- _APP_DB_PORT
|
||||||
|
- _APP_DB_SCHEMA
|
||||||
|
- _APP_DB_USER
|
||||||
|
- _APP_DB_PASS
|
||||||
|
- _APP_REDIS_HOST
|
||||||
|
- _APP_REDIS_PORT
|
||||||
|
- _APP_REDIS_USER
|
||||||
|
- _APP_REDIS_PASS
|
||||||
|
- _APP_USAGE_STATS
|
||||||
|
- _APP_LOGGING_CONFIG
|
||||||
|
- _APP_USAGE_AGGREGATION_INTERVAL
|
||||||
|
|
||||||
|
appwrite-task-scheduler-functions:
|
||||||
|
image: appwrite/appwrite:1.6.0
|
||||||
|
entrypoint: schedule-functions
|
||||||
|
container_name: appwrite-task-scheduler-functions
|
||||||
|
<<: *x-logging
|
||||||
|
restart: unless-stopped
|
||||||
|
networks:
|
||||||
|
- dokploy-network
|
||||||
|
depends_on:
|
||||||
|
- mariadb
|
||||||
|
- redis
|
||||||
|
environment:
|
||||||
|
- _APP_ENV
|
||||||
|
- _APP_WORKER_PER_CORE
|
||||||
|
- _APP_OPENSSL_KEY_V1
|
||||||
|
- _APP_REDIS_HOST
|
||||||
|
- _APP_REDIS_PORT
|
||||||
|
- _APP_REDIS_USER
|
||||||
|
- _APP_REDIS_PASS
|
||||||
|
- _APP_DB_HOST
|
||||||
|
- _APP_DB_PORT
|
||||||
|
- _APP_DB_SCHEMA
|
||||||
|
- _APP_DB_USER
|
||||||
|
- _APP_DB_PASS
|
||||||
|
|
||||||
|
appwrite-task-scheduler-executions:
|
||||||
|
image: appwrite/appwrite:1.6.0
|
||||||
|
entrypoint: schedule-executions
|
||||||
|
container_name: appwrite-task-scheduler-executions
|
||||||
|
<<: *x-logging
|
||||||
|
restart: unless-stopped
|
||||||
|
networks:
|
||||||
|
- dokploy-network
|
||||||
|
depends_on:
|
||||||
|
- mariadb
|
||||||
|
- redis
|
||||||
|
environment:
|
||||||
|
- _APP_ENV
|
||||||
|
- _APP_WORKER_PER_CORE
|
||||||
|
- _APP_OPENSSL_KEY_V1
|
||||||
|
- _APP_REDIS_HOST
|
||||||
|
- _APP_REDIS_PORT
|
||||||
|
- _APP_REDIS_USER
|
||||||
|
- _APP_REDIS_PASS
|
||||||
|
- _APP_DB_HOST
|
||||||
|
- _APP_DB_PORT
|
||||||
|
- _APP_DB_SCHEMA
|
||||||
|
- _APP_DB_USER
|
||||||
|
- _APP_DB_PASS
|
||||||
|
|
||||||
|
appwrite-task-scheduler-messages:
|
||||||
|
image: appwrite/appwrite:1.6.0
|
||||||
|
entrypoint: schedule-messages
|
||||||
|
container_name: appwrite-task-scheduler-messages
|
||||||
|
<<: *x-logging
|
||||||
|
restart: unless-stopped
|
||||||
|
networks:
|
||||||
|
- dokploy-network
|
||||||
|
depends_on:
|
||||||
|
- mariadb
|
||||||
|
- redis
|
||||||
|
environment:
|
||||||
|
- _APP_ENV
|
||||||
|
- _APP_WORKER_PER_CORE
|
||||||
|
- _APP_OPENSSL_KEY_V1
|
||||||
|
- _APP_REDIS_HOST
|
||||||
|
- _APP_REDIS_PORT
|
||||||
|
- _APP_REDIS_USER
|
||||||
|
- _APP_REDIS_PASS
|
||||||
|
- _APP_DB_HOST
|
||||||
|
- _APP_DB_PORT
|
||||||
|
- _APP_DB_SCHEMA
|
||||||
|
- _APP_DB_USER
|
||||||
|
- _APP_DB_PASS
|
||||||
|
|
||||||
|
appwrite-assistant:
|
||||||
|
image: appwrite/assistant:0.4.0
|
||||||
|
container_name: appwrite-assistant
|
||||||
|
<<: *x-logging
|
||||||
|
restart: unless-stopped
|
||||||
|
networks:
|
||||||
|
- dokploy-network
|
||||||
|
environment:
|
||||||
|
- _APP_ASSISTANT_OPENAI_API_KEY
|
||||||
|
|
||||||
|
openruntimes-executor:
|
||||||
|
container_name: openruntimes-executor
|
||||||
|
hostname: exc1
|
||||||
|
<<: *x-logging
|
||||||
|
restart: unless-stopped
|
||||||
|
stop_signal: SIGINT
|
||||||
|
image: openruntimes/executor:0.6.11
|
||||||
|
networks:
|
||||||
|
- dokploy-network
|
||||||
|
volumes:
|
||||||
|
- /var/run/docker.sock:/var/run/docker.sock
|
||||||
|
- appwrite-builds:/storage/builds:rw
|
||||||
|
- appwrite-functions:/storage/functions:rw
|
||||||
|
- /tmp:/tmp:rw
|
||||||
|
environment:
|
||||||
|
- OPR_EXECUTOR_INACTIVE_TRESHOLD=$_APP_FUNCTIONS_INACTIVE_THRESHOLD
|
||||||
|
- OPR_EXECUTOR_MAINTENANCE_INTERVAL=$_APP_FUNCTIONS_MAINTENANCE_INTERVAL
|
||||||
|
- OPR_EXECUTOR_NETWORK=$_APP_FUNCTIONS_RUNTIMES_NETWORK
|
||||||
|
- OPR_EXECUTOR_DOCKER_HUB_USERNAME=$_APP_DOCKER_HUB_USERNAME
|
||||||
|
- OPR_EXECUTOR_DOCKER_HUB_PASSWORD=$_APP_DOCKER_HUB_PASSWORD
|
||||||
|
- OPR_EXECUTOR_ENV=$_APP_ENV
|
||||||
|
- OPR_EXECUTOR_RUNTIMES=$_APP_FUNCTIONS_RUNTIMES
|
||||||
|
- OPR_EXECUTOR_SECRET=$_APP_EXECUTOR_SECRET
|
||||||
|
- OPR_EXECUTOR_LOGGING_CONFIG=$_APP_LOGGING_CONFIG
|
||||||
|
- OPR_EXECUTOR_STORAGE_DEVICE=$_APP_STORAGE_DEVICE
|
||||||
|
- OPR_EXECUTOR_STORAGE_S3_ACCESS_KEY=$_APP_STORAGE_S3_ACCESS_KEY
|
||||||
|
- OPR_EXECUTOR_STORAGE_S3_SECRET=$_APP_STORAGE_S3_SECRET
|
||||||
|
- OPR_EXECUTOR_STORAGE_S3_REGION=$_APP_STORAGE_S3_REGION
|
||||||
|
- OPR_EXECUTOR_STORAGE_S3_BUCKET=$_APP_STORAGE_S3_BUCKET
|
||||||
|
- OPR_EXECUTOR_STORAGE_DO_SPACES_ACCESS_KEY=$_APP_STORAGE_DO_SPACES_ACCESS_KEY
|
||||||
|
- OPR_EXECUTOR_STORAGE_DO_SPACES_SECRET=$_APP_STORAGE_DO_SPACES_SECRET
|
||||||
|
- OPR_EXECUTOR_STORAGE_DO_SPACES_REGION=$_APP_STORAGE_DO_SPACES_REGION
|
||||||
|
- OPR_EXECUTOR_STORAGE_DO_SPACES_BUCKET=$_APP_STORAGE_DO_SPACES_BUCKET
|
||||||
|
- OPR_EXECUTOR_STORAGE_BACKBLAZE_ACCESS_KEY=$_APP_STORAGE_BACKBLAZE_ACCESS_KEY
|
||||||
|
- OPR_EXECUTOR_STORAGE_BACKBLAZE_SECRET=$_APP_STORAGE_BACKBLAZE_SECRET
|
||||||
|
- OPR_EXECUTOR_STORAGE_BACKBLAZE_REGION=$_APP_STORAGE_BACKBLAZE_REGION
|
||||||
|
- OPR_EXECUTOR_STORAGE_BACKBLAZE_BUCKET=$_APP_STORAGE_BACKBLAZE_BUCKET
|
||||||
|
- OPR_EXECUTOR_STORAGE_LINODE_ACCESS_KEY=$_APP_STORAGE_LINODE_ACCESS_KEY
|
||||||
|
- OPR_EXECUTOR_STORAGE_LINODE_SECRET=$_APP_STORAGE_LINODE_SECRET
|
||||||
|
- OPR_EXECUTOR_STORAGE_LINODE_REGION=$_APP_STORAGE_LINODE_REGION
|
||||||
|
- OPR_EXECUTOR_STORAGE_LINODE_BUCKET=$_APP_STORAGE_LINODE_BUCKET
|
||||||
|
- OPR_EXECUTOR_STORAGE_WASABI_ACCESS_KEY=$_APP_STORAGE_WASABI_ACCESS_KEY
|
||||||
|
- OPR_EXECUTOR_STORAGE_WASABI_SECRET=$_APP_STORAGE_WASABI_SECRET
|
||||||
|
- OPR_EXECUTOR_STORAGE_WASABI_REGION=$_APP_STORAGE_WASABI_REGION
|
||||||
|
- OPR_EXECUTOR_STORAGE_WASABI_BUCKET=$_APP_STORAGE_WASABI_BUCKET
|
||||||
|
|
||||||
|
mariadb:
|
||||||
|
image: mariadb:10.11
|
||||||
|
container_name: appwrite-mariadb
|
||||||
|
<<: *x-logging
|
||||||
|
restart: unless-stopped
|
||||||
|
networks:
|
||||||
|
- dokploy-network
|
||||||
|
volumes:
|
||||||
|
- appwrite-mariadb:/var/lib/mysql:rw
|
||||||
|
environment:
|
||||||
|
- MYSQL_ROOT_PASSWORD=${_APP_DB_ROOT_PASS}
|
||||||
|
- MYSQL_DATABASE=${_APP_DB_SCHEMA}
|
||||||
|
- MYSQL_USER=${_APP_DB_USER}
|
||||||
|
- MYSQL_PASSWORD=${_APP_DB_PASS}
|
||||||
|
- MARIADB_AUTO_UPGRADE=1
|
||||||
|
command: "mysqld --innodb-flush-method=fsync"
|
||||||
|
|
||||||
|
redis:
|
||||||
|
image: redis:7.2.4-alpine
|
||||||
|
container_name: appwrite-redis
|
||||||
|
<<: *x-logging
|
||||||
|
restart: unless-stopped
|
||||||
|
command: >
|
||||||
|
redis-server
|
||||||
|
--maxmemory 512mb
|
||||||
|
--maxmemory-policy allkeys-lru
|
||||||
|
--maxmemory-samples 5
|
||||||
|
networks:
|
||||||
|
- dokploy-network
|
||||||
|
volumes:
|
||||||
|
- appwrite-redis:/data:rw
|
||||||
|
|
||||||
|
# Uncomment and configure if ClamAV is needed
|
||||||
|
# clamav:
|
||||||
|
# image: appwrite/clamav:1.2.0
|
||||||
|
# container_name: appwrite-clamav
|
||||||
|
# restart: unless-stopped
|
||||||
|
# networks:
|
||||||
|
# - dokploy-network
|
||||||
|
# volumes:
|
||||||
|
# - appwrite-uploads:/storage/uploads
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
appwrite-mariadb:
|
||||||
|
appwrite-redis:
|
||||||
|
appwrite-cache:
|
||||||
|
appwrite-uploads:
|
||||||
|
appwrite-certificates:
|
||||||
|
appwrite-functions:
|
||||||
|
appwrite-builds:
|
||||||
|
appwrite-config:
|
||||||
|
|
||||||
|
networks:
|
||||||
|
dokploy-network:
|
||||||
|
external: true
|
||||||
153
apps/dokploy/templates/appwrite/index.ts
Normal file
@@ -0,0 +1,153 @@
|
|||||||
|
import {
|
||||||
|
type DomainSchema,
|
||||||
|
type Schema,
|
||||||
|
type Template,
|
||||||
|
generateRandomDomain,
|
||||||
|
} from "../utils";
|
||||||
|
|
||||||
|
export function generate(schema: Schema): Template {
|
||||||
|
const mainDomain = generateRandomDomain(schema);
|
||||||
|
|
||||||
|
const domains: DomainSchema[] = [
|
||||||
|
{ host: mainDomain, port: 80, serviceName: "appwrite", path: "/" },
|
||||||
|
{
|
||||||
|
host: mainDomain,
|
||||||
|
port: 80,
|
||||||
|
serviceName: "appwrite-console",
|
||||||
|
path: "/console",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
host: mainDomain,
|
||||||
|
port: 80,
|
||||||
|
serviceName: "appwrite-realtime",
|
||||||
|
path: "/v1/realtime",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
const envs = [
|
||||||
|
"_APP_ENV=production",
|
||||||
|
"_APP_LOCALE=en",
|
||||||
|
"_APP_OPTIONS_ABUSE=enabled",
|
||||||
|
"_APP_OPTIONS_FORCE_HTTPS=disabled",
|
||||||
|
"_APP_OPTIONS_FUNCTIONS_FORCE_HTTPS=disabled",
|
||||||
|
"_APP_OPTIONS_ROUTER_PROTECTION=disabled",
|
||||||
|
"_APP_OPENSSL_KEY_V1=your-secret-key",
|
||||||
|
`_APP_DOMAIN=${mainDomain}`,
|
||||||
|
`_APP_DOMAIN_FUNCTIONS=${mainDomain}`,
|
||||||
|
`_APP_DOMAIN_TARGET=${mainDomain}`,
|
||||||
|
"_APP_CONSOLE_WHITELIST_ROOT=enabled",
|
||||||
|
"_APP_CONSOLE_WHITELIST_EMAILS=",
|
||||||
|
"_APP_CONSOLE_WHITELIST_IPS=",
|
||||||
|
"_APP_CONSOLE_HOSTNAMES=",
|
||||||
|
"_APP_SYSTEM_EMAIL_NAME=Appwrite",
|
||||||
|
"_APP_SYSTEM_EMAIL_ADDRESS=noreply@appwrite.io",
|
||||||
|
"_APP_SYSTEM_TEAM_EMAIL=team@appwrite.io",
|
||||||
|
"_APP_SYSTEM_RESPONSE_FORMAT=",
|
||||||
|
"_APP_SYSTEM_SECURITY_EMAIL_ADDRESS=certs@appwrite.io",
|
||||||
|
"_APP_EMAIL_SECURITY=",
|
||||||
|
"_APP_EMAIL_CERTIFICATES=",
|
||||||
|
"_APP_USAGE_STATS=enabled",
|
||||||
|
"_APP_LOGGING_PROVIDER=",
|
||||||
|
"_APP_LOGGING_CONFIG=",
|
||||||
|
"_APP_USAGE_AGGREGATION_INTERVAL=30",
|
||||||
|
"_APP_USAGE_TIMESERIES_INTERVAL=30",
|
||||||
|
"_APP_USAGE_DATABASE_INTERVAL=900",
|
||||||
|
"_APP_WORKER_PER_CORE=6",
|
||||||
|
"_APP_CONSOLE_SESSION_ALERTS=disabled",
|
||||||
|
"_APP_REDIS_HOST=redis",
|
||||||
|
"_APP_REDIS_PORT=6379",
|
||||||
|
"_APP_REDIS_USER=",
|
||||||
|
"_APP_REDIS_PASS=",
|
||||||
|
"_APP_DB_HOST=mariadb",
|
||||||
|
"_APP_DB_PORT=3306",
|
||||||
|
"_APP_DB_SCHEMA=appwrite",
|
||||||
|
"_APP_DB_USER=user",
|
||||||
|
"_APP_DB_PASS=password",
|
||||||
|
"_APP_DB_ROOT_PASS=rootsecretpassword",
|
||||||
|
"_APP_INFLUXDB_HOST=influxdb",
|
||||||
|
"_APP_INFLUXDB_PORT=8086",
|
||||||
|
"_APP_STATSD_HOST=telegraf",
|
||||||
|
"_APP_STATSD_PORT=8125",
|
||||||
|
"_APP_SMTP_HOST=",
|
||||||
|
"_APP_SMTP_PORT=",
|
||||||
|
"_APP_SMTP_SECURE=",
|
||||||
|
"_APP_SMTP_USERNAME=",
|
||||||
|
"_APP_SMTP_PASSWORD=",
|
||||||
|
"_APP_SMS_PROVIDER=",
|
||||||
|
"_APP_SMS_FROM=",
|
||||||
|
"_APP_STORAGE_LIMIT=30000000",
|
||||||
|
"_APP_STORAGE_PREVIEW_LIMIT=20000000",
|
||||||
|
"_APP_STORAGE_ANTIVIRUS=disabled",
|
||||||
|
"_APP_STORAGE_ANTIVIRUS_HOST=clamav",
|
||||||
|
"_APP_STORAGE_ANTIVIRUS_PORT=3310",
|
||||||
|
"_APP_STORAGE_DEVICE=local",
|
||||||
|
"_APP_STORAGE_S3_ACCESS_KEY=",
|
||||||
|
"_APP_STORAGE_S3_SECRET=",
|
||||||
|
"_APP_STORAGE_S3_REGION=us-east-1",
|
||||||
|
"_APP_STORAGE_S3_BUCKET=",
|
||||||
|
"_APP_STORAGE_DO_SPACES_ACCESS_KEY=",
|
||||||
|
"_APP_STORAGE_DO_SPACES_SECRET=",
|
||||||
|
"_APP_STORAGE_DO_SPACES_REGION=us-east-1",
|
||||||
|
"_APP_STORAGE_DO_SPACES_BUCKET=",
|
||||||
|
"_APP_STORAGE_BACKBLAZE_ACCESS_KEY=",
|
||||||
|
"_APP_STORAGE_BACKBLAZE_SECRET=",
|
||||||
|
"_APP_STORAGE_BACKBLAZE_REGION=us-west-004",
|
||||||
|
"_APP_STORAGE_BACKBLAZE_BUCKET=",
|
||||||
|
"_APP_STORAGE_LINODE_ACCESS_KEY=",
|
||||||
|
"_APP_STORAGE_LINODE_SECRET=",
|
||||||
|
"_APP_STORAGE_LINODE_REGION=eu-central-1",
|
||||||
|
"_APP_STORAGE_LINODE_BUCKET=",
|
||||||
|
"_APP_STORAGE_WASABI_ACCESS_KEY=",
|
||||||
|
"_APP_STORAGE_WASABI_SECRET=",
|
||||||
|
"_APP_STORAGE_WASABI_REGION=eu-central-1",
|
||||||
|
"_APP_STORAGE_WASABI_BUCKET=",
|
||||||
|
"_APP_FUNCTIONS_SIZE_LIMIT=30000000",
|
||||||
|
"_APP_FUNCTIONS_BUILD_SIZE_LIMIT=2000000000",
|
||||||
|
"_APP_FUNCTIONS_TIMEOUT=900",
|
||||||
|
"_APP_FUNCTIONS_BUILD_TIMEOUT=900",
|
||||||
|
"_APP_FUNCTIONS_CONTAINERS=10",
|
||||||
|
"_APP_FUNCTIONS_CPUS=0",
|
||||||
|
"_APP_FUNCTIONS_MEMORY=0",
|
||||||
|
"_APP_FUNCTIONS_MEMORY_SWAP=0",
|
||||||
|
"_APP_FUNCTIONS_RUNTIMES=node-16.0,php-8.0,python-3.9,ruby-3.0",
|
||||||
|
"_APP_EXECUTOR_SECRET=your-secret-key",
|
||||||
|
"_APP_EXECUTOR_HOST=http://exc1/v1",
|
||||||
|
"_APP_EXECUTOR_RUNTIME_NETWORK=appwrite_runtimes",
|
||||||
|
"_APP_FUNCTIONS_ENVS=node-16.0,php-7.4,python-3.9,ruby-3.0",
|
||||||
|
"_APP_FUNCTIONS_INACTIVE_THRESHOLD=60",
|
||||||
|
"DOCKERHUB_PULL_USERNAME=",
|
||||||
|
"DOCKERHUB_PULL_PASSWORD=",
|
||||||
|
"DOCKERHUB_PULL_EMAIL=",
|
||||||
|
"OPEN_RUNTIMES_NETWORK=appwrite_runtimes",
|
||||||
|
"_APP_FUNCTIONS_RUNTIMES_NETWORK=runtimes",
|
||||||
|
"_APP_DOCKER_HUB_USERNAME=",
|
||||||
|
"_APP_DOCKER_HUB_PASSWORD=",
|
||||||
|
"_APP_FUNCTIONS_MAINTENANCE_INTERVAL=3600",
|
||||||
|
"_APP_VCS_GITHUB_APP_NAME=",
|
||||||
|
"_APP_VCS_GITHUB_PRIVATE_KEY=",
|
||||||
|
"_APP_VCS_GITHUB_APP_ID=",
|
||||||
|
"_APP_VCS_GITHUB_CLIENT_ID=",
|
||||||
|
"_APP_VCS_GITHUB_CLIENT_SECRET=",
|
||||||
|
"_APP_VCS_GITHUB_WEBHOOK_SECRET=",
|
||||||
|
"_APP_MAINTENANCE_INTERVAL=86400",
|
||||||
|
"_APP_MAINTENANCE_DELAY=0",
|
||||||
|
"_APP_MAINTENANCE_RETENTION_CACHE=2592000",
|
||||||
|
"_APP_MAINTENANCE_RETENTION_EXECUTION=1209600",
|
||||||
|
"_APP_MAINTENANCE_RETENTION_AUDIT=1209600",
|
||||||
|
"_APP_MAINTENANCE_RETENTION_ABUSE=86400",
|
||||||
|
"_APP_MAINTENANCE_RETENTION_USAGE_HOURLY=8640000",
|
||||||
|
"_APP_MAINTENANCE_RETENTION_SCHEDULES=86400",
|
||||||
|
"_APP_GRAPHQL_MAX_BATCH_SIZE=10",
|
||||||
|
"_APP_GRAPHQL_MAX_COMPLEXITY=250",
|
||||||
|
"_APP_GRAPHQL_MAX_DEPTH=3",
|
||||||
|
"_APP_MIGRATIONS_FIREBASE_CLIENT_ID=",
|
||||||
|
"_APP_MIGRATIONS_FIREBASE_CLIENT_SECRET=",
|
||||||
|
"_APP_ASSISTANT_OPENAI_API_KEY=",
|
||||||
|
];
|
||||||
|
|
||||||
|
return {
|
||||||
|
domains,
|
||||||
|
envs,
|
||||||
|
mounts: [],
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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'
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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
|
|
||||||
@@ -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
|
||||||
|
|||||||
37
apps/dokploy/templates/convex/docker-compose.yml
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
services:
|
||||||
|
backend:
|
||||||
|
image: ghcr.io/get-convex/convex-backend:6c974d219776b753cd23d26f4a296629ff7c2cad
|
||||||
|
ports:
|
||||||
|
- "${PORT:-3210}:3210"
|
||||||
|
- "${SITE_PROXY_PORT:-3211}:3211"
|
||||||
|
volumes:
|
||||||
|
- data:/convex/data
|
||||||
|
environment:
|
||||||
|
- INSTANCE_NAME=${INSTANCE_NAME:-}
|
||||||
|
- INSTANCE_SECRET=${INSTANCE_SECRET:-}
|
||||||
|
- CONVEX_RELEASE_VERSION_DEV=${CONVEX_RELEASE_VERSION_DEV:-}
|
||||||
|
- ACTIONS_USER_TIMEOUT_SECS=${ACTIONS_USER_TIMEOUT_SECS:-}
|
||||||
|
- CONVEX_CLOUD_ORIGIN=${CONVEX_CLOUD_ORIGIN:-http://127.0.0.1:3210}
|
||||||
|
- CONVEX_SITE_ORIGIN=${CONVEX_SITE_ORIGIN:-http://127.0.0.1:3211}
|
||||||
|
- DATABASE_URL=${DATABASE_URL:-}
|
||||||
|
- DISABLE_BEACON=${DISABLE_BEACON:-}
|
||||||
|
- REDACT_LOGS_TO_CLIENT=${REDACT_LOGS_TO_CLIENT:-}
|
||||||
|
- RUST_LOG=${RUST_LOG:-info}
|
||||||
|
- RUST_BACKTRACE=${RUST_BACKTRACE:-}
|
||||||
|
healthcheck:
|
||||||
|
test: curl -f http://localhost:3210/version
|
||||||
|
interval: 5s
|
||||||
|
start_period: 5s
|
||||||
|
|
||||||
|
dashboard:
|
||||||
|
image: ghcr.io/get-convex/convex-dashboard:4499dd4fd7f2148687a7774599c613d052950f46
|
||||||
|
ports:
|
||||||
|
- "${DASHBOARD_PORT:-6791}:6791"
|
||||||
|
environment:
|
||||||
|
- NEXT_PUBLIC_DEPLOYMENT_URL=${NEXT_PUBLIC_DEPLOYMENT_URL:-http://127.0.0.1:3210}
|
||||||
|
depends_on:
|
||||||
|
backend:
|
||||||
|
condition: service_healthy
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
data:
|
||||||
38
apps/dokploy/templates/convex/index.ts
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
import {
|
||||||
|
type DomainSchema,
|
||||||
|
type Schema,
|
||||||
|
type Template,
|
||||||
|
generateRandomDomain,
|
||||||
|
} from "../utils";
|
||||||
|
|
||||||
|
export function generate(schema: Schema): Template {
|
||||||
|
const dashboardDomain = generateRandomDomain(schema);
|
||||||
|
const backendDomain = generateRandomDomain(schema);
|
||||||
|
const actionsDomain = generateRandomDomain(schema);
|
||||||
|
|
||||||
|
const domains: DomainSchema[] = [
|
||||||
|
{
|
||||||
|
host: dashboardDomain,
|
||||||
|
port: 6791,
|
||||||
|
serviceName: "dashboard",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
host: backendDomain,
|
||||||
|
port: 3210,
|
||||||
|
serviceName: "backend",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
host: actionsDomain,
|
||||||
|
port: 3211,
|
||||||
|
serviceName: "backend",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
const envs = [
|
||||||
|
`NEXT_PUBLIC_DEPLOYMENT_URL=http://${backendDomain}`,
|
||||||
|
`CONVEX_CLOUD_ORIGIN=http://${backendDomain}`,
|
||||||
|
`CONVEX_SITE_ORIGIN=http://${actionsDomain}`,
|
||||||
|
];
|
||||||
|
|
||||||
|
return { envs, domains };
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -189,7 +189,7 @@ services:
|
|||||||
bench set-config -g redis_socketio "redis://$$REDIS_QUEUE";
|
bench set-config -g redis_socketio "redis://$$REDIS_QUEUE";
|
||||||
bench set-config -gp socketio_port $$SOCKETIO_PORT;
|
bench set-config -gp socketio_port $$SOCKETIO_PORT;
|
||||||
environment:
|
environment:
|
||||||
DB_HOST: db
|
DB_HOST: "${DB_HOST:-db}"
|
||||||
DB_PORT: "3306"
|
DB_PORT: "3306"
|
||||||
REDIS_CACHE: redis-cache:6379
|
REDIS_CACHE: redis-cache:6379
|
||||||
REDIS_QUEUE: redis-queue:6379
|
REDIS_QUEUE: redis-queue:6379
|
||||||
@@ -210,7 +210,7 @@ services:
|
|||||||
entrypoint: ["bash", "-c"]
|
entrypoint: ["bash", "-c"]
|
||||||
command:
|
command:
|
||||||
- >
|
- >
|
||||||
wait-for-it -t 120 db:3306;
|
wait-for-it -t 120 $$DB_HOST:$$DB_PORT;
|
||||||
wait-for-it -t 120 redis-cache:6379;
|
wait-for-it -t 120 redis-cache:6379;
|
||||||
wait-for-it -t 120 redis-queue:6379;
|
wait-for-it -t 120 redis-queue:6379;
|
||||||
export start=`date +%s`;
|
export start=`date +%s`;
|
||||||
@@ -231,10 +231,12 @@ services:
|
|||||||
volumes:
|
volumes:
|
||||||
- sites:/home/frappe/frappe-bench/sites
|
- sites:/home/frappe/frappe-bench/sites
|
||||||
environment:
|
environment:
|
||||||
|
SITE_NAME: ${SITE_NAME}
|
||||||
ADMIN_PASSWORD: ${ADMIN_PASSWORD}
|
ADMIN_PASSWORD: ${ADMIN_PASSWORD}
|
||||||
|
DB_HOST: ${DB_HOST:-db}
|
||||||
|
DB_PORT: "${DB_PORT:-3306}"
|
||||||
DB_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
|
DB_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
|
||||||
INSTALL_APP_ARGS: ${INSTALL_APP_ARGS}
|
INSTALL_APP_ARGS: ${INSTALL_APP_ARGS}
|
||||||
SITE_NAME: ${SITE_NAME}
|
|
||||||
networks:
|
networks:
|
||||||
- bench-network
|
- bench-network
|
||||||
|
|
||||||
@@ -262,6 +264,8 @@ services:
|
|||||||
db:
|
db:
|
||||||
image: mariadb:10.6
|
image: mariadb:10.6
|
||||||
deploy:
|
deploy:
|
||||||
|
mode: replicated
|
||||||
|
replicas: ${ENABLE_DB:-0}
|
||||||
restart_policy:
|
restart_policy:
|
||||||
condition: always
|
condition: always
|
||||||
healthcheck:
|
healthcheck:
|
||||||
@@ -341,6 +345,10 @@ volumes:
|
|||||||
redis-queue-data:
|
redis-queue-data:
|
||||||
redis-socketio-data:
|
redis-socketio-data:
|
||||||
sites:
|
sites:
|
||||||
|
driver_opts:
|
||||||
|
type: "${SITE_VOLUME_TYPE}"
|
||||||
|
o: "${SITE_VOLUME_OPTS}"
|
||||||
|
device: "${SITE_VOLUME_DEV}"
|
||||||
|
|
||||||
networks:
|
networks:
|
||||||
bench-network:
|
bench-network:
|
||||||
@@ -24,6 +24,8 @@ export function generate(schema: Schema): Template {
|
|||||||
`ADMIN_PASSWORD=${adminPassword}`,
|
`ADMIN_PASSWORD=${adminPassword}`,
|
||||||
`DB_ROOT_PASSWORD=${dbRootPassword}`,
|
`DB_ROOT_PASSWORD=${dbRootPassword}`,
|
||||||
"MIGRATE=1",
|
"MIGRATE=1",
|
||||||
|
"ENABLE_DB=1",
|
||||||
|
"DB_HOST=db",
|
||||||
"CREATE_SITE=1",
|
"CREATE_SITE=1",
|
||||||
"CONFIGURE=1",
|
"CONFIGURE=1",
|
||||||
"REGENERATE_APPS_TXT=1",
|
"REGENERATE_APPS_TXT=1",
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -2,6 +2,5 @@ version: "3.8"
|
|||||||
|
|
||||||
services:
|
services:
|
||||||
excalidraw:
|
excalidraw:
|
||||||
networks:
|
|
||||||
- dokploy-network
|
|
||||||
image: excalidraw/excalidraw:latest
|
image: excalidraw/excalidraw:latest
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
354
apps/dokploy/templates/frappe-hr/docker-compose.yml
Normal file
@@ -0,0 +1,354 @@
|
|||||||
|
x-custom-image: &custom_image
|
||||||
|
image: ${IMAGE_NAME:-ghcr.io/frappe/hrms}:${VERSION:-version-15}
|
||||||
|
pull_policy: ${PULL_POLICY:-always}
|
||||||
|
deploy:
|
||||||
|
restart_policy:
|
||||||
|
condition: always
|
||||||
|
|
||||||
|
services:
|
||||||
|
backend:
|
||||||
|
<<: *custom_image
|
||||||
|
volumes:
|
||||||
|
- sites:/home/frappe/frappe-bench/sites
|
||||||
|
networks:
|
||||||
|
- bench-network
|
||||||
|
healthcheck:
|
||||||
|
test:
|
||||||
|
- CMD
|
||||||
|
- wait-for-it
|
||||||
|
- '0.0.0.0:8000'
|
||||||
|
interval: 2s
|
||||||
|
timeout: 10s
|
||||||
|
retries: 30
|
||||||
|
|
||||||
|
frontend:
|
||||||
|
<<: *custom_image
|
||||||
|
command:
|
||||||
|
- nginx-entrypoint.sh
|
||||||
|
depends_on:
|
||||||
|
backend:
|
||||||
|
condition: service_started
|
||||||
|
required: true
|
||||||
|
websocket:
|
||||||
|
condition: service_started
|
||||||
|
required: true
|
||||||
|
environment:
|
||||||
|
BACKEND: backend:8000
|
||||||
|
FRAPPE_SITE_NAME_HEADER: ${FRAPPE_SITE_NAME_HEADER:-$$host}
|
||||||
|
SOCKETIO: websocket:9000
|
||||||
|
UPSTREAM_REAL_IP_ADDRESS: 127.0.0.1
|
||||||
|
UPSTREAM_REAL_IP_HEADER: X-Forwarded-For
|
||||||
|
UPSTREAM_REAL_IP_RECURSIVE: "off"
|
||||||
|
volumes:
|
||||||
|
- sites:/home/frappe/frappe-bench/sites
|
||||||
|
|
||||||
|
networks:
|
||||||
|
- bench-network
|
||||||
|
|
||||||
|
healthcheck:
|
||||||
|
test:
|
||||||
|
- CMD
|
||||||
|
- wait-for-it
|
||||||
|
- '0.0.0.0:8080'
|
||||||
|
interval: 2s
|
||||||
|
timeout: 30s
|
||||||
|
retries: 30
|
||||||
|
|
||||||
|
queue-default:
|
||||||
|
<<: *custom_image
|
||||||
|
command:
|
||||||
|
- bench
|
||||||
|
- worker
|
||||||
|
- --queue
|
||||||
|
- default
|
||||||
|
volumes:
|
||||||
|
- sites:/home/frappe/frappe-bench/sites
|
||||||
|
networks:
|
||||||
|
- bench-network
|
||||||
|
healthcheck:
|
||||||
|
test:
|
||||||
|
- CMD
|
||||||
|
- wait-for-it
|
||||||
|
- 'redis-queue:6379'
|
||||||
|
interval: 2s
|
||||||
|
timeout: 10s
|
||||||
|
retries: 30
|
||||||
|
depends_on:
|
||||||
|
configurator:
|
||||||
|
condition: service_completed_successfully
|
||||||
|
required: true
|
||||||
|
|
||||||
|
queue-long:
|
||||||
|
<<: *custom_image
|
||||||
|
command:
|
||||||
|
- bench
|
||||||
|
- worker
|
||||||
|
- --queue
|
||||||
|
- long
|
||||||
|
volumes:
|
||||||
|
- sites:/home/frappe/frappe-bench/sites
|
||||||
|
networks:
|
||||||
|
- bench-network
|
||||||
|
healthcheck:
|
||||||
|
test:
|
||||||
|
- CMD
|
||||||
|
- wait-for-it
|
||||||
|
- 'redis-queue:6379'
|
||||||
|
interval: 2s
|
||||||
|
timeout: 10s
|
||||||
|
retries: 30
|
||||||
|
depends_on:
|
||||||
|
configurator:
|
||||||
|
condition: service_completed_successfully
|
||||||
|
required: true
|
||||||
|
|
||||||
|
queue-short:
|
||||||
|
<<: *custom_image
|
||||||
|
command:
|
||||||
|
- bench
|
||||||
|
- worker
|
||||||
|
- --queue
|
||||||
|
- short
|
||||||
|
volumes:
|
||||||
|
- sites:/home/frappe/frappe-bench/sites
|
||||||
|
networks:
|
||||||
|
- bench-network
|
||||||
|
healthcheck:
|
||||||
|
test:
|
||||||
|
- CMD
|
||||||
|
- wait-for-it
|
||||||
|
- 'redis-queue:6379'
|
||||||
|
interval: 2s
|
||||||
|
timeout: 10s
|
||||||
|
retries: 30
|
||||||
|
depends_on:
|
||||||
|
configurator:
|
||||||
|
condition: service_completed_successfully
|
||||||
|
required: true
|
||||||
|
|
||||||
|
scheduler:
|
||||||
|
<<: *custom_image
|
||||||
|
healthcheck:
|
||||||
|
test:
|
||||||
|
- CMD
|
||||||
|
- wait-for-it
|
||||||
|
- 'redis-queue:6379'
|
||||||
|
interval: 2s
|
||||||
|
timeout: 10s
|
||||||
|
retries: 30
|
||||||
|
command:
|
||||||
|
- bench
|
||||||
|
- schedule
|
||||||
|
depends_on:
|
||||||
|
configurator:
|
||||||
|
condition: service_completed_successfully
|
||||||
|
required: true
|
||||||
|
volumes:
|
||||||
|
- sites:/home/frappe/frappe-bench/sites
|
||||||
|
networks:
|
||||||
|
- bench-network
|
||||||
|
|
||||||
|
websocket:
|
||||||
|
<<: *custom_image
|
||||||
|
healthcheck:
|
||||||
|
test:
|
||||||
|
- CMD
|
||||||
|
- wait-for-it
|
||||||
|
- '0.0.0.0:9000'
|
||||||
|
interval: 2s
|
||||||
|
timeout: 10s
|
||||||
|
retries: 30
|
||||||
|
command:
|
||||||
|
- node
|
||||||
|
- /home/frappe/frappe-bench/apps/frappe/socketio.js
|
||||||
|
depends_on:
|
||||||
|
configurator:
|
||||||
|
condition: service_completed_successfully
|
||||||
|
required: true
|
||||||
|
volumes:
|
||||||
|
- sites:/home/frappe/frappe-bench/sites
|
||||||
|
networks:
|
||||||
|
- bench-network
|
||||||
|
|
||||||
|
configurator:
|
||||||
|
<<: *custom_image
|
||||||
|
deploy:
|
||||||
|
mode: replicated
|
||||||
|
replicas: ${CONFIGURE:-0}
|
||||||
|
restart_policy:
|
||||||
|
condition: none
|
||||||
|
entrypoint: ["bash", "-c"]
|
||||||
|
command:
|
||||||
|
- >
|
||||||
|
[[ $${REGENERATE_APPS_TXT} == "1" ]] && ls -1 apps > sites/apps.txt;
|
||||||
|
[[ -n `grep -hs ^ sites/common_site_config.json | jq -r ".db_host // empty"` ]] && exit 0;
|
||||||
|
bench set-config -g db_host $$DB_HOST;
|
||||||
|
bench set-config -gp db_port $$DB_PORT;
|
||||||
|
bench set-config -g redis_cache "redis://$$REDIS_CACHE";
|
||||||
|
bench set-config -g redis_queue "redis://$$REDIS_QUEUE";
|
||||||
|
bench set-config -g redis_socketio "redis://$$REDIS_QUEUE";
|
||||||
|
bench set-config -gp socketio_port $$SOCKETIO_PORT;
|
||||||
|
environment:
|
||||||
|
DB_HOST: "${DB_HOST:-db}"
|
||||||
|
DB_PORT: "3306"
|
||||||
|
REDIS_CACHE: redis-cache:6379
|
||||||
|
REDIS_QUEUE: redis-queue:6379
|
||||||
|
SOCKETIO_PORT: "9000"
|
||||||
|
REGENERATE_APPS_TXT: "${REGENERATE_APPS_TXT:-0}"
|
||||||
|
volumes:
|
||||||
|
- sites:/home/frappe/frappe-bench/sites
|
||||||
|
networks:
|
||||||
|
- bench-network
|
||||||
|
|
||||||
|
create-site:
|
||||||
|
<<: *custom_image
|
||||||
|
deploy:
|
||||||
|
mode: replicated
|
||||||
|
replicas: ${CREATE_SITE:-0}
|
||||||
|
restart_policy:
|
||||||
|
condition: none
|
||||||
|
entrypoint: ["bash", "-c"]
|
||||||
|
command:
|
||||||
|
- >
|
||||||
|
wait-for-it -t 120 $$DB_HOST:$$DB_PORT;
|
||||||
|
wait-for-it -t 120 redis-cache:6379;
|
||||||
|
wait-for-it -t 120 redis-queue:6379;
|
||||||
|
export start=`date +%s`;
|
||||||
|
until [[ -n `grep -hs ^ sites/common_site_config.json | jq -r ".db_host // empty"` ]] && \
|
||||||
|
[[ -n `grep -hs ^ sites/common_site_config.json | jq -r ".redis_cache // empty"` ]] && \
|
||||||
|
[[ -n `grep -hs ^ sites/common_site_config.json | jq -r ".redis_queue // empty"` ]];
|
||||||
|
do
|
||||||
|
echo "Waiting for sites/common_site_config.json to be created";
|
||||||
|
sleep 5;
|
||||||
|
if (( `date +%s`-start > 120 )); then
|
||||||
|
echo "could not find sites/common_site_config.json with required keys";
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
done;
|
||||||
|
echo "sites/common_site_config.json found";
|
||||||
|
[[ -d "sites/${SITE_NAME}" ]] && echo "${SITE_NAME} already exists" && exit 0;
|
||||||
|
bench new-site --mariadb-user-host-login-scope='%' --admin-password=$${ADMIN_PASSWORD} --db-root-username=root --db-root-password=$${DB_ROOT_PASSWORD} $${INSTALL_APP_ARGS} $${SITE_NAME};
|
||||||
|
volumes:
|
||||||
|
- sites:/home/frappe/frappe-bench/sites
|
||||||
|
environment:
|
||||||
|
SITE_NAME: ${SITE_NAME}
|
||||||
|
ADMIN_PASSWORD: ${ADMIN_PASSWORD}
|
||||||
|
DB_HOST: ${DB_HOST:-db}
|
||||||
|
DB_PORT: "${DB_PORT:-3306}"
|
||||||
|
DB_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
|
||||||
|
INSTALL_APP_ARGS: ${INSTALL_APP_ARGS}
|
||||||
|
networks:
|
||||||
|
- bench-network
|
||||||
|
|
||||||
|
migration:
|
||||||
|
<<: *custom_image
|
||||||
|
deploy:
|
||||||
|
mode: replicated
|
||||||
|
replicas: ${MIGRATE:-0}
|
||||||
|
restart_policy:
|
||||||
|
condition: none
|
||||||
|
entrypoint: ["bash", "-c"]
|
||||||
|
command:
|
||||||
|
- >
|
||||||
|
curl -f http://${SITE_NAME}:8080/api/method/ping || echo "Site busy" && exit 0;
|
||||||
|
bench --site all set-config -p maintenance_mode 1;
|
||||||
|
bench --site all set-config -p pause_scheduler 1;
|
||||||
|
bench --site all migrate;
|
||||||
|
bench --site all set-config -p maintenance_mode 0;
|
||||||
|
bench --site all set-config -p pause_scheduler 0;
|
||||||
|
volumes:
|
||||||
|
- sites:/home/frappe/frappe-bench/sites
|
||||||
|
networks:
|
||||||
|
- bench-network
|
||||||
|
|
||||||
|
db:
|
||||||
|
image: mariadb:10.6
|
||||||
|
deploy:
|
||||||
|
mode: replicated
|
||||||
|
replicas: ${ENABLE_DB:-0}
|
||||||
|
restart_policy:
|
||||||
|
condition: always
|
||||||
|
healthcheck:
|
||||||
|
test: mysqladmin ping -h localhost --password=${DB_ROOT_PASSWORD}
|
||||||
|
interval: 1s
|
||||||
|
retries: 20
|
||||||
|
command:
|
||||||
|
- --character-set-server=utf8mb4
|
||||||
|
- --collation-server=utf8mb4_unicode_ci
|
||||||
|
- --skip-character-set-client-handshake
|
||||||
|
- --skip-innodb-read-only-compressed
|
||||||
|
environment:
|
||||||
|
- MYSQL_ROOT_PASSWORD=${DB_ROOT_PASSWORD}
|
||||||
|
- MARIADB_ROOT_PASSWORD=${DB_ROOT_PASSWORD}
|
||||||
|
volumes:
|
||||||
|
- db-data:/var/lib/mysql
|
||||||
|
networks:
|
||||||
|
- bench-network
|
||||||
|
|
||||||
|
redis-cache:
|
||||||
|
deploy:
|
||||||
|
restart_policy:
|
||||||
|
condition: always
|
||||||
|
image: redis:6.2-alpine
|
||||||
|
volumes:
|
||||||
|
- redis-cache-data:/data
|
||||||
|
networks:
|
||||||
|
- bench-network
|
||||||
|
healthcheck:
|
||||||
|
test:
|
||||||
|
- CMD
|
||||||
|
- redis-cli
|
||||||
|
- ping
|
||||||
|
interval: 5s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 3
|
||||||
|
|
||||||
|
redis-queue:
|
||||||
|
deploy:
|
||||||
|
restart_policy:
|
||||||
|
condition: always
|
||||||
|
image: redis:6.2-alpine
|
||||||
|
volumes:
|
||||||
|
- redis-queue-data:/data
|
||||||
|
networks:
|
||||||
|
- bench-network
|
||||||
|
healthcheck:
|
||||||
|
test:
|
||||||
|
- CMD
|
||||||
|
- redis-cli
|
||||||
|
- ping
|
||||||
|
interval: 5s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 3
|
||||||
|
|
||||||
|
redis-socketio:
|
||||||
|
deploy:
|
||||||
|
restart_policy:
|
||||||
|
condition: always
|
||||||
|
image: redis:6.2-alpine
|
||||||
|
volumes:
|
||||||
|
- redis-socketio-data:/data
|
||||||
|
networks:
|
||||||
|
- bench-network
|
||||||
|
healthcheck:
|
||||||
|
test:
|
||||||
|
- CMD
|
||||||
|
- redis-cli
|
||||||
|
- ping
|
||||||
|
interval: 5s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 3
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
db-data:
|
||||||
|
redis-cache-data:
|
||||||
|
redis-queue-data:
|
||||||
|
redis-socketio-data:
|
||||||
|
sites:
|
||||||
|
driver_opts:
|
||||||
|
type: "${SITE_VOLUME_TYPE}"
|
||||||
|
o: "${SITE_VOLUME_OPTS}"
|
||||||
|
device: "${SITE_VOLUME_DEV}"
|
||||||
|
|
||||||
|
networks:
|
||||||
|
bench-network:
|
||||||
39
apps/dokploy/templates/frappe-hr/index.ts
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
import {
|
||||||
|
type DomainSchema,
|
||||||
|
type Schema,
|
||||||
|
type Template,
|
||||||
|
generatePassword,
|
||||||
|
generateRandomDomain,
|
||||||
|
} from "../utils";
|
||||||
|
|
||||||
|
export function generate(schema: Schema): Template {
|
||||||
|
const dbRootPassword = generatePassword(32);
|
||||||
|
const adminPassword = generatePassword(32);
|
||||||
|
const mainDomain = generateRandomDomain(schema);
|
||||||
|
|
||||||
|
const domains: DomainSchema[] = [
|
||||||
|
{
|
||||||
|
host: mainDomain,
|
||||||
|
port: 8080,
|
||||||
|
serviceName: "frontend",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
const envs = [
|
||||||
|
`SITE_NAME=${mainDomain}`,
|
||||||
|
`ADMIN_PASSWORD=${adminPassword}`,
|
||||||
|
`DB_ROOT_PASSWORD=${dbRootPassword}`,
|
||||||
|
"MIGRATE=1",
|
||||||
|
"ENABLE_DB=1",
|
||||||
|
"DB_HOST=db",
|
||||||
|
"CREATE_SITE=1",
|
||||||
|
"CONFIGURE=1",
|
||||||
|
"REGENERATE_APPS_TXT=1",
|
||||||
|
"INSTALL_APP_ARGS=--install-app hrms",
|
||||||
|
"IMAGE_NAME=ghcr.io/frappe/hrms",
|
||||||
|
"VERSION=version-15",
|
||||||
|
"FRAPPE_SITE_NAME_HEADER=",
|
||||||
|
];
|
||||||
|
|
||||||
|
return { envs, domains };
|
||||||
|
}
|
||||||
@@ -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:
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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}
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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
|
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
57
apps/dokploy/templates/outline/docker-compose.yml
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
services:
|
||||||
|
outline:
|
||||||
|
image: outlinewiki/outline:0.82.0
|
||||||
|
restart: always
|
||||||
|
depends_on:
|
||||||
|
- postgres
|
||||||
|
- redis
|
||||||
|
- dex
|
||||||
|
ports:
|
||||||
|
- 3000
|
||||||
|
environment:
|
||||||
|
NODE_ENV: production
|
||||||
|
URL: ${URL}
|
||||||
|
FORCE_HTTPS: 'false'
|
||||||
|
SECRET_KEY: ${SECRET_KEY}
|
||||||
|
UTILS_SECRET: ${UTILS_SECRET}
|
||||||
|
DATABASE_URL: postgres://outline:${POSTGRES_PASSWORD}@postgres:5432/outline
|
||||||
|
PGSSLMODE: disable
|
||||||
|
REDIS_URL: redis://redis:6379
|
||||||
|
OIDC_CLIENT_ID: outline
|
||||||
|
OIDC_CLIENT_SECRET: ${CLIENT_SECRET}
|
||||||
|
OIDC_AUTH_URI: ${DEX_URL}/auth
|
||||||
|
OIDC_TOKEN_URI: ${DEX_URL}/token
|
||||||
|
OIDC_USERINFO_URI: ${DEX_URL}/userinfo
|
||||||
|
|
||||||
|
dex:
|
||||||
|
image: ghcr.io/dexidp/dex:v2.37.0
|
||||||
|
restart: always
|
||||||
|
volumes:
|
||||||
|
- ../files/etc/dex/config.yaml:/etc/dex/config.yaml
|
||||||
|
command:
|
||||||
|
- dex
|
||||||
|
- serve
|
||||||
|
- /etc/dex/config.yaml
|
||||||
|
ports:
|
||||||
|
- 5556
|
||||||
|
|
||||||
|
postgres:
|
||||||
|
image: postgres:15
|
||||||
|
restart: always
|
||||||
|
environment:
|
||||||
|
POSTGRES_DB: outline
|
||||||
|
POSTGRES_USER: outline
|
||||||
|
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
|
||||||
|
volumes:
|
||||||
|
- postgres_data-test-outline-khufpx:/var/lib/postgresql/data
|
||||||
|
|
||||||
|
redis:
|
||||||
|
image: redis:latest
|
||||||
|
restart: always
|
||||||
|
command: redis-server --appendonly yes
|
||||||
|
volumes:
|
||||||
|
- redis_data-test-outline-khufpx:/data
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
postgres_data-test-outline-khufpx:
|
||||||
|
redis_data-test-outline-khufpx:
|
||||||
90
apps/dokploy/templates/outline/index.ts
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
import {
|
||||||
|
type DomainSchema,
|
||||||
|
type Schema,
|
||||||
|
type Template,
|
||||||
|
generateBase64,
|
||||||
|
generatePassword,
|
||||||
|
generateRandomDomain,
|
||||||
|
} from "../utils";
|
||||||
|
|
||||||
|
export function generate(schema: Schema): Template {
|
||||||
|
const mainDomain = generateRandomDomain(schema);
|
||||||
|
const dexDomain = generateRandomDomain(schema);
|
||||||
|
const SECRET_KEY = generateBase64(32);
|
||||||
|
const UTILS_SECRET = generateBase64(32);
|
||||||
|
const CLIENT_SECRET = generateBase64(32);
|
||||||
|
const POSTGRES_PASSWORD = generatePassword();
|
||||||
|
|
||||||
|
const mainURL = `http://${mainDomain}`;
|
||||||
|
const dexURL = `http://${dexDomain}`;
|
||||||
|
|
||||||
|
const domains: DomainSchema[] = [
|
||||||
|
{
|
||||||
|
host: mainDomain,
|
||||||
|
port: 3000,
|
||||||
|
serviceName: "outline",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
host: dexDomain,
|
||||||
|
port: 5556,
|
||||||
|
serviceName: "dex",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
const mounts: Template["mounts"] = [
|
||||||
|
{
|
||||||
|
filePath: "/etc/dex/config.yaml",
|
||||||
|
content: `issuer: ${dexURL}
|
||||||
|
|
||||||
|
web:
|
||||||
|
http: 0.0.0.0:5556
|
||||||
|
|
||||||
|
storage:
|
||||||
|
type: memory
|
||||||
|
|
||||||
|
enablePasswordDB: true
|
||||||
|
|
||||||
|
frontend:
|
||||||
|
issuer: Outline
|
||||||
|
|
||||||
|
logger:
|
||||||
|
level: debug
|
||||||
|
|
||||||
|
staticPasswords:
|
||||||
|
- email: "admin@example.com"
|
||||||
|
# bcrypt hash of the string "password": $(echo password | htpasswd -BinC 10 admin | cut -d: -f2)
|
||||||
|
hash: "$2y$10$jsRWHw54uxTUIfhjgUrB9u8HSzPk7TUuQri9sXZrKzRXcScvwYor."
|
||||||
|
username: "admin"
|
||||||
|
userID: "1"
|
||||||
|
|
||||||
|
|
||||||
|
oauth2:
|
||||||
|
skipApprovalScreen: true
|
||||||
|
alwaysShowLoginScreen: false
|
||||||
|
passwordConnector: local
|
||||||
|
|
||||||
|
staticClients:
|
||||||
|
- id: "outline"
|
||||||
|
redirectURIs:
|
||||||
|
- ${mainURL}/auth/oidc.callback
|
||||||
|
name: "Outline"
|
||||||
|
secret: "${CLIENT_SECRET}"`,
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
const envs = [
|
||||||
|
`URL=${mainURL}`,
|
||||||
|
`DEX_URL=${dexURL}`,
|
||||||
|
`DOMAIN_NAME=${mainDomain}`,
|
||||||
|
`POSTGRES_PASSWORD=${POSTGRES_PASSWORD}`,
|
||||||
|
`SECRET_KEY=${SECRET_KEY}`,
|
||||||
|
`UTILS_SECRET=${UTILS_SECRET}`,
|
||||||
|
`CLIENT_SECRET=${CLIENT_SECRET}`,
|
||||||
|
];
|
||||||
|
|
||||||
|
return {
|
||||||
|
domains,
|
||||||
|
envs,
|
||||||
|
mounts,
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -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.
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -1,10 +1,8 @@
|
|||||||
version: "3.8"
|
|
||||||
services:
|
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 +11,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
|
||||||
@@ -26,7 +23,7 @@ services:
|
|||||||
hard: 262144
|
hard: 262144
|
||||||
|
|
||||||
plausible:
|
plausible:
|
||||||
image: ghcr.io/plausible/community-edition:v2.1.4
|
image: ghcr.io/plausible/community-edition:v2.1.5
|
||||||
restart: always
|
restart: always
|
||||||
command: sh -c "sleep 10 && /entrypoint.sh db createdb && /entrypoint.sh db migrate && /entrypoint.sh run"
|
command: sh -c "sleep 10 && /entrypoint.sh db createdb && /entrypoint.sh db migrate && /entrypoint.sh run"
|
||||||
depends_on:
|
depends_on:
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
version: "3.8"
|
version: "3.8"
|
||||||
services:
|
services:
|
||||||
pocketbase:
|
pocketbase:
|
||||||
image: spectado/pocketbase:0.25.0
|
image: spectado/pocketbase:0.23.3
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
volumes:
|
volumes:
|
||||||
- /etc/dokploy/templates/${HASH}/data:/pb_data
|
- /etc/dokploy/templates/${HASH}/data:/pb_data
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
19
apps/dokploy/templates/registry/docker-compose.yml
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
services:
|
||||||
|
registry:
|
||||||
|
restart: always
|
||||||
|
image: registry:2
|
||||||
|
ports:
|
||||||
|
- 5000
|
||||||
|
volumes:
|
||||||
|
- ../files/auth/registry.password:/auth/registry.password
|
||||||
|
- registry-data:/var/lib/registry
|
||||||
|
environment:
|
||||||
|
REGISTRY_STORAGE_DELETE_ENABLED: true
|
||||||
|
REGISTRY_HEALTH_STORAGEDRIVER_ENABLED: false
|
||||||
|
REGISTRY_HTTP_SECRET: ${REGISTRY_HTTP_SECRET}
|
||||||
|
REGISTRY_AUTH: htpasswd
|
||||||
|
REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm
|
||||||
|
REGISTRY_AUTH_HTPASSWD_PATH: /auth/registry.password
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
registry-data:
|
||||||
35
apps/dokploy/templates/registry/index.ts
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
import {
|
||||||
|
type DomainSchema,
|
||||||
|
type Schema,
|
||||||
|
type Template,
|
||||||
|
generatePassword,
|
||||||
|
generateRandomDomain,
|
||||||
|
} from "../utils";
|
||||||
|
|
||||||
|
export function generate(schema: Schema): Template {
|
||||||
|
const domains: DomainSchema[] = [
|
||||||
|
{
|
||||||
|
host: generateRandomDomain(schema),
|
||||||
|
port: 5000,
|
||||||
|
serviceName: "registry",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
const registryHttpSecret = generatePassword(30);
|
||||||
|
|
||||||
|
const envs = [`REGISTRY_HTTP_SECRET=${registryHttpSecret}`];
|
||||||
|
|
||||||
|
const mounts: Template["mounts"] = [
|
||||||
|
{
|
||||||
|
filePath: "/auth/registry.password",
|
||||||
|
content:
|
||||||
|
"# from: docker run --rm --entrypoint htpasswd httpd:2 -Bbn docker password\ndocker:$2y$10$qWZoWev/u5PV7WneFoRAMuoGpRcAQOgUuIIdLnU7pJXogrBSY23/2\n",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
return {
|
||||||
|
domains,
|
||||||
|
envs,
|
||||||
|
mounts,
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -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 }
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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:
|
||||||
[
|
[
|
||||||
|
|||||||
@@ -1,5 +1,8 @@
|
|||||||
# Note: this is an UNOFFICIAL production docker image build for Superset:
|
# This is an UNOFFICIAL production docker image build for Superset:
|
||||||
# - https://github.com/amancevice/docker-superset
|
# - https://github.com/amancevice/docker-superset
|
||||||
|
|
||||||
|
|
||||||
|
# ## SETUP INSTRUCTIONS
|
||||||
#
|
#
|
||||||
# After deploying this image, you will need to run one of the two
|
# After deploying this image, you will need to run one of the two
|
||||||
# commands below in a terminal within the superset container:
|
# commands below in a terminal within the superset container:
|
||||||
@@ -7,11 +10,30 @@
|
|||||||
# $ superset-init # Initialise database only
|
# $ superset-init # Initialise database only
|
||||||
#
|
#
|
||||||
# You will be prompted to enter the credentials for the admin user.
|
# You will be prompted to enter the credentials for the admin user.
|
||||||
|
|
||||||
|
|
||||||
|
# ## NETWORK INSTRUCTIONS
|
||||||
|
#
|
||||||
|
# If you want to connect superset with other internal databases managed by
|
||||||
|
# Dokploy (on dokploy-network) using internal hostnames, you will need to
|
||||||
|
# uncomment the `networks` section, both for the superset container and
|
||||||
|
# at the very bottom of this docker-compose template.
|
||||||
|
#
|
||||||
|
# Note that the `superset` service name/hostname will not be unique on the
|
||||||
|
# global `dokploy-network`. If you plan to:
|
||||||
|
#
|
||||||
|
# 1. deploy a second instance of superset on dokploy-network, and
|
||||||
|
# 2. have other containers on dokploy-network utilise the second instance's
|
||||||
|
# Superset API (https://superset.apache.org/docs/api)
|
||||||
|
#
|
||||||
|
# Please change the service name of the second instance.
|
||||||
|
|
||||||
services:
|
services:
|
||||||
superset:
|
superset:
|
||||||
image: amancevice/superset
|
image: amancevice/superset
|
||||||
restart: always
|
restart: always
|
||||||
|
#networks:
|
||||||
|
# - dokploy-network
|
||||||
depends_on:
|
depends_on:
|
||||||
- superset_postgres
|
- superset_postgres
|
||||||
- superset_redis
|
- superset_redis
|
||||||
@@ -43,10 +65,8 @@ services:
|
|||||||
interval: 30s
|
interval: 30s
|
||||||
timeout: 10s
|
timeout: 10s
|
||||||
retries: 3
|
retries: 3
|
||||||
networks:
|
|
||||||
- dokploy-network
|
|
||||||
|
|
||||||
superset_redis:
|
superset_redis:
|
||||||
image: redis
|
image: redis
|
||||||
restart: always
|
restart: always
|
||||||
volumes:
|
volumes:
|
||||||
@@ -57,8 +77,10 @@ services:
|
|||||||
interval: 30s
|
interval: 30s
|
||||||
timeout: 10s
|
timeout: 10s
|
||||||
retries: 3
|
retries: 3
|
||||||
networks:
|
|
||||||
- dokploy-network
|
#networks:
|
||||||
|
# dokploy-network:
|
||||||
|
# external: true
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
superset_postgres_data:
|
superset_postgres_data:
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -1,6 +1,37 @@
|
|||||||
import type { TemplateData } from "./types/templates-data.type";
|
import type { TemplateData } from "./types/templates-data.type";
|
||||||
|
|
||||||
export const templates: TemplateData[] = [
|
export const templates: TemplateData[] = [
|
||||||
|
{
|
||||||
|
id: "appwrite",
|
||||||
|
name: "Appwrite",
|
||||||
|
version: "1.6.0",
|
||||||
|
description:
|
||||||
|
"Appwrite is an end-to-end backend server for Web, Mobile, Native, or Backend apps. Appwrite abstracts the complexity and repetitiveness required to build a modern backend API from scratch and allows you to build secure apps faster.\n" +
|
||||||
|
"Using Appwrite, you can easily integrate your app with user authentication and multiple sign-in methods, a database for storing and querying users and team data, storage and file management, image manipulation, Cloud Functions, messaging, and more services.",
|
||||||
|
links: {
|
||||||
|
github: "https://github.com/appwrite/appwrite",
|
||||||
|
website: "https://appwrite.io/",
|
||||||
|
docs: "https://appwrite.io/docs",
|
||||||
|
},
|
||||||
|
logo: "appwrite.svg",
|
||||||
|
tags: ["database", "firebase", "postgres"],
|
||||||
|
load: () => import("./appwrite/index").then((m) => m.generate),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "outline",
|
||||||
|
name: "Outline",
|
||||||
|
version: "0.82.0",
|
||||||
|
description:
|
||||||
|
"Outline is a self-hosted knowledge base and documentation platform that allows you to build and manage your own knowledge base applications.",
|
||||||
|
links: {
|
||||||
|
github: "https://github.com/outline/outline",
|
||||||
|
website: "https://outline.com/",
|
||||||
|
docs: "https://docs.outline.com/",
|
||||||
|
},
|
||||||
|
logo: "outline.png",
|
||||||
|
load: () => import("./outline/index").then((m) => m.generate),
|
||||||
|
tags: ["documentation", "knowledge-base", "self-hosted"],
|
||||||
|
},
|
||||||
{
|
{
|
||||||
id: "supabase",
|
id: "supabase",
|
||||||
name: "SupaBase",
|
name: "SupaBase",
|
||||||
@@ -34,7 +65,7 @@ export const templates: TemplateData[] = [
|
|||||||
{
|
{
|
||||||
id: "plausible",
|
id: "plausible",
|
||||||
name: "Plausible",
|
name: "Plausible",
|
||||||
version: "v2.1.4",
|
version: "v2.1.5",
|
||||||
description:
|
description:
|
||||||
"Plausible is a open source, self-hosted web analytics platform that lets you track website traffic and user behavior.",
|
"Plausible is a open source, self-hosted web analytics platform that lets you track website traffic and user behavior.",
|
||||||
logo: "plausible.svg",
|
logo: "plausible.svg",
|
||||||
@@ -170,7 +201,7 @@ export const templates: TemplateData[] = [
|
|||||||
{
|
{
|
||||||
id: "wordpress",
|
id: "wordpress",
|
||||||
name: "Wordpress",
|
name: "Wordpress",
|
||||||
version: "5.8.3",
|
version: "6.7.1",
|
||||||
description:
|
description:
|
||||||
"Wordpress is a free and open source content management system (CMS) for publishing and managing websites.",
|
"Wordpress is a free and open source content management system (CMS) for publishing and managing websites.",
|
||||||
logo: "wordpress.png",
|
logo: "wordpress.png",
|
||||||
@@ -1095,7 +1126,7 @@ export const templates: TemplateData[] = [
|
|||||||
{
|
{
|
||||||
id: "unsend",
|
id: "unsend",
|
||||||
name: "Unsend",
|
name: "Unsend",
|
||||||
version: "v1.2.4",
|
version: "v1.3.2",
|
||||||
description: "Open source alternative to Resend,Sendgrid, Postmark etc. ",
|
description: "Open source alternative to Resend,Sendgrid, Postmark etc. ",
|
||||||
logo: "unsend.png",
|
logo: "unsend.png",
|
||||||
links: {
|
links: {
|
||||||
@@ -1408,6 +1439,21 @@ export const templates: TemplateData[] = [
|
|||||||
tags: ["file-manager", "vdfs", "storage"],
|
tags: ["file-manager", "vdfs", "storage"],
|
||||||
load: () => import("./spacedrive/index").then((m) => m.generate),
|
load: () => import("./spacedrive/index").then((m) => m.generate),
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
id: "registry",
|
||||||
|
name: "Docker Registry",
|
||||||
|
version: "2",
|
||||||
|
description:
|
||||||
|
"Distribution implementation for storing and distributing of Docker container images and artifacts.",
|
||||||
|
links: {
|
||||||
|
github: "https://github.com/distribution/distribution",
|
||||||
|
website: "https://hub.docker.com/_/registry",
|
||||||
|
docs: "https://distribution.github.io/distribution/",
|
||||||
|
},
|
||||||
|
logo: "registry.png",
|
||||||
|
tags: ["registry", "docker", "self-hosted"],
|
||||||
|
load: () => import("./registry/index").then((m) => m.generate),
|
||||||
|
},
|
||||||
{
|
{
|
||||||
id: "alist",
|
id: "alist",
|
||||||
name: "AList",
|
name: "AList",
|
||||||
@@ -1453,6 +1499,21 @@ export const templates: TemplateData[] = [
|
|||||||
tags: ["sharing", "shortener", "url"],
|
tags: ["sharing", "shortener", "url"],
|
||||||
load: () => import("./shlink/index").then((m) => m.generate),
|
load: () => import("./shlink/index").then((m) => m.generate),
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
id: "frappe-hr",
|
||||||
|
name: "Frappe HR",
|
||||||
|
version: "version-15",
|
||||||
|
description:
|
||||||
|
"Feature rich HR & Payroll software. 100% FOSS and customizable.",
|
||||||
|
logo: "frappe-hr.svg",
|
||||||
|
links: {
|
||||||
|
github: "https://github.com/frappe/hrms",
|
||||||
|
docs: "https://docs.frappe.io/hr",
|
||||||
|
website: "https://frappe.io/hr",
|
||||||
|
},
|
||||||
|
tags: ["hrms", "payroll", "leaves", "expenses", "attendance", "performace"],
|
||||||
|
load: () => import("./frappe-hr/index").then((m) => m.generate),
|
||||||
|
},
|
||||||
{
|
{
|
||||||
id: "formbricks",
|
id: "formbricks",
|
||||||
name: "Formbricks",
|
name: "Formbricks",
|
||||||
@@ -1468,4 +1529,34 @@ 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),
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
id: "trilium",
|
||||||
|
name: "Trilium",
|
||||||
|
description:
|
||||||
|
"Trilium Notes is a hierarchical note taking application with focus on building large personal knowledge bases.",
|
||||||
|
logo: "trilium.png",
|
||||||
|
version: "latest",
|
||||||
|
links: {
|
||||||
|
github: "https://github.com/zadam/trilium",
|
||||||
|
website: "https://github.com/zadam/trilium",
|
||||||
|
docs: "https://github.com/zadam/trilium/wiki/",
|
||||||
|
},
|
||||||
|
tags: ["self-hosted", "productivity", "personal-use"],
|
||||||
|
load: () => import("./trilium/index").then((m) => m.generate),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "convex",
|
||||||
|
name: "Convex",
|
||||||
|
version: "latest",
|
||||||
|
description:
|
||||||
|
"Convex is an open-source reactive database designed to make life easy for web app developers.",
|
||||||
|
logo: "convex.svg",
|
||||||
|
links: {
|
||||||
|
github: "https://github.com/get-convex/convex",
|
||||||
|
website: "https://www.convex.dev/",
|
||||||
|
docs: "https://www.convex.dev/docs",
|
||||||
|
},
|
||||||
|
tags: ["backend", "database", "api"],
|
||||||
|
load: () => import("./convex/index").then((m) => m.generate),
|
||||||
|
},
|
||||||
];
|
];
|
||||||
|
|||||||
14
apps/dokploy/templates/trilium/docker-compose.yml
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
services:
|
||||||
|
trilium:
|
||||||
|
image: zadam/trilium:latest
|
||||||
|
ports:
|
||||||
|
- 8080
|
||||||
|
networks:
|
||||||
|
- dokploy-network
|
||||||
|
restart: always
|
||||||
|
volumes:
|
||||||
|
- /root/trilium-backups:/home/node/trilium-data/backup
|
||||||
|
|
||||||
|
networks:
|
||||||
|
dokploy-network:
|
||||||
|
external: true
|
||||||
22
apps/dokploy/templates/trilium/index.ts
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
import {
|
||||||
|
type DomainSchema,
|
||||||
|
type Schema,
|
||||||
|
type Template,
|
||||||
|
generateRandomDomain,
|
||||||
|
} from "../utils";
|
||||||
|
|
||||||
|
export function generate(schema: Schema): Template {
|
||||||
|
const triliumDomain = generateRandomDomain(schema);
|
||||||
|
|
||||||
|
const domains: DomainSchema[] = [
|
||||||
|
{
|
||||||
|
host: triliumDomain,
|
||||||
|
port: 8080,
|
||||||
|
serviceName: "trilium",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
return {
|
||||||
|
domains,
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -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:
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -47,9 +44,7 @@ services:
|
|||||||
command: -c 'mkdir -p /data/unsend && minio server /data --console-address ":9001" --address ":9002"'
|
command: -c 'mkdir -p /data/unsend && minio server /data --console-address ":9001" --address ":9002"'
|
||||||
|
|
||||||
unsend:
|
unsend:
|
||||||
image: unsend/unsend:v1.2.5
|
image: unsend/unsend:v1.3.2
|
||||||
networks:
|
|
||||||
- dokploy-network
|
|
||||||
restart: always
|
restart: always
|
||||||
ports:
|
ports:
|
||||||
- ${PORT:-3000}
|
- ${PORT:-3000}
|
||||||
|
|||||||
@@ -12,7 +12,9 @@ export interface Schema {
|
|||||||
projectName: string;
|
projectName: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export type DomainSchema = Pick<Domain, "host" | "port" | "serviceName">;
|
export type DomainSchema = Pick<Domain, "host" | "port" | "serviceName"> & {
|
||||||
|
path?: string;
|
||||||
|
};
|
||||||
|
|
||||||
export interface Template {
|
export interface Template {
|
||||||
envs?: string[];
|
envs?: string[];
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||