diff --git a/apps/dokploy/components/dashboard/settings/appearance-form.tsx b/apps/dokploy/components/dashboard/settings/appearance-form.tsx index 38f0d48b..b7fe20e8 100644 --- a/apps/dokploy/components/dashboard/settings/appearance-form.tsx +++ b/apps/dokploy/components/dashboard/settings/appearance-form.tsx @@ -37,7 +37,7 @@ const appearanceFormSchema = z.object({ theme: z.enum(["light", "dark", "system"], { required_error: "Please select a theme.", }), - language: z.enum(["en", "pl", "ru", "de", "zh-Hans"], { + language: z.enum(["en", "pl", "ru", "de", "zh-Hant", "zh-Hans"], { required_error: "Please select a language.", }), }); @@ -177,7 +177,8 @@ export function AppearanceForm() { { label: "Polski", value: "pl" }, { label: "Русский", value: "ru" }, { label: "Deutsch", value: "de" }, - { label: "简体中文", value: "zh-Hans" }, + { label: "繁體中文", value: "zh-Hant" }, + { label: "简体中文", value: "zh-Hans" } ].map((preset) => ( {preset.label} diff --git a/apps/dokploy/next-i18next.config.cjs b/apps/dokploy/next-i18next.config.cjs index 6d4a88e8..30f82e64 100644 --- a/apps/dokploy/next-i18next.config.cjs +++ b/apps/dokploy/next-i18next.config.cjs @@ -2,7 +2,7 @@ module.exports = { i18n: { defaultLocale: "en", - locales: ["en", "pl", "ru", "de", "zh-Hans"], + locales: ["en", "pl", "ru", "de", "zh-Hant", "zh-Hans"], localeDetection: false, }, fallbackLng: "en", diff --git a/apps/dokploy/pages/_app.tsx b/apps/dokploy/pages/_app.tsx index 54f9238a..d1d95123 100644 --- a/apps/dokploy/pages/_app.tsx +++ b/apps/dokploy/pages/_app.tsx @@ -71,7 +71,7 @@ export default api.withTRPC( { i18n: { defaultLocale: "en", - locales: ["en", "pl", "ru", "de", "zh-Hans"], + locales: ["en", "pl", "ru", "de", "zh-Hant", "zh-Hans"], localeDetection: false, }, fallbackLng: "en", diff --git a/apps/dokploy/public/locales/zh-Hant/common.json b/apps/dokploy/public/locales/zh-Hant/common.json new file mode 100644 index 00000000..e69de29b diff --git a/apps/dokploy/public/locales/zh-Hant/settings.json b/apps/dokploy/public/locales/zh-Hant/settings.json new file mode 100644 index 00000000..1d5b6432 --- /dev/null +++ b/apps/dokploy/public/locales/zh-Hant/settings.json @@ -0,0 +1,40 @@ +{ + "settings.common.save": "儲存", + "settings.server.domain.title": "伺服器網域", + "settings.server.domain.description": "將一個網域加入到您的伺服器。", + "settings.server.domain.form.domain": "網域", + "settings.server.domain.form.letsEncryptEmail": "Let's Encrypt 郵箱", + "settings.server.domain.form.certificate.label": "憑證", + "settings.server.domain.form.certificate.placeholder": "選擇一個憑證", + "settings.server.domain.form.certificateOptions.none": "無", + "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt (預設)", + "settings.server.webServer.title": "Web 伺服器", + "settings.server.webServer.description": "管理 Web 伺服器。", + "settings.server.webServer.actions": "操作", + "settings.server.webServer.reload": "重新載入", + "settings.server.webServer.watchLogs": "查看日誌", + "settings.server.webServer.server.label": "伺服器", + "settings.server.webServer.traefik.label": "Traefik", + "settings.server.webServer.traefik.modifyEnv": "修改環境變數", + "settings.server.webServer.storage.label": "磁碟空間", + "settings.server.webServer.storage.cleanUnusedImages": "清理未使用的映像檔", + "settings.server.webServer.storage.cleanUnusedVolumes": "清理未使用的磁碟區", + "settings.server.webServer.storage.cleanStoppedContainers": "清理已停止的容器", + "settings.server.webServer.storage.cleanDockerBuilder": "清理 Docker Builder 和系統快取", + "settings.server.webServer.storage.cleanMonitoring": "清理監控", + "settings.server.webServer.storage.cleanAll": "清理所有", + "settings.profile.title": "帳戶偏好", + "settings.profile.description": "更改您的個人資料詳情。", + "settings.profile.email": "電子郵件", + "settings.profile.password": "密碼", + "settings.profile.avatar": "頭像", + "settings.appearance.title": "外觀", + "settings.appearance.description": "自訂儀表板主題。", + "settings.appearance.theme": "主題", + "settings.appearance.themeDescription": "選擇儀表板主題", + "settings.appearance.themes.light": "亮", + "settings.appearance.themes.dark": "暗", + "settings.appearance.themes.system": "系統", + "settings.appearance.language": "語言", + "settings.appearance.languageDescription": "選擇儀表板語言" +} diff --git a/apps/dokploy/public/templates/ontime.png b/apps/dokploy/public/templates/ontime.png new file mode 100644 index 00000000..e7aaee29 Binary files /dev/null and b/apps/dokploy/public/templates/ontime.png differ diff --git a/apps/dokploy/server/api/routers/compose.ts b/apps/dokploy/server/api/routers/compose.ts index 0464dfc3..15e4512b 100644 --- a/apps/dokploy/server/api/routers/compose.ts +++ b/apps/dokploy/server/api/routers/compose.ts @@ -79,6 +79,8 @@ export const composeRouter = createTRPCRouter({ if (ctx.user.rol === "user") { await addNewService(ctx.user.authId, newService.composeId); } + + return newService; } catch (error) { throw error; } diff --git a/apps/dokploy/templates/discord-tickets/docker-compose.yml b/apps/dokploy/templates/discord-tickets/docker-compose.yml index 44324e1e..e6e41288 100644 --- a/apps/dokploy/templates/discord-tickets/docker-compose.yml +++ b/apps/dokploy/templates/discord-tickets/docker-compose.yml @@ -1,14 +1,13 @@ version: "3.8" services: - mysql: + tickets-postgres: image: mysql:8 restart: unless-stopped - hostname: mysql networks: - dokploy-network volumes: - - tickets-mysql:/var/lib/mysql + - tickets-mysql-data:/var/lib/mysql environment: MYSQL_DATABASE: ${MYSQL_DATABASE} MYSQL_PASSWORD: ${MYSQL_PASSWORD} @@ -20,23 +19,22 @@ services: timeout: 5s retries: 5 - bot: + tickets-app: image: eartharoid/discord-tickets:4.0.21 depends_on: - mysql: + tickets-postgres: condition: service_healthy restart: unless-stopped - hostname: bot networks: - dokploy-network volumes: - - tickets-bot:/home/container/user + - tickets-app-data:/home/container/user - /etc/timezone:/etc/timezone:ro - /etc/localtime:/etc/localtime:ro tty: true stdin_open: true environment: - DB_CONNECTION_URL: mysql://${MYSQL_USER}:${MYSQL_PASSWORD}@mysql/${MYSQL_DATABASE} + DB_CONNECTION_URL: mysql://${MYSQL_USER}:${MYSQL_PASSWORD}@tickets-postgres/${MYSQL_DATABASE} DISCORD_SECRET: ${DISCORD_SECRET} DISCORD_TOKEN: ${DISCORD_TOKEN} ENCRYPTION_KEY: ${ENCRYPTION_KEY} @@ -49,6 +47,10 @@ services: PUBLISH_COMMANDS: "true" SUPER: ${SUPER_USERS} +networks: + dokploy-network: + external: true + volumes: - tickets-mysql: - tickets-bot: \ No newline at end of file + tickets-mysql-data: + tickets-app-data: \ No newline at end of file diff --git a/apps/dokploy/templates/discord-tickets/index.ts b/apps/dokploy/templates/discord-tickets/index.ts index 48b40ed7..e11b78e6 100644 --- a/apps/dokploy/templates/discord-tickets/index.ts +++ b/apps/dokploy/templates/discord-tickets/index.ts @@ -13,7 +13,6 @@ export function generate(schema: Schema): Template { const mysqlUser = "tickets"; const mysqlDatabase = "tickets"; - // Generate encryption key in the format they use const encryptionKey = Array.from({ length: 48 }, () => Math.floor(Math.random() * 16).toString(16), ).join(""); @@ -22,7 +21,7 @@ export function generate(schema: Schema): Template { { host: mainDomain, port: 8169, - serviceName: "bot", + serviceName: "tickets-app", }, ]; @@ -33,7 +32,6 @@ export function generate(schema: Schema): Template { `MYSQL_ROOT_PASSWORD=${mysqlRootPassword}`, `MYSQL_USER=${mysqlUser}`, `ENCRYPTION_KEY=${encryptionKey}`, - // These need to be set by the user through the UI "# Follow the guide at: https://discordtickets.app/self-hosting/installation/docker/#creating-the-discord-application", "DISCORD_SECRET=", "DISCORD_TOKEN=", diff --git a/apps/dokploy/templates/invoiceshelf/docker-compose.yml b/apps/dokploy/templates/invoiceshelf/docker-compose.yml index ac4c8d26..5afdd152 100644 --- a/apps/dokploy/templates/invoiceshelf/docker-compose.yml +++ b/apps/dokploy/templates/invoiceshelf/docker-compose.yml @@ -1,12 +1,12 @@ version: "3.8" services: - invoiceshelf_db: + invoiceshelf-postgres: image: postgres:15 networks: - dokploy-network volumes: - - postgres_data:/var/lib/postgresql/data + - invoiceshelf-postgres-data:/var/lib/postgresql/data environment: - POSTGRES_PASSWORD=${DB_PASSWORD} - POSTGRES_USER=${DB_USERNAME} @@ -17,13 +17,13 @@ services: timeout: 5s retries: 5 - invoiceshelf: + invoiceshelf-app: image: invoiceshelf/invoiceshelf:latest networks: - dokploy-network volumes: - - app_data:/data - - app_conf:/conf + - invoiceshelf-app-data:/data + - invoiceshelf-app-conf:/conf environment: - PHP_TZ=UTC - TIMEZONE=UTC @@ -32,7 +32,7 @@ services: - APP_DEBUG=false - APP_URL=http://${INVOICESHELF_HOST} - DB_CONNECTION=pgsql - - DB_HOST=invoiceshelf_db + - DB_HOST=invoiceshelf-postgres - DB_PORT=5432 - DB_DATABASE=${DB_DATABASE} - DB_USERNAME=${DB_USERNAME} @@ -46,10 +46,14 @@ services: - SANCTUM_STATEFUL_DOMAINS=${INVOICESHELF_HOST} - STARTUP_DELAY=10 depends_on: - invoiceshelf_db: + invoiceshelf-postgres: condition: service_healthy +networks: + dokploy-network: + external: true + volumes: - postgres_data: - app_data: - app_conf: \ No newline at end of file + invoiceshelf-postgres-data: + invoiceshelf-app-data: + invoiceshelf-app-conf: \ No newline at end of file diff --git a/apps/dokploy/templates/invoiceshelf/index.ts b/apps/dokploy/templates/invoiceshelf/index.ts index d8ae8f63..a83ebf07 100644 --- a/apps/dokploy/templates/invoiceshelf/index.ts +++ b/apps/dokploy/templates/invoiceshelf/index.ts @@ -16,7 +16,7 @@ export function generate(schema: Schema): Template { { host: mainDomain, port: 80, - serviceName: "invoiceshelf", + serviceName: "invoiceshelf-app", }, ]; diff --git a/apps/dokploy/templates/ontime/docker-compose.yml b/apps/dokploy/templates/ontime/docker-compose.yml new file mode 100644 index 00000000..2c04bcb3 --- /dev/null +++ b/apps/dokploy/templates/ontime/docker-compose.yml @@ -0,0 +1,14 @@ +services: + ontime: + image: getontime/ontime:v3.8.0 + ports: + - 4001 + - 8888 + - 9999 + volumes: + - ontime-data:/data/ + environment: + - TZ + restart: unless-stopped +volumes: + ontime-data: diff --git a/apps/dokploy/templates/ontime/index.ts b/apps/dokploy/templates/ontime/index.ts new file mode 100644 index 00000000..17cac25d --- /dev/null +++ b/apps/dokploy/templates/ontime/index.ts @@ -0,0 +1,25 @@ +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: 4001, + serviceName: "ontime", + }, + ]; + + const envs = ["TZ=UTC"]; + + return { + domains, + envs, + }; +} diff --git a/apps/dokploy/templates/peppermint/docker-compose.yml b/apps/dokploy/templates/peppermint/docker-compose.yml index a20bedf4..305c5eb9 100644 --- a/apps/dokploy/templates/peppermint/docker-compose.yml +++ b/apps/dokploy/templates/peppermint/docker-compose.yml @@ -1,13 +1,13 @@ version: "3.8" services: - peppermint_postgres: + peppermint-postgres: image: postgres:latest restart: always networks: - dokploy-network volumes: - - pgdata:/var/lib/postgresql/data + - peppermint-postgres-data:/var/lib/postgresql/data environment: POSTGRES_USER: peppermint POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} @@ -18,19 +18,23 @@ services: timeout: 5s retries: 5 - peppermint: + peppermint-app: image: pepperlabs/peppermint:latest restart: always networks: - dokploy-network depends_on: - peppermint_postgres: + peppermint-postgres: condition: service_healthy environment: DB_USERNAME: "peppermint" DB_PASSWORD: ${POSTGRES_PASSWORD} - DB_HOST: "peppermint_postgres" + DB_HOST: "peppermint-postgres" SECRET: ${SECRET} +networks: + dokploy-network: + external: true + volumes: - pgdata: \ No newline at end of file + peppermint-postgres-data: \ No newline at end of file diff --git a/apps/dokploy/templates/peppermint/index.ts b/apps/dokploy/templates/peppermint/index.ts index 2b71d490..de63f845 100644 --- a/apps/dokploy/templates/peppermint/index.ts +++ b/apps/dokploy/templates/peppermint/index.ts @@ -8,27 +8,24 @@ import { } from "../utils"; export function generate(schema: Schema): Template { - // Generate domains and secrets const mainDomain = generateRandomDomain(schema); const apiDomain = generateRandomDomain(schema); const postgresPassword = generatePassword(); const secret = generateBase64(32); - // Configure domain routing const domains: DomainSchema[] = [ { host: mainDomain, port: 3000, - serviceName: "peppermint", + serviceName: "peppermint-app", }, { host: apiDomain, port: 5003, - serviceName: "peppermint", + serviceName: "peppermint-app", }, ]; - // Set environment variables const envs = [ `MAIN_DOMAIN=${mainDomain}`, `API_DOMAIN=${apiDomain}`, diff --git a/apps/dokploy/templates/postiz/docker-compose.yml b/apps/dokploy/templates/postiz/docker-compose.yml index 42a4b976..f842c92d 100644 --- a/apps/dokploy/templates/postiz/docker-compose.yml +++ b/apps/dokploy/templates/postiz/docker-compose.yml @@ -1,7 +1,7 @@ version: "3.8" services: - postiz: + postiz-app: image: ghcr.io/gitroomhq/postiz-app:latest restart: always networks: @@ -37,7 +37,7 @@ services: POSTGRES_USER: ${DB_USER} POSTGRES_DB: ${DB_NAME} volumes: - - postgres-volume:/var/lib/postgresql/data + - postiz-postgres-data:/var/lib/postgresql/data healthcheck: test: pg_isready -U ${DB_USER} -d ${DB_NAME} interval: 10s @@ -57,8 +57,12 @@ services: volumes: - postiz-redis-data:/data +networks: + dokploy-network: + external: true + volumes: - postgres-volume: + postiz-postgres-data: postiz-redis-data: postiz-config: postiz-uploads: \ No newline at end of file diff --git a/apps/dokploy/templates/postiz/index.ts b/apps/dokploy/templates/postiz/index.ts index d9eef415..a05d2d94 100644 --- a/apps/dokploy/templates/postiz/index.ts +++ b/apps/dokploy/templates/postiz/index.ts @@ -18,7 +18,7 @@ export function generate(schema: Schema): Template { { host: mainDomain, port: 5000, - serviceName: "postiz", + serviceName: "postiz-app", }, ]; diff --git a/apps/dokploy/templates/slash/docker-compose.yml b/apps/dokploy/templates/slash/docker-compose.yml index fce3114e..75afc478 100644 --- a/apps/dokploy/templates/slash/docker-compose.yml +++ b/apps/dokploy/templates/slash/docker-compose.yml @@ -1,26 +1,26 @@ version: "3.8" services: - slash: + slash-app: image: yourselfhosted/slash:latest networks: - dokploy-network volumes: - - slash_data:/var/opt/slash + - slash-app-data:/var/opt/slash environment: - SLASH_DRIVER=postgres - - SLASH_DSN=postgresql://${DB_USER}:${DB_PASSWORD}@db:5432/${DB_NAME}?sslmode=disable + - SLASH_DSN=postgresql://${DB_USER}:${DB_PASSWORD}@slash-postgres:5432/${DB_NAME}?sslmode=disable depends_on: - db: + slash-postgres: condition: service_healthy restart: unless-stopped - db: + slash-postgres: image: postgres:16-alpine networks: - dokploy-network volumes: - - postgres_data:/var/lib/postgresql/data + - slash-postgres-data:/var/lib/postgresql/data environment: - POSTGRES_USER=${DB_USER} - POSTGRES_PASSWORD=${DB_PASSWORD} @@ -32,6 +32,10 @@ services: retries: 5 restart: unless-stopped +networks: + dokploy-network: + external: true + volumes: - slash_data: - postgres_data: \ No newline at end of file + slash-app-data: + slash-postgres-data: \ No newline at end of file diff --git a/apps/dokploy/templates/slash/index.ts b/apps/dokploy/templates/slash/index.ts index 4e05f74d..ba614fd8 100644 --- a/apps/dokploy/templates/slash/index.ts +++ b/apps/dokploy/templates/slash/index.ts @@ -16,7 +16,7 @@ export function generate(schema: Schema): Template { { host: mainDomain, port: 5231, - serviceName: "slash", + serviceName: "slash-app", }, ]; diff --git a/apps/dokploy/templates/templates.ts b/apps/dokploy/templates/templates.ts index a6318dfe..0763a858 100644 --- a/apps/dokploy/templates/templates.ts +++ b/apps/dokploy/templates/templates.ts @@ -956,5 +956,20 @@ export const templates: TemplateData[] = [ }, tags: ["media", "photos", "self-hosted"], load: () => import("./photoprism/index").then((m) => m.generate), + }, + { + id: "ontime", + name: "Ontime", + version: "v3.8.0", + description: + "Ontime is browser-based application that manages event rundowns, scheduliing and cuing", + logo: "ontime.png", + links: { + github: "https://github.com/cpvalente/ontime/", + website: "https://getontime.no", + docs: "https://docs.getontime.no", + }, + tags: ["event"], + load: () => import("./ontime/index").then((m) => m.generate), }, ]; diff --git a/apps/dokploy/templates/windmill/docker-compose.yml b/apps/dokploy/templates/windmill/docker-compose.yml index 5646c47a..de91ee55 100644 --- a/apps/dokploy/templates/windmill/docker-compose.yml +++ b/apps/dokploy/templates/windmill/docker-compose.yml @@ -1,12 +1,12 @@ version: "3.8" services: - db: + windmill-postgres: image: postgres:16 shm_size: 1g restart: unless-stopped volumes: - - db_data:/var/lib/postgresql/data + - windmill-postgres-data:/var/lib/postgresql/data networks: - dokploy-network environment: @@ -18,7 +18,7 @@ services: timeout: 5s retries: 5 - windmill_server: + windmill-server: image: ghcr.io/windmill-labs/windmill:main networks: - dokploy-network @@ -28,12 +28,12 @@ services: - MODE=server - BASE_URL=http://${WINDMILL_HOST} depends_on: - db: + windmill-postgres: condition: service_healthy volumes: - - worker_logs:/tmp/windmill/logs + - windmill-worker-logs:/tmp/windmill/logs - windmill_worker: + windmill-worker: image: ghcr.io/windmill-labs/windmill:main deploy: replicas: 3 @@ -49,14 +49,14 @@ services: - MODE=worker - WORKER_GROUP=default depends_on: - db: + windmill-postgres: condition: service_healthy volumes: - /var/run/docker.sock:/var/run/docker.sock - - worker_dependency_cache:/tmp/windmill/cache - - worker_logs:/tmp/windmill/logs + - windmill-worker-cache:/tmp/windmill/cache + - windmill-worker-logs:/tmp/windmill/logs - windmill_worker_native: + windmill-worker-native: image: ghcr.io/windmill-labs/windmill:main deploy: replicas: 1 @@ -74,20 +74,20 @@ services: - NUM_WORKERS=8 - SLEEP_QUEUE=200 depends_on: - db: + windmill-postgres: condition: service_healthy volumes: - - worker_logs:/tmp/windmill/logs + - windmill-worker-logs:/tmp/windmill/logs - lsp: + windmill-lsp: image: ghcr.io/windmill-labs/windmill-lsp:latest restart: unless-stopped networks: - dokploy-network volumes: - - lsp_cache:/root/.cache + - windmill-lsp-cache:/root/.cache - caddy: + windmill-caddy: image: ghcr.io/windmill-labs/caddy-l4:latest restart: unless-stopped networks: @@ -97,11 +97,15 @@ services: environment: - BASE_URL=":80" depends_on: - - windmill_server - - lsp + - windmill-server + - windmill-lsp + +networks: + dokploy-network: + external: true volumes: - db_data: - worker_dependency_cache: - worker_logs: - lsp_cache: \ No newline at end of file + windmill-postgres-data: + windmill-worker-cache: + windmill-worker-logs: + windmill-lsp-cache: \ No newline at end of file diff --git a/apps/dokploy/templates/windmill/index.ts b/apps/dokploy/templates/windmill/index.ts index 5d6aae3c..b96a8c03 100644 --- a/apps/dokploy/templates/windmill/index.ts +++ b/apps/dokploy/templates/windmill/index.ts @@ -14,14 +14,14 @@ export function generate(schema: Schema): Template { { host: mainDomain, port: 80, - serviceName: "caddy", + serviceName: "windmill-caddy", }, ]; const envs = [ `WINDMILL_HOST=${mainDomain}`, `POSTGRES_PASSWORD=${postgresPassword}`, - `DATABASE_URL=postgres://postgres:${postgresPassword}@db/windmill?sslmode=disable`, + `DATABASE_URL=postgres://postgres:${postgresPassword}@windmill-postgres/windmill?sslmode=disable`, ]; const mounts: Template["mounts"] = [ @@ -29,8 +29,8 @@ export function generate(schema: Schema): Template { filePath: "Caddyfile", content: `:80 { bind 0.0.0.0 - reverse_proxy /ws/* http://lsp:3001 - reverse_proxy /* http://windmill_server:8000 + reverse_proxy /ws/* http://windmill-lsp:3001 + reverse_proxy /* http://windmill-server:8000 }`, }, ]; diff --git a/apps/dokploy/utils/hooks/use-locale.ts b/apps/dokploy/utils/hooks/use-locale.ts index 5aa5bf62..a1897ce0 100644 --- a/apps/dokploy/utils/hooks/use-locale.ts +++ b/apps/dokploy/utils/hooks/use-locale.ts @@ -1,6 +1,6 @@ import Cookies from "js-cookie"; -const SUPPORTED_LOCALES = ["en", "pl", "ru", "de", "zh-Hans"] as const; +const SUPPORTED_LOCALES = ["en", "pl", "ru", "de", "zh-Hant", "zh-Hans"] as const; type Locale = (typeof SUPPORTED_LOCALES)[number];