diff --git a/apps/dokploy/components/dashboard/docker/show/show-containers.tsx b/apps/dokploy/components/dashboard/docker/show/show-containers.tsx index 528e4d2c5..c66c9b9ba 100644 --- a/apps/dokploy/components/dashboard/docker/show/show-containers.tsx +++ b/apps/dokploy/components/dashboard/docker/show/show-containers.tsx @@ -1,13 +1,13 @@ import { - type ColumnFiltersState, - type SortingState, - type VisibilityState, - flexRender, - getCoreRowModel, - getFilteredRowModel, - getPaginationRowModel, - getSortedRowModel, - useReactTable, + type ColumnFiltersState, + type SortingState, + type VisibilityState, + flexRender, + getCoreRowModel, + getFilteredRowModel, + getPaginationRowModel, + getSortedRowModel, + useReactTable, } from "@tanstack/react-table"; import { ChevronDown, Container } from "lucide-react"; import * as React from "react"; @@ -15,228 +15,228 @@ import * as React from "react"; import { AlertBlock } from "@/components/shared/alert-block"; import { Button } from "@/components/ui/button"; import { - Card, - CardContent, - CardDescription, - CardHeader, - CardTitle, + Card, + CardContent, + CardDescription, + CardHeader, + CardTitle, } from "@/components/ui/card"; import { - DropdownMenu, - DropdownMenuCheckboxItem, - DropdownMenuContent, - DropdownMenuTrigger, + DropdownMenu, + DropdownMenuCheckboxItem, + DropdownMenuContent, + DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; import { Input } from "@/components/ui/input"; import { - Table, - TableBody, - TableCell, - TableHead, - TableHeader, - TableRow, + Table, + TableBody, + TableCell, + TableHead, + TableHeader, + TableRow, } from "@/components/ui/table"; import { type RouterOutputs, api } from "@/utils/api"; import { columns } from "./colums"; export type Container = NonNullable< - RouterOutputs["docker"]["getContainers"] + RouterOutputs["docker"]["getContainers"] >[0]; interface Props { - serverId?: string; + serverId?: string; } export const ShowContainers = ({ serverId }: Props) => { - const { data, isLoading } = api.docker.getContainers.useQuery({ - serverId, - }); + const { data, isLoading } = api.docker.getContainers.useQuery({ + serverId, + }); - const [sorting, setSorting] = React.useState([]); - const [columnFilters, setColumnFilters] = React.useState( - [] - ); - const [columnVisibility, setColumnVisibility] = - React.useState({}); - const [rowSelection, setRowSelection] = React.useState({}); + const [sorting, setSorting] = React.useState([]); + const [columnFilters, setColumnFilters] = React.useState( + [], + ); + const [columnVisibility, setColumnVisibility] = + React.useState({}); + const [rowSelection, setRowSelection] = React.useState({}); - const table = useReactTable({ - data: data ?? [], - columns, - onSortingChange: setSorting, - onColumnFiltersChange: setColumnFilters, - getCoreRowModel: getCoreRowModel(), - getPaginationRowModel: getPaginationRowModel(), - getSortedRowModel: getSortedRowModel(), - getFilteredRowModel: getFilteredRowModel(), - onColumnVisibilityChange: setColumnVisibility, - onRowSelectionChange: setRowSelection, - state: { - sorting, - columnFilters, - columnVisibility, - rowSelection, - }, - }); + const table = useReactTable({ + data: data ?? [], + columns, + onSortingChange: setSorting, + onColumnFiltersChange: setColumnFilters, + getCoreRowModel: getCoreRowModel(), + getPaginationRowModel: getPaginationRowModel(), + getSortedRowModel: getSortedRowModel(), + getFilteredRowModel: getFilteredRowModel(), + onColumnVisibilityChange: setColumnVisibility, + onRowSelectionChange: setRowSelection, + state: { + sorting, + columnFilters, + columnVisibility, + rowSelection, + }, + }); - return ( -
- -
- - - - Docker Containers - - - See all the containers of your dokploy server - - - -
-
-
- - table - .getColumn("name") - ?.setFilterValue(event.target.value) - } - className="md:max-w-sm" - /> - - - - - - {table - .getAllColumns() - .filter((column) => column.getCanHide()) - .map((column) => { - return ( - - column.toggleVisibility(!!value) - } - > - {column.id} - - ); - })} - - -
-
- {isLoading ? ( -
- - Loading... - -
- ) : data?.length === 0 ? ( -
- - No results. - -
- ) : ( - - - {table.getHeaderGroups().map((headerGroup) => ( - - {headerGroup.headers.map((header) => { - return ( - - {header.isPlaceholder - ? null - : flexRender( - header.column.columnDef.header, - header.getContext() - )} - - ); - })} - - ))} - - - {table?.getRowModel()?.rows?.length ? ( - table.getRowModel().rows.map((row) => ( - - {row.getVisibleCells().map((cell) => ( - - {flexRender( - cell.column.columnDef.cell, - cell.getContext() - )} - - ))} - - )) - ) : ( - - - {isLoading ? ( -
- - Loading... - -
- ) : ( - <>No results. - )} -
-
- )} -
-
- )} -
- {data && data?.length > 0 && ( -
-
- - -
-
- )} -
-
-
-
-
-
- ); + return ( +
+ +
+ + + + Docker Containers + + + See all the containers of your dokploy server + + + +
+
+
+ + table + .getColumn("name") + ?.setFilterValue(event.target.value) + } + className="md:max-w-sm" + /> + + + + + + {table + .getAllColumns() + .filter((column) => column.getCanHide()) + .map((column) => { + return ( + + column.toggleVisibility(!!value) + } + > + {column.id} + + ); + })} + + +
+
+ {isLoading ? ( +
+ + Loading... + +
+ ) : data?.length === 0 ? ( +
+ + No results. + +
+ ) : ( + + + {table.getHeaderGroups().map((headerGroup) => ( + + {headerGroup.headers.map((header) => { + return ( + + {header.isPlaceholder + ? null + : flexRender( + header.column.columnDef.header, + header.getContext(), + )} + + ); + })} + + ))} + + + {table?.getRowModel()?.rows?.length ? ( + table.getRowModel().rows.map((row) => ( + + {row.getVisibleCells().map((cell) => ( + + {flexRender( + cell.column.columnDef.cell, + cell.getContext(), + )} + + ))} + + )) + ) : ( + + + {isLoading ? ( +
+ + Loading... + +
+ ) : ( + <>No results. + )} +
+
+ )} +
+
+ )} +
+ {data && data?.length > 0 && ( +
+
+ + +
+
+ )} +
+
+
+
+
+
+ ); }; diff --git a/apps/dokploy/components/dashboard/file-system/show-traefik-system.tsx b/apps/dokploy/components/dashboard/file-system/show-traefik-system.tsx index c5b2c6676..ed2ed1974 100644 --- a/apps/dokploy/components/dashboard/file-system/show-traefik-system.tsx +++ b/apps/dokploy/components/dashboard/file-system/show-traefik-system.tsx @@ -1,10 +1,10 @@ import { AlertBlock } from "@/components/shared/alert-block"; import { - Card, - CardContent, - CardDescription, - CardHeader, - CardTitle, + Card, + CardContent, + CardDescription, + CardHeader, + CardTitle, } from "@/components/ui/card"; import { Tree } from "@/components/ui/file-tree"; import { cn } from "@/lib/utils"; @@ -14,97 +14,97 @@ import React from "react"; import { ShowTraefikFile } from "./show-traefik-file"; interface Props { - serverId?: string; + serverId?: string; } export const ShowTraefikSystem = ({ serverId }: Props) => { - const [file, setFile] = React.useState(null); + const [file, setFile] = React.useState(null); - const { - data: directories, - isLoading, - error, - isError, - } = api.settings.readDirectories.useQuery( - { - serverId, - }, - { - retry: 2, - } - ); + const { + data: directories, + isLoading, + error, + isError, + } = api.settings.readDirectories.useQuery( + { + serverId, + }, + { + retry: 2, + }, + ); - return ( -
- -
- - - - Traefik File System - - - Manage all the files and directories in {"'/etc/dokploy/traefik'"} - . - + return ( +
+ +
+ + + + Traefik File System + + + Manage all the files and directories in {"'/etc/dokploy/traefik'"} + . + - - Adding invalid configuration to existing files, can break your - Traefik instance, preventing access to your applications. - - - -
-
- {isError && ( - - {error?.message} - - )} - {isLoading && ( -
- - Loading... - - -
- )} - {directories?.length === 0 && ( -
- - No directories or files detected in{" "} - {"'/etc/dokploy/traefik'"} - - -
- )} - {directories && directories?.length > 0 && ( - <> - setFile(item?.id || null)} - folderIcon={Folder} - itemIcon={Workflow} - /> -
- {file ? ( - - ) : ( -
- - No file selected - - -
- )} -
- - )} -
-
-
-
-
-
- ); + + Adding invalid configuration to existing files, can break your + Traefik instance, preventing access to your applications. + +
+ +
+
+ {isError && ( + + {error?.message} + + )} + {isLoading && ( +
+ + Loading... + + +
+ )} + {directories?.length === 0 && ( +
+ + No directories or files detected in{" "} + {"'/etc/dokploy/traefik'"} + + +
+ )} + {directories && directories?.length > 0 && ( + <> + setFile(item?.id || null)} + folderIcon={Folder} + itemIcon={Workflow} + /> +
+ {file ? ( + + ) : ( +
+ + No file selected + + +
+ )} +
+ + )} +
+
+
+
+
+
+ ); }; diff --git a/apps/dokploy/components/layouts/side.tsx b/apps/dokploy/components/layouts/side.tsx index fe820c2bf..7e2754309 100644 --- a/apps/dokploy/components/layouts/side.tsx +++ b/apps/dokploy/components/layouts/side.tsx @@ -300,7 +300,6 @@ const data = { isSingle: true, isActive: false, }, - ] as NavItem[], help: [ { @@ -317,7 +316,12 @@ const data = { name: "Sponsor", url: "https://opencollective.com/dokploy", icon: ({ className }) => ( - + ), }, ] as ExternalLink[], diff --git a/apps/dokploy/public/templates/conduwuit.svg b/apps/dokploy/public/templates/conduwuit.svg new file mode 100644 index 000000000..162a3d9e3 --- /dev/null +++ b/apps/dokploy/public/templates/conduwuit.svg @@ -0,0 +1,37 @@ + + + + + + + diff --git a/apps/dokploy/templates/conduwuit/docker-compose.yml b/apps/dokploy/templates/conduwuit/docker-compose.yml new file mode 100644 index 000000000..7945d6c97 --- /dev/null +++ b/apps/dokploy/templates/conduwuit/docker-compose.yml @@ -0,0 +1,48 @@ +# conduwuit +# https://conduwuit.puppyirl.gay/deploying/docker-compose.yml + +services: + homeserver: + image: girlbossceo/conduwuit:latest + restart: unless-stopped + ports: + - 8448:6167 + volumes: + - db:/var/lib/conduwuit + #- ./conduwuit.toml:/etc/conduwuit.toml + environment: + # Edit this in your Dokploy Environment + CONDUWUIT_SERVER_NAME: ${CONDUWUIT_SERVER_NAME} + + CONDUWUIT_DATABASE_PATH: /var/lib/conduwuit + CONDUWUIT_PORT: 6167 + CONDUWUIT_MAX_REQUEST_SIZE: 20000000 # in bytes, ~20 MB + + CONDUWUIT_ALLOW_REGISTRATION: 'true' + CONDUWUIT_REGISTRATION_TOKEN: ${CONDUWUIT_REGISTRATION_TOKEN} + + CONDUWUIT_ALLOW_FEDERATION: 'true' + CONDUWUIT_ALLOW_CHECK_FOR_UPDATES: 'true' + CONDUWUIT_TRUSTED_SERVERS: '["matrix.org"]' + #CONDUWUIT_LOG: warn,state_res=warn + CONDUWUIT_ADDRESS: 0.0.0.0 + + # Uncomment if you mapped config toml in volumes + #CONDUWUIT_CONFIG: '/etc/conduwuit.toml' + + ### Uncomment if you want to use your own Element-Web App. + ### Note: You need to provide a config.json for Element and you also need a second + ### Domain or Subdomain for the communication between Element and conduwuit + ### Config-Docs: https://github.com/vector-im/element-web/blob/develop/docs/config.md + # element-web: + # image: vectorim/element-web:latest + # restart: unless-stopped + # ports: + # - 8009:80 + # volumes: + # - ./element_config.json:/app/config.json + # depends_on: + # - homeserver + +volumes: + db: diff --git a/apps/dokploy/templates/conduwuit/index.ts b/apps/dokploy/templates/conduwuit/index.ts new file mode 100644 index 000000000..9d9e98569 --- /dev/null +++ b/apps/dokploy/templates/conduwuit/index.ts @@ -0,0 +1,30 @@ +import { + type DomainSchema, + type Schema, + type Template, + generatePassword, + generateRandomDomain, +} from "../utils"; + +export function generate(schema: Schema): Template { + const matrixSubdomain = generateRandomDomain(schema); + const registrationToken = generatePassword(20); + + const domains: DomainSchema[] = [ + { + host: matrixSubdomain, + port: 6167, + serviceName: "homeserver", + }, + ]; + + const envs = [ + `CONDUWUIT_SERVER_NAME=${matrixSubdomain}`, + `CONDUWUIT_REGISTRATION_TOKEN=${registrationToken}`, + ]; + + return { + envs, + domains, + }; +} diff --git a/apps/dokploy/templates/templates.ts b/apps/dokploy/templates/templates.ts index d58e6fd6c..cb7f22e4f 100644 --- a/apps/dokploy/templates/templates.ts +++ b/apps/dokploy/templates/templates.ts @@ -1239,6 +1239,21 @@ export const templates: TemplateData[] = [ tags: ["matrix", "communication"], load: () => import("./conduit/index").then((m) => m.generate), }, + { + id: "conduwuit", + name: "Conduwuit", + version: "latest", + description: + "Well-maintained, featureful Matrix chat homeserver (fork of Conduit)", + logo: "conduwuit.svg", + links: { + github: "https://github.com/girlbossceo/conduwuit", + website: "https://conduwuit.puppyirl.gay", + docs: "https://conduwuit.puppyirl.gay/configuration.html", + }, + tags: ["backend", "chat", "communication", "matrix", "server"], + load: () => import("./conduwuit/index").then((m) => m.generate), + }, { id: "cloudflared", name: "Cloudflared",