diff --git a/.gitignore b/.gitignore index 5df5645..20f4e15 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ node_modules .pnp.js .docker + # Local env files .env .env.local diff --git a/Dockerfile.docs b/Dockerfile.docs index 60c602f..97dd525 100644 --- a/Dockerfile.docs +++ b/Dockerfile.docs @@ -14,6 +14,8 @@ RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install --filter=./apps/d # Generate OpenAPI documentation from apps/docs/public/openapi.json RUN pnpm --filter=./apps/docs run build:docs +# Generate templates +RUN pnpm --filter=./apps/docs run generate-templates # Deploy only the dokploy app ENV NODE_ENV=production diff --git a/apps/docs/content/docs/api/reference-notification.mdx b/apps/docs/content/docs/api/reference-notification.mdx index d7901b2..e2a3100 100644 --- a/apps/docs/content/docs/api/reference-notification.mdx +++ b/apps/docs/content/docs/api/reference-notification.mdx @@ -78,6 +78,15 @@ _openapi: - depth: 2 title: Notification test Lark Connection url: '#notification-test-lark-connection' + - depth: 2 + title: Notification create Pushover + url: '#notification-create-pushover' + - depth: 2 + title: Notification update Pushover + url: '#notification-update-pushover' + - depth: 2 + title: Notification test Pushover Connection + url: '#notification-test-pushover-connection' - depth: 2 title: Notification get Email Providers url: '#notification-get-email-providers' @@ -133,9 +142,15 @@ _openapi: id: notification-update-lark - content: Notification test Lark Connection id: notification-test-lark-connection + - content: Notification create Pushover + id: notification-create-pushover + - content: Notification update Pushover + id: notification-update-pushover + - content: Notification test Pushover Connection + id: notification-test-pushover-connection - content: Notification get Email Providers id: notification-get-email-providers contents: [] --- - \ No newline at end of file + \ No newline at end of file diff --git a/apps/docs/content/docs/api/registry.mdx b/apps/docs/content/docs/api/registry.mdx index 356a5d8..a2252e6 100644 --- a/apps/docs/content/docs/api/registry.mdx +++ b/apps/docs/content/docs/api/registry.mdx @@ -21,6 +21,9 @@ _openapi: - depth: 2 title: Registry test Registry url: '#registry-test-registry' + - depth: 2 + title: Registry test Registry By Id + url: '#registry-test-registry-by-id' structuredData: headings: - content: Registry create @@ -35,9 +38,11 @@ _openapi: id: registry-one - content: Registry test Registry id: registry-test-registry + - content: Registry test Registry By Id + id: registry-test-registry-by-id contents: [] --- {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} - \ No newline at end of file + \ No newline at end of file diff --git a/apps/docs/content/docs/api/settings.mdx b/apps/docs/content/docs/api/settings.mdx index 53ba081..a1f0d3c 100644 --- a/apps/docs/content/docs/api/settings.mdx +++ b/apps/docs/content/docs/api/settings.mdx @@ -3,6 +3,9 @@ title: Settings full: true _openapi: toc: + - depth: 2 + title: Settings get Web Server Settings + url: '#settings-get-web-server-settings' - depth: 2 title: Settings reload Server url: '#settings-reload-server' @@ -93,6 +96,9 @@ _openapi: - depth: 2 title: Settings get Ip url: '#settings-get-ip' + - depth: 2 + title: Settings update Server Ip + url: '#settings-update-server-ip' - depth: 2 title: Settings get Open Api Document url: '#settings-get-open-api-document' @@ -143,6 +149,8 @@ _openapi: url: '#settings-get-dokploy-cloud-ips' structuredData: headings: + - content: Settings get Web Server Settings + id: settings-get-web-server-settings - content: Settings reload Server id: settings-reload-server - content: Settings clean Redis @@ -203,6 +211,8 @@ _openapi: id: settings-read-traefik-file - content: Settings get Ip id: settings-get-ip + - content: Settings update Server Ip + id: settings-update-server-ip - content: Settings get Open Api Document id: settings-get-open-api-document - content: Settings read Traefik Env @@ -240,4 +250,4 @@ _openapi: {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} - \ No newline at end of file + \ No newline at end of file diff --git a/apps/docs/content/docs/core/(Notifications)/meta.json b/apps/docs/content/docs/core/(Notifications)/meta.json index 5f330c8..3355594 100644 --- a/apps/docs/content/docs/core/(Notifications)/meta.json +++ b/apps/docs/content/docs/core/(Notifications)/meta.json @@ -10,6 +10,7 @@ "resend", "gotify", "ntfy", + "pushover", "webhook" ] } diff --git a/apps/docs/content/docs/core/(Notifications)/overview.mdx b/apps/docs/content/docs/core/(Notifications)/overview.mdx index 9961520..c7f24a3 100644 --- a/apps/docs/content/docs/core/(Notifications)/overview.mdx +++ b/apps/docs/content/docs/core/(Notifications)/overview.mdx @@ -30,5 +30,6 @@ Dokploy supports the following notification providers: 6. **Resend**: Resend is a modern email API for developers to send transactional emails. 7. **Gotify**: Gotify is a self-hosted push notification service. 8. **Ntfy**: Ntfy is a simple HTTP-based pub-sub notification service. +8. **Pushover**: Pushover is a service for sending real-time notifications to Android, iOS, and desktop devices. 9. **Webhook**: Webhook is a generic webhook notification service. diff --git a/apps/docs/content/docs/core/(Notifications)/pushover.mdx b/apps/docs/content/docs/core/(Notifications)/pushover.mdx new file mode 100644 index 0000000..eb603f0 --- /dev/null +++ b/apps/docs/content/docs/core/(Notifications)/pushover.mdx @@ -0,0 +1,27 @@ +--- +title: Pushover +description: 'Configure Pushover notifications for your applications.' +--- + +Pushover notifications are a great way to stay up to date with important events in your Dokploy panel. You can choose to receive notifications for specific events or all events. + +## Pushover Notifications + +To start receiving Pushover notifications, you need to fill the form with the following details: + +- **Name**: Enter any name you want. +- **User Key**: Enter your Pushover user key. eg. `ub3de9kl2q...` +- **API Token**: Enter your Pushover application API token. eg. `a3d9k2q7m4...` +- **Priority**: Enter the priority of the notification (-2 to 2, default: 0). + - `-2`: Lowest priority (no sound/vibration) + - `-1`: Low priority (no sound/vibration) + - `0`: Normal priority (default) + - `1`: High priority (bypasses quiet hours) + - `2`: Emergency priority (requires acknowledgment) + +For emergency priority (2), you must also provide: + +- **Retry**: How often (in seconds) Pushover will retry the notification. Minimum 30 seconds. +- **Expire**: How long (in seconds) to keep retrying. Maximum 10800 seconds (3 hours). + +To setup the Pushover notifications, you can read the [Pushover Documentation](https://pushover.net/api). diff --git a/apps/docs/content/docs/core/applications/going-production.mdx b/apps/docs/content/docs/core/applications/going-production.mdx index 086e740..c00c9eb 100644 --- a/apps/docs/content/docs/core/applications/going-production.mdx +++ b/apps/docs/content/docs/core/applications/going-production.mdx @@ -36,11 +36,11 @@ The repo have everything you need, however you can follow the same idea for your -3. The repository already have a Dockerfile, so we will use that, in the case your application is different create your own Dockerfile is required for this guide. -4. We will use `Dockerhub` as an example, but you can use any container registry that you want. -5. Make sure to create the repository in the `Dockerhub` , `namespace` is your username and `repository` is `example`. -6. Create a new Github Actions workflow in `.github/workflows/deploy.yml` -7. Add the following code to the workflow: +2. The repository already have a Dockerfile, so we will use that, in the case your application is different create your own Dockerfile is required for this guide. +3. We will use `Dockerhub` as an example, but you can use any container registry that you want. +4. Make sure to create the repository in the `Dockerhub` , `namespace` is your username and `repository` is `example`. +5. Create a new Github Actions workflow in `.github/workflows/deploy.yml` +6. Add the following code to the workflow: ```yaml name: Build Docker images @@ -74,7 +74,7 @@ jobs: namespace/example:latest platforms: linux/amd64 ``` -8. Create your own Dockerfile, in this case we will use the `Dockerfile` from the repository. +7. Create your own Dockerfile, in this case we will use the `Dockerfile` from the repository. ```properties FROM node:18-alpine AS base @@ -103,14 +103,14 @@ EXPOSE 3000 CMD ["pnpm", "start"] ``` -9. Now when you make a commit to your repository, the workflow will be triggered and the application will build and push to `Dockerhub`. -10. Now let's create application in Dokploy. -11. In `Source Type` select `Docker` -12. In the docker image field enter `namespace/example:latest` -13. Click on `Save`. -14. Click on `Deploy`. -15. Go to `Domains` and click `Dices` icon to generate a domain and the port set to `3000`. -16. Now you can access your application. +8. Now when you make a commit to your repository, the workflow will be triggered and the application will build and push to `Dockerhub`. +9. Now let's create application in Dokploy. +10. In `Source Type` select `Docker` +11. In the docker image field enter `namespace/example:latest` +12. Click on `Save`. +13. Click on `Deploy`. +14. Go to `Domains` and click `Dices` icon to generate a domain and the port set to `3000`. +15. Now you can access your application. ### Auto deploy diff --git a/apps/docs/content/docs/core/enterprise/audit-logs.txt b/apps/docs/content/docs/core/enterprise/audit-logs.txt new file mode 100644 index 0000000..9dbd992 --- /dev/null +++ b/apps/docs/content/docs/core/enterprise/audit-logs.txt @@ -0,0 +1,44 @@ +--- +title: Audit logs +description: Track user actions and changes for compliance and security +--- + +## What is logged + +Typical events include: + +- **Authentication** — Logins, logouts, failed attempts, SSO redirects. +- **Users and access** — User creation, updates, deletion, role changes, invite/revoke. +- **Resources** — Creation, update, and deletion of projects, applications, compose stacks, databases, domains, environment variables, and similar resources. +- **Deployments** — Deploy triggers, rollbacks, and related actions. +- **Settings** — Changes to organization, security, and whitelabel settings (where applicable). + +Each entry usually includes: + +- **Timestamp** (UTC) +- **Actor** (user ID, email, or service account) +- **Action** (e.g. `user.login`, `application.create`, `compose.deploy`) +- **Resource** (type and identifier) +- **Details** (e.g. old/new values or reason, when relevant) +- **IP address** (when available) + +## Accessing audit logs + +1. Go to **Settings** → **Audit logs** (or **Organization** → **Audit logs** in Enterprise). +2. Use filters by date range, user, action type, or resource. +3. Export results (e.g. CSV or JSON) for external tools or compliance reviews. + +## Retention and storage + +- Retention period and storage backend (e.g. database, external logging) depend on your Enterprise agreement. +- Configure retention and any archiving according to your compliance and security policies. + +## Compliance + +Audit logs help support: + +- **SOC 2** — Evidence of access control and change management. +- **GDPR** — Documentation of access to and changes in personal data and configurations. +- **Internal policies** — Review of who changed what and when. + +For retention, export formats, or integration with your SIEM or log pipeline, [contact us](https://dokploy.com/contact). diff --git a/apps/docs/content/docs/core/enterprise/index.mdx b/apps/docs/content/docs/core/enterprise/index.mdx new file mode 100644 index 0000000..5dc94ce --- /dev/null +++ b/apps/docs/content/docs/core/enterprise/index.mdx @@ -0,0 +1,21 @@ +--- +title: Introduction +description: Enterprise features for SSO, whitelabeling, and audit logs +--- + + +## What's included + +- **Single Sign-On (SSO)** — Integrate with Auth0, Keycloak, or other OIDC/SAML providers. +{/* - **Whitelabeling** — Rebrand the UI with your logo, colors, and domain (self-hosted only) (). */} +{/* - **Audit logs** — Track user actions and changes for compliance and security. */} + +More Enterprise features are on the way. [Contact us](https://dokploy.com/contact) if you want early access or have specific requirements. + +## Contact us + +For pricing and to enable Enterprise features on your instance, get in touch with our team: + +**[Contact us →](https://dokploy.com/contact)** + +We'll help you configure SSO, whitelabeling, and audit logs for your organization. diff --git a/apps/docs/content/docs/core/enterprise/license-keys.mdx b/apps/docs/content/docs/core/enterprise/license-keys.mdx new file mode 100644 index 0000000..e967526 --- /dev/null +++ b/apps/docs/content/docs/core/enterprise/license-keys.mdx @@ -0,0 +1,23 @@ +--- +title: License Keys +description: Activate and manage your Enterprise license +--- + +To use Enterprise features (SSO, whitelabeling, audit logs, and more), you need a valid license issued by the Dokploy team. + +By default, all Dokploy instances run in the standard edition. If you are interested in switching to the Enterprise version, [contact us](https://dokploy.com/contact). Once you receive your license key, you can activate it in your instance. + +## Activating your license + +1. Go to **Settings** → **License** (or **Organization** → **License** in Enterprise). +2. Enter your license key and click **Activate**. + +Your instance will then have access to Enterprise features for the duration of the license. + +## How validation works + +- The license is validated **every day** against our servers to verify that it is still valid. +- The **only data** used for validation is the **IP address** of your server. We check it against our license server to confirm that the key is valid and active for that server. +- No other data is sent or stored for license validation. + +If your server’s IP changes, or you have questions about your license, [contact us](https://dokploy.com/contact). diff --git a/apps/docs/content/docs/core/enterprise/sso/auth0.mdx b/apps/docs/content/docs/core/enterprise/sso/auth0.mdx new file mode 100644 index 0000000..567693f --- /dev/null +++ b/apps/docs/content/docs/core/enterprise/sso/auth0.mdx @@ -0,0 +1,107 @@ +--- +title: Auth0 +description: Configure SSO with Auth0 (OIDC or SAML) +--- + + + + +## 1. Create an application in Auth0 + +1. Log in to the [Auth0 Dashboard](https://manage.auth0.com/). +2. Go to **Applications** → **Applications** → **Create Application**. +3. Choose **Regular Web Application** and create it. +4. Note your **Domain**, **Client ID**, and **Client Secret**. + +## 2. Configure Dokploy + +1. In Dokploy, go to **Settings** (or **Organization** / **Security** in Enterprise). +2. Enable **SSO** and choose **OpenID Connect**. +3. Enter: + - **Provider**: myorg-name-auth0 (Unique) + - **Issuer URL**: `https://YOUR_AUTH0_DOMAIN/` (Make sure add the trailing slash) + - **Domain**: the domain users use to authenticate via Auth0 (e.g. your organization domain like `acme.com`), not the Dokploy instance URL + - **Client ID**: from Auth0 application + - **Client Secret**: from Auth0 application + - **Scopes**: openid email profile +4. Save. + +## 3. Configure Auth0 + +1. In your application, go to **Settings**. +2. Set **Allowed Callback URLs** to your Dokploy URL, for example: + - `https://your-dokploy-domain.com/api/auth/callback/myorg-name-auth0` +3. Set **Allowed Logout URLs** to: + - `https://your-dokploy-domain.com` +4. Set **Allowed Origins** to: + - `https://your-dokploy-domain.com` +5. Save changes. + +## Troubleshooting (OIDC) + +- **Redirect URI mismatch** — Ensure the callback URL in Dokploy matches exactly what is configured in Auth0 (including protocol and path). +- **Invalid client** — Double-check Client ID and Client Secret, and that the application is a web application. +- **Scopes** — Ensure Auth0 is configured to return `openid` and, if required, `email` and `profile`. + + + + +## 1. Create a SAML application in Auth0 + +1. Log in to the [Auth0 Dashboard](https://manage.auth0.com/). +2. Go to **Applications** → **Applications** → **Create Application**. +3. Choose **Regular Web Application** and create it. +4. In the application, go to **Add Ons** → enable **SAML 2 Web App** and configure it, in the settings specify this callback URL: `https://your-dokploy-domain.com/api/auth/sso/saml2/callback/myorg-name-auth0-saml`. +5. Next & Save. + +## 2. Configure Dokploy + +1. In Dokploy, go to **Settings** (or **Organization** / **Security** in Enterprise). +2. Enable **SSO** and choose **SAML**. +3. Enter: + - **Provider**: myorg-name-auth0-saml (unique name for this provider) + - **Issuer URL**: the Auth0 SAML Entity ID / Issuer located in `Add Ons` tab called `SAML 2 Web App` called `Entity ID` (e.g. `urn:auth0:your-tenant:your-app`) + - **SSO URL**: the Auth0 SAML Single Sign-On URL located in `Add Ons` tab called `SAML 2 Web App` called `Single Sign-On URL` (e.g. `https://dev-ladsadb.us.auth0.com/samlp/wgJe9bWmwhVnuAC7eNtyUsiou4b6wxuf`) + - **Certificate**: download the certificate active (x509) from the `Add Ons` tab called `SAML 2 Web App` called `Identity Provider Certificate` and paste it in the `Certificate` field. + - **Federation Metadata XML**: copy the Identity Provider Metadata XML from the certificate active and paste it in the `Metadata XML` field. + - **Domain**: the domain users use to authenticate via Auth0 (e.g. your organization domain like `acme.com`), not the Dokploy instance URL +4. Save. + +## 3. Configure Auth0 (SAML) + +1. In your Auth0 SAML application, set the **Application Callback URL** (ACS URL) to your Dokploy SAML ACS URL, for example: + - `https://your-dokploy-domain.com/api/auth/sso/saml2/callback/myorg-name-auth0-saml` +2. In the **SAML 2 Web App** add-on, open **Settings** and paste the following JSON in the **Settings** (Application Settings) field. Replace `https://your-dokploy-domain.com` with your Dokploy base URL and `myorg-name-auth0-saml` with the **exact same provider name** you entered in Dokploy in step 2 (the callback URL path must match), so Dokploy can read email, display name, and other attributes: + +```json +{ + "audience": "https://your-dokploy-domain.com/saml/metadata", + "recipient": "https://your-dokploy-domain.com/api/auth/sso/saml2/callback/myorg-name-auth0-saml", + "destination": "https://your-dokploy-domain.com/api/auth/sso/saml2/callback/myorg-name-auth0-saml", + "signResponse": true, + "signAssertion": true, + "nameIdentifierFormat": "urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress", + "nameIdentifierProbes": [ + "email" + ], + "mappings": { + "email": "email", + "displayName": "name", + "givenName": "given_name", + "surname": "family_name" + } +} +``` + +4. Save. + +## Troubleshooting (SAML) + +- **ACS URL mismatch** — Ensure the callback/ACS URL in Auth0 matches exactly what Dokploy provides (including protocol and path). +- **Certificate** — Use the full x509 certificate from Auth0 (PEM format); ensure no extra spaces or line breaks. +- **Entity ID** — The Entity ID in Dokploy must match the Issuer/Entity ID configured in Auth0. + + + + +For help with your setup, [contact us](https://dokploy.com/contact). diff --git a/apps/docs/content/docs/core/enterprise/sso/azure.mdx b/apps/docs/content/docs/core/enterprise/sso/azure.mdx new file mode 100644 index 0000000..7f9175e --- /dev/null +++ b/apps/docs/content/docs/core/enterprise/sso/azure.mdx @@ -0,0 +1,88 @@ +--- +title: Azure AD (Microsoft Entra ID) +description: Configure SSO with Azure AD / Microsoft Entra ID (OIDC or SAML) +--- + + + + +## 1. Register an application in Azure + +1. Log in to the [Azure Portal](https://portal.azure.com/). +2. Go to **Microsoft Entra ID** (or **Azure Active Directory**) → **App registrations** → **New registration**. +3. Enter a **Name** (e.g. Dokploy), choose supported account types, and set **Redirect URI** to **Web** with a placeholder for now (e.g. `https://your-dokploy-domain.com/api/auth/callback/myorg-name-azure`). +4. Register and note the **Application (client) ID** and **Directory (tenant) ID**. +5. Go to **Certificates & secrets** → **New client secret**, create a secret and note its **Value** (you won’t see it again). +6. The **Issuer URL** for OpenID Connect is: `https://login.microsoftonline.com/{tenant-id}/v2.0` (replace `{tenant-id}` with your Directory (tenant) ID). Some setups expect a trailing slash. + +## 2. Configure Dokploy + +1. In Dokploy, go to **Settings** (or **Organization** / **Security** in Enterprise). +2. Enable **SSO** and choose **OpenID Connect**. +3. Enter: + - **Provider**: myorg-name-azure (unique name for this provider) + - **Issuer URL**: `https://login.microsoftonline.com/YOUR_TENANT_ID/v2.0` (use your Directory (tenant) ID; add a trailing slash if required for discovery) + - **Domain**: the domain users use to authenticate via Azure AD (e.g. your organization domain like `acme.com`), not the Dokploy instance URL + - **Client ID**: the Application (client) ID from Azure + - **Client Secret**: the client secret value from Certificates & secrets + - **Scopes**: openid email profile +4. Save. + +## 3. Configure Azure + +1. In your app registration, go to **Authentication**. +2. Under **Web** → **Redirect URIs**, add: + - `https://your-dokploy-domain.com/api/auth/callback/myorg-name-azure` +3. Under **Front-channel logout URL** (optional), you can set: + - `https://your-dokploy-domain.com` +4. Go to **Token Configuration** and add optional claim, select **email**, **preferred_username** and **upn** from the list of claims. +5. Save. + +## Troubleshooting (OIDC) + +- **Redirect URI mismatch** — Ensure the callback URL in Dokploy matches exactly what is configured in Azure (including protocol and path). Use the same **Provider** value in the path (e.g. `.../api/auth/callback/myorg-name-azure`). +- **Invalid client** — Double-check Application (client) ID and client secret. Confirm the secret has not expired under **Certificates & secrets**. +- **Tenant** — Use the correct Directory (tenant) ID in the Issuer URL. For multi-tenant apps, you may use `common` instead of the tenant ID (e.g. `https://login.microsoftonline.com/common/v2.0`). +- **Scopes** — Ensure the app registration has the right API permissions (e.g. **OpenID permissions**, **User.Read**) if required for `openid`, `email`, and `profile`. + + + + +## 1. Create an Enterprise Application (SAML) in Azure + +1. Log in to the [Azure Portal](https://portal.azure.com/). +2. Go to **Microsoft Entra ID** → **Enterprise applications** → **New application** → **Create your own application** (or **Non-gallery application**). +3. Enter a **Name** (e.g. Dokploy) and create. +4. Go to **Single sign-on** → **SAML**. +5. Note the **Identifier (Entity ID)** and **Login URL** (SSO URL). Under **SAML Certificates**, download or copy the **Certificate (Base64)** (x509) and download the **Federation Metadata XML** file. + +## 2. Configure Dokploy + +1. In Dokploy, go to **Settings** (or **Organization** / **Security** in Enterprise). +2. Enable **SSO** and choose **SAML**. +3. Enter: + - **Provider**: myorg-name-azure-saml (unique name for this provider) + - **Issuer URL**: the Azure SAML Entity ID (Identifier) from the Enterprise application (eg. `https://sts.windows.net/YOUR_TENANT_ID/`). + - **SSO URL**: the Azure Login URL (Single Sign-On URL) (eg. `https://login.microsoftonline.com/YOUR_TENANT_ID/saml2`) + - **Certificate**: the IdP signing certificate (x509 Base64) from Azure + - **Federation Metadata XML**: the Federation Metadata XML file from Azure + - **Domain**: the domain users use to authenticate via Azure AD (e.g. your organization domain like `acme.com`), not the Dokploy instance URL +4. Save. + +## 3. Configure Azure (SAML) + +1. In your Enterprise application, go to **Single sign-on** → **SAML**. +2. Under **Basic SAML Configuration**, set **Identifier (Entity ID)** if required (SP Entity ID from Dokploy) (eg. `https://your-dokploy-instance.com`). +3. Set **Reply URL (Assertion Consumer Service URL)** to your Dokploy SAML ACS URL (eg. `https://your-dokploy-instance.com/api/auth/sso/saml2/callback/myorg-name-azure-saml`). +3. Save. + +## Troubleshooting (SAML) + +- **ACS URL mismatch** — Ensure the Reply URL (ACS) in Azure matches exactly what Dokploy provides (including protocol and path). +- **Certificate** — Use the Certificate (Base64) from Azure; paste as-is or convert to PEM if Dokploy expects PEM. +- **Entity ID** — The Entity ID in Dokploy must match the Identifier (Entity ID) of the Azure Enterprise application. + + + + +For help with your setup, [contact us](https://dokploy.com/contact). diff --git a/apps/docs/content/docs/core/enterprise/sso/index.mdx b/apps/docs/content/docs/core/enterprise/sso/index.mdx new file mode 100644 index 0000000..45a5221 --- /dev/null +++ b/apps/docs/content/docs/core/enterprise/sso/index.mdx @@ -0,0 +1,17 @@ +--- +title: Single Sign-On (SSO) +description: Configure SSO with Auth0, Keycloak, or other OIDC/SAML providers +--- + +Enterprise supports Single Sign-On via OpenID Connect (OIDC) and SAML. You can use Auth0, Keycloak, or any compatible identity provider. + +Choose a provider below for step-by-step configuration: + +- **[Auth0](/docs/core/enterprise/sso/auth0)** — Cloud identity platform +- **[Azure AD (Microsoft Entra ID)](/docs/core/enterprise/sso/azure)** — Microsoft's cloud identity platform +- **[Okta](/docs/core/enterprise/sso/okta)** — Cloud identity platform +- **[Keycloak](/docs/core/enterprise/sso/keycloak)** — Open-source identity and access management + +You can also use any other OIDC/SAML provider by configuring the endpoints and flow manually. + +For other OIDC/SAML providers, use the same endpoints and flow; [contact us](https://dokploy.com/contact) if you need help. diff --git a/apps/docs/content/docs/core/enterprise/sso/keycloak.mdx b/apps/docs/content/docs/core/enterprise/sso/keycloak.mdx new file mode 100644 index 0000000..bb40053 --- /dev/null +++ b/apps/docs/content/docs/core/enterprise/sso/keycloak.mdx @@ -0,0 +1,48 @@ +--- +title: Keycloak +description: Configure SSO with Keycloak +--- + +## 1. Create a client in Keycloak + +1. Log in to your Keycloak Admin Console. +2. Select your realm (or create one). +3. Go to **Clients** → **Create client**. +4. Set **Client ID** (e.g. `my-client-id`) and **Client type** to **OpenID Connect**. +5. Set **Root URL** to your Dokploy base URL, e.g. `https://your-dokploy-domain.com`. +6. Save. +7. Open the client, set **Access type** to **confidential**, then open the **Credentials** tab and note the **Secret**. +8. From **Realm settings** → **OpenID Endpoint Configuration**, note the **Issuer** (e.g. `https://keycloak.example.com/realms/your-realm`). + +## 2. Configure Dokploy + +1. In Dokploy, go to **Settings** (or **Organization** / **Security** in Enterprise). +2. Enable **SSO** and choose **OpenID Connect**. +3. Enter: + - **Provider**: my-client-id (Unique) + - **Issuer URL**: your Keycloak realm URL (e.g. `https://keycloak.example.com/realms/your-realm`) + - **Domain**: the domain users use to authenticate via Keycloak (e.g. your organization domain like `acme.com`), not the Dokploy instance URL + - **Client ID**: my-client-id + - **Client Secret**: the secret from the Keycloak client Credentials tab + - **Scopes**: openid email profile +4. Save. + +## 3. Configure Keycloak + +1. In your Keycloak client, go to **Settings**. +2. Set **Valid redirect URIs** to your Dokploy callback URL, for example: + - `https://your-dokploy-domain.com/api/auth/callback/my-client-id` +3. Set **Valid post logout redirect URIs** to: + - `https://your-dokploy-domain.com` +4. Set **Allowed Origins** to: + - `https://your-dokploy-domain.com` +5. Save changes. + +## Troubleshooting + +- **Redirect URI mismatch** — Ensure the callback URL in Dokploy matches exactly what is configured in Keycloak (including protocol and path). Use the same **Provider** value in the path (e.g. `.../api/auth/callback/myorg-name-keycloak`). +- **Invalid client** — Double-check Client ID and Client Secret, and that the client is enabled and set to confidential access. +- **Scopes** — Ensure the client is configured to request `openid` and, if required, `email` and `profile`. +- **Attribute mapping** — If user email or name is missing, map Keycloak attributes (e.g. email, preferred_username) in Dokploy if your setup supports it. + +For help with your setup, [contact us](https://dokploy.com/contact). diff --git a/apps/docs/content/docs/core/enterprise/sso/meta.json b/apps/docs/content/docs/core/enterprise/sso/meta.json new file mode 100644 index 0000000..2a9074d --- /dev/null +++ b/apps/docs/content/docs/core/enterprise/sso/meta.json @@ -0,0 +1,9 @@ +{ + "title": "SSO", + "pages": [ + "auth0", + "azure", + "keycloak", + "okta" + ] +} diff --git a/apps/docs/content/docs/core/enterprise/sso/okta.mdx b/apps/docs/content/docs/core/enterprise/sso/okta.mdx new file mode 100644 index 0000000..94f9068 --- /dev/null +++ b/apps/docs/content/docs/core/enterprise/sso/okta.mdx @@ -0,0 +1,80 @@ +--- +title: Okta +description: Configure SSO with Okta (OIDC or SAML) +--- + + + + +## 1. Create an application in Okta + +1. Log in to the [Okta Admin Console](https://login.okta.com/) (or your Okta domain). +2. Go to **Applications** → **Applications** → **Create App Integration**. +3. Choose **OIDC - OpenID Connect** and **Web Application**, then create it. +4. Note your **Client ID** and **Client Secret** (under **General** or **Client credentials**). +5. Note your Okta **domain** (e.g. `https://your-domain.okta.com`) and, if using a custom authorization server, its **issuer** (e.g. `https://your-domain.okta.com/oauth2/default`) or go to **Security** → **API** → **Authorization Servers** and note the **Issuer** (e.g. `https://your-domain.okta.com`). + +## 2. Configure Dokploy + +1. In Dokploy, go to **Settings** (or **Organization** / **Security** in Enterprise). +2. Enable **SSO** and choose **OpenID Connect**. +3. Enter: + - **Provider**: myorg-name-okta (unique name for this provider) + - **Issuer URL**: your Okta issuer URL (e.g. `https://your-domain.okta.com`) + - **Domain**: the domain users use to authenticate via Okta (e.g. your organization domain like `acme.com`), not the Dokploy instance URL + - **Client ID**: from the Okta application + - **Client Secret**: from the Okta application + - **Scopes**: openid email profile +4. Save. + +## 3. Configure Okta + +1. In your Okta application, go to **General** (or **Sign-in** / **Assignments** as needed). +2. Set **Sign-in redirect URIs** to your Dokploy callback URL, for example: + - `https://your-dokploy-domain.com/api/auth/callback/myorg-name-okta` +3. Set **Sign-out redirect URIs** (optional) to: + - `https://your-dokploy-domain.com` +4. Under **Trusted Origins**, add your Dokploy URL as an origin (e.g. `https://your-dokploy-domain.com`) if required for CORS. +5. Save. + +## Troubleshooting (OIDC) + +- **Redirect URI mismatch** — Ensure the callback URL in Dokploy matches exactly what is configured in Okta (including protocol and path). Use the same **Provider** value in the path (e.g. `.../api/auth/callback/myorg-name-okta`). +- **Invalid client** — Double-check Client ID and Client Secret, and that the application is a Web Application with the correct grant types (e.g. Authorization Code). +- **Issuer URL** — Use the full issuer URL for your authorization server (e.g. `https://your-domain.okta.com`). +- **Scopes** — Ensure the Okta authorization server is configured to allow `openid`, and if needed `email` and `profile`. + + + + +## 1. Create a SAML application in Okta + +1. Log in to the [Okta Admin Console](https://login.okta.com/) (or your Okta domain). +2. Go to **Applications** → **Applications** → **Create App Integration**. +3. Choose **SAML 2.0** and create it. +4. Enter an **App name** (e.g. Dokploy). Under **Configure SAML**, in the Single sign-on URL field, set the SAML ACS URL (eg. `https://your-dokploy-instance.com/api/auth/sso/saml2/callback/myorg-name-okta-saml`) and in the Audience URI (SP Entity ID) field, set the SP Entity ID (eg. `https://your-dokploy-instance.com`). +5. Next & Save. + +## 2. Configure Dokploy + +1. In Dokploy, go to **Settings** (or **Organization** / **Security** in Enterprise). +2. Enable **SSO** and choose **SAML**. +3. Enter: + - **Provider**: myorg-name-okta-saml (unique name for this provider) + - **Issuer URL**: the Okta Identity Provider issuer (Entity ID) located in `Sign On` tab called `Issuer` (eg. `http://www.okta.com/exkzq3acyuEtIuNrW697`) + - **SSO URL**: the Okta Identity Provider single sign-on URL located in `Sign On` tab called `Single sign-on URL` (eg. `https://trial-2804699.okta.com/app/trial-2802699_something/exkzqi3cyuEtIuNrW697/sso/saml`) + - **Certificate**: go to `Signing Certificate` tab and download the certificate active (x509) and paste it in the `Certificate` field. + - **Federation Metadata XML**: copy the idp metadata XML from the certificate active and paste it in the `Metadata XML` field. + - **Domain**: the domain users use to authenticate via Okta (e.g. your organization domain like `acme.com`), not the Dokploy instance URL +4. Save. + +## Troubleshooting (SAML) + +- **ACS URL mismatch** — Ensure the Single sign-on URL (ACS) in Okta matches exactly what Dokploy provides (including protocol and path). +- **Certificate** — Use the x509 certificate from Okta’s IdP metadata (PEM or Base64); ensure it is the one used to sign assertions. +- **Entity ID** — The Entity ID in Dokploy must match the Identity Provider issuer in Okta. + + + + +For help with your setup, [contact us](https://dokploy.com/contact). diff --git a/apps/docs/content/docs/core/enterprise/whitelabeling.txt b/apps/docs/content/docs/core/enterprise/whitelabeling.txt new file mode 100644 index 0000000..64c69b7 --- /dev/null +++ b/apps/docs/content/docs/core/enterprise/whitelabeling.txt @@ -0,0 +1,37 @@ +--- +title: Whitelabeling +description: Rebrand Dokploy with your logo, colors, and domain +--- + + +## What you can customize + +- **Logo** — Header and login logo. +- **Favicon** — Browser tab icon. +- **Colors** — Primary color and accent (e.g. buttons, links). +- **Custom domain** — Serve the app from your own domain (e.g. `deploy.yourcompany.com`). + +## Configuration + +Whitelabel settings are managed in the Enterprise admin area (or via environment variables, depending on your deployment). + +1. Go to **Settings** → **Whitelabel** (or equivalent in your Enterprise setup). +2. Upload your **logo** (recommended: SVG or PNG, transparent background). +3. Upload your **favicon** (e.g. ICO or PNG). +4. Set **primary color** and **accent color** (hex codes). +5. If using a custom domain, configure your reverse proxy (e.g. Traefik, Nginx) and DNS to point to your Dokploy instance, and set the **base URL** in Dokploy to match. + +## Custom domain + +1. Create a CNAME (or A) record pointing your domain to the server or load balancer where Dokploy runs. +2. Configure TLS (e.g. Let's Encrypt) on your reverse proxy for that hostname. +3. In Dokploy, set the **Application URL** (or equivalent) to `https://your-domain.com`. +4. Restart or reload Dokploy so it uses the new base URL for redirects and links. + +## Best practices + +- Use high-resolution logos (e.g. 2x) for sharp display on retina screens. +- Keep primary and accent colors accessible (sufficient contrast for text and buttons). +- Test login and main flows after changing logo and colors to ensure nothing is broken or hard to read. + +For help enabling or configuring whitelabeling, [contact us](https://dokploy.com/contact). diff --git a/apps/docs/content/docs/core/manual-installation.mdx b/apps/docs/content/docs/core/manual-installation.mdx index 5f68abc..3c8f9e5 100644 --- a/apps/docs/content/docs/core/manual-installation.mdx +++ b/apps/docs/content/docs/core/manual-installation.mdx @@ -372,3 +372,34 @@ curl -sSL https://dokploy.com/install.sh | sh export ADVERTISE_ADDR=192.168.1.100 curl -sSL https://dokploy.com/install.sh | sh ``` + +## Updating Traefik Manually + +Dokploy does not update the Traefik container automatically when you upgrade. This is intentional to avoid unexpected downtime for your services. If you need a newer Traefik version (for example, due to a breaking change or security fix), you can update it manually. + +1. Remove the existing Traefik container. +2. Create a new container with the desired Traefik image version and the same configuration. +3. Connect the new container to the Dokploy network. + +Example (replace `v3.6.7` with the version you want): + +```bash +docker rm -f dokploy-traefik + +docker run -d \ + --name dokploy-traefik \ + --restart always \ + -v /etc/dokploy/traefik/traefik.yml:/etc/traefik/traefik.yml \ + -v /etc/dokploy/traefik/dynamic:/etc/dokploy/traefik/dynamic \ + -v /var/run/docker.sock:/var/run/docker.sock:ro \ + -p 80:80/tcp \ + -p 443:443/tcp \ + -p 443:443/udp \ + traefik:v3.6.7 + +docker network connect dokploy-network dokploy-traefik +``` + + + **Breaking changes:** Some Traefik versions introduce breaking changes that may not be compatible with the configuration and structure Dokploy uses. Before upgrading, check the [Traefik release notes](https://github.com/traefik/traefik/releases) and [Dokploy releases](https://github.com/Dokploy/dokploy/releases) for any announced breaking changes. Using an incompatible version can cause routing issues (e.g. 404s for applications using domains). + diff --git a/apps/docs/content/docs/core/meta.json b/apps/docs/content/docs/core/meta.json index 6ac1d41..14a6fa6 100644 --- a/apps/docs/content/docs/core/meta.json +++ b/apps/docs/content/docs/core/meta.json @@ -35,7 +35,6 @@ "applications", "docker-compose", "databases", - "templates", "(examples)", "auto-deploy", "schedule-jobs", @@ -49,11 +48,17 @@ "remote-servers/deployments", "remote-servers/security", "remote-servers/validate", + "---Advanced---", + "cluster", + "---Enterprise---", + "enterprise/index", + "enterprise/license-keys", + "enterprise/sso", + "enterprise/whitelabeling", + "enterprise/audit-logs", "---Guides---", "guides/cloudflare-tunnels", "guides/tailscale", - "guides/ec2-instructions", - "---Advanced---", - "cluster" + "guides/ec2-instructions" ] } diff --git a/apps/docs/content/docs/core/templates.mdx b/apps/docs/content/docs/core/templates.mdx deleted file mode 100644 index 760f6c4..0000000 --- a/apps/docs/content/docs/core/templates.mdx +++ /dev/null @@ -1,122 +0,0 @@ ---- -title: Open Source Templates -description: Deploy open source templates with Dokploy ---- - -By default we include a set of templates, that you can use to spin up templates quickly. You can also create your own templates. - -## Templates - -The following templates are available (100): - -- **Appwrite**: End-to-end backend server for Web, Mobile, Native, or Backend apps with user authentication, database, storage, and more. -- **Outline**: Self-hosted knowledge base and documentation platform. -- **Supabase**: The open-source Firebase alternative with a dedicated Postgres database for web, mobile, and AI applications. -- **Pocketbase**: Open-source backend for your next SaaS and Mobile app in 1 file. -- **Plausible**: Open-source, privacy-focused, self-hosted web analytics platform. -- **Calcom**: Open-source alternative to Calendly for creating scheduling and booking services. -- **Grafana**: Open-source platform for data visualization and monitoring. -- **Directus**: API-first, open-source headless CMS for building custom backends. -- **Baserow**: Open-source database management tool. -- **Budibase**: Open-source low-code platform for building forms, portals, and approval apps. -- **Ghost**: Professional publishing platform built on Node.js. -- **Uptime Kuma**: Free and open-source monitoring tool. -- **n8n**: Open-source low-code platform for automating workflows. -- **Wordpress**: Free and open-source CMS for publishing websites. -- **Odoo**: Free and open-source business management software. -- **Appsmith**: Open-source platform for building internal tools. -- **Excalidraw**: Open-source online diagramming tool. -- **Documenso**: Open-source alternative to DocuSign. -- **NocoDB**: Airtable alternative for databases. -- **Meilisearch**: Free and open-source search engine. -- **Phpmyadmin**: Web interface for MySQL/MariaDB management. -- **Rocketchat**: Open-source web chat platform. -- **Minio**: Open-source object storage server. -- **Metabase**: Open-source business intelligence tool. -- **Glitchtip**: Simple, open-source error tracking. -- **Open WebUI**: Open-source ChatGPT alternative. -- **Listmonk**: Self-hosted newsletter manager. -- **Double Zero**: Self-hostable SES dashboard. -- **Umami**: Privacy-focused analytics alternative. -- **Jellyfin**: Free software media system. -- **Teable**: No-code database with spreadsheet interface. -- **Zipline**: ShareX/file upload server. -- **Soketi**: Open-source WebSockets server. -- **Aptabase**: Self-hosted analytics platform. -- **Typebot**: Open-source chatbot builder. -- **Gitea**: Self-hosted software development service. -- **Roundcube**: Open-source webmail software. -- **File Browser**: Web-based file manager. -- **Tolgee**: Web-based localization platform. -- **Portainer**: Container management tool. -- **InfluxDB**: Time-series data platform. -- **Infisical**: Configuration and secrets manager. -- **Docmost**: Collaborative wiki software. -- **Vaultwarden**: Bitwarden-compatible server. -- **Hi.events**: Event management platform. -- **Windows/MacOS**: Dockerized operating systems. -- **Coder**: Cloud development environment. -- **Stirling PDF**: PDF tools suite. -- **Lobe Chat**: Modern AI chat framework. -- **Peppermint**: API development platform. -- **Windmill**: Workflow and internal apps platform. -- **Activepieces**: No-code automation tool. -- **InvoiceShelf**: Self-hosted invoicing system. -- **Postiz**: Content management platform. -- **Slash**: Bookmarking and link shortener. -- **Discord Tickets**: Support ticket bot. -- **Nextcloud AIO**: File storage and collaboration. -- **Blender**: 3D creation suite. -- **HeyForm**: Conversational form builder. -- **Chatwoot**: Customer engagement platform. -- **Discourse**: Modern forum software. -- **Immich**: Photo/video backup solution. -- **Twenty CRM**: Modern CRM alternative. -- **YOURLS**: URL shortening service. -- **Ryot**: Media tracking platform. -- **PhotoPrism**: AI-powered photos app. -- **Ontime**: Event rundown manager. -- **Trigger.dev**: Event-driven application platform. -- **Browserless**: Headless browser automation. -- **draw.io**: Diagramming application. -- **Kimai**: Time-tracking application. -- **Logto**: Identity management platform. -- **Penpot**: Open-source design tool. -- **Huly**: Project management platform. -- **Unsend**: Email service platform. -- **Langflow**: Low-code AI application builder. -- **Elasticsearch**: Search and analytics engine. -- **OneDev**: Git server with CI/CD. -- **Unifi Network**: Network management platform. -- **GLPI**: Service management software. -- **Checkmate**: Server monitoring tool. -- **Gotenberg**: PDF generation API. -- **Actual Budget**: Privacy-focused finance app. -- **Conduit/Conduwuit**: Matrix chat servers. -- **Cloudflared**: Cloudflare Tunnel daemon. -- **CouchDB**: Document-oriented database. -- **IT Tools**: Developer utilities collection. -- **Superset**: Data visualization platform. -- **Glance/Homarr**: Dashboard solutions. -- **ERPNext**: Open-source ERP software. -- **Maybe**: Finance tracking application. -- **Spacedrive**: Cross-platform file manager. -- **AList**: Multi-storage file manager. -- **Answer**: Q&A platform. -- **Shlink**: URL shortener. -- **Frappe HR**: HR & Payroll software. -- **Formbricks**: Survey platform. -- **Trilium**: Note-taking application. -- **Convex**: Reactive database platform. - -For an up to date list of available template you can visit [Dokploy templates website](https://templates.dokploy.com/). - -## Create your own template - -We accept contributions to upload new templates to the dokploy repository. - -Make sure to follow the guidelines for creating a template: - -[Steps to create your own template](https://github.com/Dokploy/templates) - -[^1]: Please note that if you're self-hosting a mail server you need port 25 to be open for SMTP (Mail Transmission Protocol that allows you to send and receive) to work properly. Some VPS providers like [Hetzner](https://docs.hetzner.com/cloud/servers/faq/#why-can-i-not-send-any-mails-from-my-server) block this port by default for new clients. diff --git a/apps/docs/content/docs/meta.json b/apps/docs/content/docs/meta.json index d0f3e5b..8be756a 100644 --- a/apps/docs/content/docs/meta.json +++ b/apps/docs/content/docs/meta.json @@ -1,3 +1,3 @@ { - "pages": ["core", "cli", "api"] + "pages": ["core", "cli", "api", "templates"] } diff --git a/apps/docs/mdx-components.tsx b/apps/docs/mdx-components.tsx index ee98bd2..523486e 100644 --- a/apps/docs/mdx-components.tsx +++ b/apps/docs/mdx-components.tsx @@ -1,6 +1,7 @@ import { APIPage } from "@/lib/source"; import { Callout } from "fumadocs-ui/components/callout"; import { ImageZoom } from "fumadocs-ui/components/image-zoom"; +import { Tab, Tabs } from "fumadocs-ui/components/tabs"; import defaultMdxComponents from "fumadocs-ui/mdx"; import type { MDXComponents } from "mdx/types"; @@ -9,6 +10,8 @@ export function getMDXComponents(components?: MDXComponents): MDXComponents { ...defaultMdxComponents, ImageZoom, Callout, + Tab, + Tabs, APIPage, ...components, p: ({ children }) => ( diff --git a/apps/docs/next.config.mjs b/apps/docs/next.config.mjs index dc4fcb1..24fe13c 100644 --- a/apps/docs/next.config.mjs +++ b/apps/docs/next.config.mjs @@ -5,6 +5,14 @@ const withMDX = createMDX(); /** @type {import('next').NextConfig} */ const config = { reactStrictMode: true, + images: { + remotePatterns: [ + { + protocol: "https", + hostname: "templates.dokploy.com", + }, + ], + }, }; export default withMDX(config); diff --git a/apps/docs/package.json b/apps/docs/package.json index f58ce77..dced764 100644 --- a/apps/docs/package.json +++ b/apps/docs/package.json @@ -9,7 +9,8 @@ "types:check": "fumadocs-mdx && tsc --noEmit", "postinstall": "fumadocs-mdx", "fix-openapi": "node scripts/fix-openapi.mjs", - "build:docs": "npm run fix-openapi && node generate-docs.mjs" + "generate-templates": "node scripts/generate-templates.mjs", + "build:docs": "npm run fix-openapi && npm run generate-templates && node generate-docs.mjs" }, "dependencies": { "@next/third-parties": "16.0.7", @@ -21,7 +22,7 @@ "fumadocs-openapi": "10.1.1", "fumadocs-ui": "16.2.3", "lucide-react": "^0.552.0", - "next": "16.0.10", + "next": "16.1.5", "react": "^19.2.0", "react-dom": "^19.2.0", "shiki": "3.19.0", diff --git a/apps/docs/public/openapi.json b/apps/docs/public/openapi.json index abc2a1e..1640060 100644 --- a/apps/docs/public/openapi.json +++ b/apps/docs/public/openapi.json @@ -820,7 +820,10 @@ "minLength": 1 }, "appName": { - "type": "string" + "type": "string", + "minLength": 1, + "maxLength": 63, + "pattern": "^[a-zA-Z0-9._-]+$" }, "description": { "type": "string", @@ -910,7 +913,10 @@ "type": "object", "properties": { "appName": { - "type": "string" + "type": "string", + "minLength": 1, + "maxLength": 63, + "pattern": "^[a-zA-Z0-9._-]+$" }, "applicationId": { "type": "string" @@ -1854,7 +1860,10 @@ "minLength": 1 }, "appName": { - "type": "string" + "type": "string", + "minLength": 1, + "maxLength": 63, + "pattern": "^[a-zA-Z0-9._-]+$" }, "description": { "type": "string", @@ -2361,8 +2370,9 @@ }, "DriverOpts": { "type": "object", - "properties": {}, - "additionalProperties": false + "additionalProperties": { + "type": "string" + } } }, "additionalProperties": false @@ -2404,6 +2414,33 @@ "additionalProperties": false, "nullable": true }, + "ulimitsSwarm": { + "type": "array", + "items": { + "type": "object", + "properties": { + "Name": { + "type": "string", + "minLength": 1 + }, + "Soft": { + "type": "integer", + "minimum": -1 + }, + "Hard": { + "type": "integer", + "minimum": -1 + } + }, + "required": [ + "Name", + "Soft", + "Hard" + ], + "additionalProperties": false + }, + "nullable": true + }, "replicas": { "type": "number" }, @@ -2789,7 +2826,10 @@ "in": "query", "required": true, "schema": { - "type": "string" + "type": "string", + "minLength": 1, + "maxLength": 63, + "pattern": "^[a-zA-Z0-9._-]+$" } } ], @@ -2922,7 +2962,9 @@ }, "appName": { "type": "string", - "minLength": 1 + "minLength": 1, + "maxLength": 63, + "pattern": "^[a-zA-Z0-9._-]+$" }, "dockerImage": { "type": "string", @@ -2958,12 +3000,10 @@ }, "required": [ "name", - "appName", "environmentId", "databaseName", "databaseUser", - "databasePassword", - "databaseRootPassword" + "databasePassword" ], "additionalProperties": false } @@ -3276,7 +3316,9 @@ }, "appName": { "type": "string", - "minLength": 1 + "minLength": 1, + "maxLength": 63, + "pattern": "^[a-zA-Z0-9._-]+$" } }, "required": [ @@ -3422,7 +3464,9 @@ }, "appName": { "type": "string", - "minLength": 1 + "minLength": 1, + "maxLength": 63, + "pattern": "^[a-zA-Z0-9._-]+$" }, "description": { "type": "string", @@ -3714,8 +3758,9 @@ }, "DriverOpts": { "type": "object", - "properties": {}, - "additionalProperties": false + "additionalProperties": { + "type": "string" + } } }, "additionalProperties": false @@ -3757,6 +3802,33 @@ "additionalProperties": false, "nullable": true }, + "ulimitsSwarm": { + "type": "array", + "items": { + "type": "object", + "properties": { + "Name": { + "type": "string", + "minLength": 1 + }, + "Soft": { + "type": "integer", + "minimum": -1 + }, + "Hard": { + "type": "integer", + "minimum": -1 + } + }, + "required": [ + "Name", + "Soft", + "Hard" + ], + "additionalProperties": false + }, + "nullable": true + }, "replicas": { "type": "number" }, @@ -3904,7 +3976,10 @@ "minLength": 1 }, "appName": { - "type": "string" + "type": "string", + "minLength": 1, + "maxLength": 63, + "pattern": "^[a-zA-Z0-9._-]+$" }, "databaseName": { "type": "string", @@ -3936,7 +4011,6 @@ }, "required": [ "name", - "appName", "databaseName", "databaseUser", "databasePassword", @@ -4344,7 +4418,10 @@ "type": "string" }, "appName": { - "type": "string" + "type": "string", + "minLength": 1, + "maxLength": 63, + "pattern": "^[a-zA-Z0-9._-]+$" } }, "required": [ @@ -4397,7 +4474,10 @@ "minLength": 1 }, "appName": { - "type": "string" + "type": "string", + "minLength": 1, + "maxLength": 63, + "pattern": "^[a-zA-Z0-9._-]+$" }, "databaseName": { "type": "string", @@ -4685,8 +4765,9 @@ }, "DriverOpts": { "type": "object", - "properties": {}, - "additionalProperties": false + "additionalProperties": { + "type": "string" + } } }, "additionalProperties": false @@ -4728,6 +4809,33 @@ "additionalProperties": false, "nullable": true }, + "ulimitsSwarm": { + "type": "array", + "items": { + "type": "object", + "properties": { + "Name": { + "type": "string", + "minLength": 1 + }, + "Soft": { + "type": "integer", + "minimum": -1 + }, + "Hard": { + "type": "integer", + "minimum": -1 + } + }, + "required": [ + "Name", + "Soft", + "Hard" + ], + "additionalProperties": false + }, + "nullable": true + }, "replicas": { "type": "number" }, @@ -4876,7 +4984,9 @@ }, "appName": { "type": "string", - "minLength": 1 + "minLength": 1, + "maxLength": 63, + "pattern": "^[a-zA-Z0-9._-]+$" }, "databasePassword": { "type": "string" @@ -4899,7 +5009,6 @@ }, "required": [ "name", - "appName", "databasePassword", "environmentId" ], @@ -5023,7 +5132,9 @@ }, "appName": { "type": "string", - "minLength": 1 + "minLength": 1, + "maxLength": 63, + "pattern": "^[a-zA-Z0-9._-]+$" } }, "required": [ @@ -5360,7 +5471,9 @@ }, "appName": { "type": "string", - "minLength": 1 + "minLength": 1, + "maxLength": 63, + "pattern": "^[a-zA-Z0-9._-]+$" }, "description": { "type": "string", @@ -5642,8 +5755,9 @@ }, "DriverOpts": { "type": "object", - "properties": {}, - "additionalProperties": false + "additionalProperties": { + "type": "string" + } } }, "additionalProperties": false @@ -5685,6 +5799,33 @@ "additionalProperties": false, "nullable": true }, + "ulimitsSwarm": { + "type": "array", + "items": { + "type": "object", + "properties": { + "Name": { + "type": "string", + "minLength": 1 + }, + "Soft": { + "type": "integer", + "minimum": -1 + }, + "Hard": { + "type": "integer", + "minimum": -1 + } + }, + "required": [ + "Name", + "Soft", + "Hard" + ], + "additionalProperties": false + }, + "nullable": true + }, "replicas": { "type": "number" }, @@ -5830,7 +5971,9 @@ }, "appName": { "type": "string", - "minLength": 1 + "minLength": 1, + "maxLength": 63, + "pattern": "^[a-zA-Z0-9._-]+$" }, "dockerImage": { "type": "string", @@ -5863,7 +6006,6 @@ }, "required": [ "name", - "appName", "environmentId", "databaseUser", "databasePassword" @@ -6179,7 +6321,9 @@ }, "appName": { "type": "string", - "minLength": 1 + "minLength": 1, + "maxLength": 63, + "pattern": "^[a-zA-Z0-9._-]+$" } }, "required": [ @@ -6325,7 +6469,9 @@ }, "appName": { "type": "string", - "minLength": 1 + "minLength": 1, + "maxLength": 63, + "pattern": "^[a-zA-Z0-9._-]+$" }, "description": { "type": "string", @@ -6609,8 +6755,9 @@ }, "DriverOpts": { "type": "object", - "properties": {}, - "additionalProperties": false + "additionalProperties": { + "type": "string" + } } }, "additionalProperties": false @@ -6652,6 +6799,33 @@ "additionalProperties": false, "nullable": true }, + "ulimitsSwarm": { + "type": "array", + "items": { + "type": "object", + "properties": { + "Name": { + "type": "string", + "minLength": 1 + }, + "Soft": { + "type": "integer", + "minimum": -1 + }, + "Hard": { + "type": "integer", + "minimum": -1 + } + }, + "required": [ + "Name", + "Soft", + "Hard" + ], + "additionalProperties": false + }, + "nullable": true + }, "replicas": { "type": "number" }, @@ -6805,7 +6979,9 @@ }, "appName": { "type": "string", - "minLength": 1 + "minLength": 1, + "maxLength": 63, + "pattern": "^[a-zA-Z0-9._-]+$" }, "dockerImage": { "type": "string", @@ -6841,8 +7017,6 @@ }, "required": [ "name", - "appName", - "databaseRootPassword", "environmentId", "databaseName", "databaseUser", @@ -7251,7 +7425,9 @@ }, "appName": { "type": "string", - "minLength": 1 + "minLength": 1, + "maxLength": 63, + "pattern": "^[a-zA-Z0-9._-]+$" } }, "required": [ @@ -7305,7 +7481,9 @@ }, "appName": { "type": "string", - "minLength": 1 + "minLength": 1, + "maxLength": 63, + "pattern": "^[a-zA-Z0-9._-]+$" }, "description": { "type": "string", @@ -7597,8 +7775,9 @@ }, "DriverOpts": { "type": "object", - "properties": {}, - "additionalProperties": false + "additionalProperties": { + "type": "string" + } } }, "additionalProperties": false @@ -7640,6 +7819,33 @@ "additionalProperties": false, "nullable": true }, + "ulimitsSwarm": { + "type": "array", + "items": { + "type": "object", + "properties": { + "Name": { + "type": "string", + "minLength": 1 + }, + "Soft": { + "type": "integer", + "minimum": -1 + }, + "Hard": { + "type": "integer", + "minimum": -1 + } + }, + "required": [ + "Name", + "Soft", + "Hard" + ], + "additionalProperties": false + }, + "nullable": true + }, "replicas": { "type": "number" }, @@ -7801,7 +8007,10 @@ ] }, "appName": { - "type": "string" + "type": "string", + "minLength": 1, + "maxLength": 63, + "pattern": "^[a-zA-Z0-9._-]+$" }, "serverId": { "type": "string", @@ -7895,7 +8104,10 @@ "minLength": 1 }, "appName": { - "type": "string" + "type": "string", + "minLength": 1, + "maxLength": 63, + "pattern": "^[a-zA-Z0-9._-]+$" }, "description": { "type": "string", @@ -9381,6 +9593,13 @@ "allowImpersonation": { "type": "boolean" }, + "enableEnterpriseFeatures": { + "type": "boolean" + }, + "licenseKey": { + "type": "string", + "nullable": true + }, "stripeCustomerId": { "type": "string", "nullable": true @@ -12303,6 +12522,31 @@ } } }, + "/settings.cleanAllDeploymentQueue": { + "post": { + "operationId": "settings-cleanAllDeploymentQueue", + "tags": [ + "settings" + ], + "security": [ + { + "Authorization": [] + } + ], + "parameters": [], + "responses": { + "200": { + "description": "Successful response", + "content": { + "application/json": {} + } + }, + "default": { + "$ref": "#/components/responses/error" + } + } + } + }, "/settings.reloadTraefik": { "post": { "operationId": "settings-reloadTraefik", @@ -15979,6 +16223,246 @@ } } }, + "/notification.createResend": { + "post": { + "operationId": "notification-createResend", + "tags": [ + "notification" + ], + "security": [ + { + "Authorization": [] + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "appBuildError": { + "type": "boolean" + }, + "databaseBackup": { + "type": "boolean" + }, + "volumeBackup": { + "type": "boolean" + }, + "dokployRestart": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "appDeploy": { + "type": "boolean" + }, + "dockerCleanup": { + "type": "boolean" + }, + "serverThreshold": { + "type": "boolean" + }, + "apiKey": { + "type": "string", + "minLength": 1 + }, + "fromAddress": { + "type": "string", + "minLength": 1 + }, + "toAddresses": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1 + } + }, + "required": [ + "appBuildError", + "databaseBackup", + "volumeBackup", + "dokployRestart", + "name", + "appDeploy", + "dockerCleanup", + "serverThreshold", + "apiKey", + "fromAddress", + "toAddresses" + ], + "additionalProperties": false + } + } + } + }, + "parameters": [], + "responses": { + "200": { + "description": "Successful response", + "content": { + "application/json": {} + } + }, + "default": { + "$ref": "#/components/responses/error" + } + } + } + }, + "/notification.updateResend": { + "post": { + "operationId": "notification-updateResend", + "tags": [ + "notification" + ], + "security": [ + { + "Authorization": [] + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "appBuildError": { + "type": "boolean" + }, + "databaseBackup": { + "type": "boolean" + }, + "volumeBackup": { + "type": "boolean" + }, + "dokployRestart": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "appDeploy": { + "type": "boolean" + }, + "dockerCleanup": { + "type": "boolean" + }, + "serverThreshold": { + "type": "boolean" + }, + "apiKey": { + "type": "string", + "minLength": 1 + }, + "fromAddress": { + "type": "string", + "minLength": 1 + }, + "toAddresses": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1 + }, + "notificationId": { + "type": "string", + "minLength": 1 + }, + "resendId": { + "type": "string", + "minLength": 1 + }, + "organizationId": { + "type": "string" + } + }, + "required": [ + "notificationId", + "resendId" + ], + "additionalProperties": false + } + } + } + }, + "parameters": [], + "responses": { + "200": { + "description": "Successful response", + "content": { + "application/json": {} + } + }, + "default": { + "$ref": "#/components/responses/error" + } + } + } + }, + "/notification.testResendConnection": { + "post": { + "operationId": "notification-testResendConnection", + "tags": [ + "notification" + ], + "security": [ + { + "Authorization": [] + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "apiKey": { + "type": "string", + "minLength": 1 + }, + "fromAddress": { + "type": "string", + "minLength": 1 + }, + "toAddresses": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1 + } + }, + "required": [ + "apiKey", + "fromAddress", + "toAddresses" + ], + "additionalProperties": false + } + } + } + }, + "parameters": [], + "responses": { + "200": { + "description": "Successful response", + "content": { + "application/json": {} + } + }, + "default": { + "$ref": "#/components/responses/error" + } + } + } + }, "/notification.remove": { "post": { "operationId": "notification-remove", @@ -17689,6 +18173,10 @@ "type": "string", "minLength": 1 }, + "giteaInternalUrl": { + "type": "string", + "nullable": true + }, "redirectUri": { "type": "string" }, @@ -17967,6 +18455,10 @@ "type": "string", "minLength": 1 }, + "giteaInternalUrl": { + "type": "string", + "nullable": true + }, "redirectUri": { "type": "string" }, @@ -18441,6 +18933,10 @@ "type": "string", "minLength": 1 }, + "gitlabInternalUrl": { + "type": "string", + "nullable": true + }, "applicationId": { "type": "string" }, @@ -18724,6 +19220,10 @@ "type": "string", "minLength": 1 }, + "gitlabInternalUrl": { + "type": "string", + "nullable": true + }, "applicationId": { "type": "string" }, @@ -20895,6 +21395,1070 @@ } } }, + "/licenseKey.activate": { + "post": { + "operationId": "licenseKey-activate", + "tags": [ + "licenseKey" + ], + "security": [ + { + "Authorization": [] + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "licenseKey": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "licenseKey" + ], + "additionalProperties": false + } + } + } + }, + "parameters": [], + "responses": { + "200": { + "description": "Successful response", + "content": { + "application/json": {} + } + }, + "default": { + "$ref": "#/components/responses/error" + } + } + } + }, + "/licenseKey.validate": { + "post": { + "operationId": "licenseKey-validate", + "tags": [ + "licenseKey" + ], + "security": [ + { + "Authorization": [] + } + ], + "parameters": [], + "responses": { + "200": { + "description": "Successful response", + "content": { + "application/json": {} + } + }, + "default": { + "$ref": "#/components/responses/error" + } + } + } + }, + "/licenseKey.deactivate": { + "post": { + "operationId": "licenseKey-deactivate", + "tags": [ + "licenseKey" + ], + "security": [ + { + "Authorization": [] + } + ], + "parameters": [], + "responses": { + "200": { + "description": "Successful response", + "content": { + "application/json": {} + } + }, + "default": { + "$ref": "#/components/responses/error" + } + } + } + }, + "/licenseKey.getEnterpriseSettings": { + "get": { + "operationId": "licenseKey-getEnterpriseSettings", + "tags": [ + "licenseKey" + ], + "security": [ + { + "Authorization": [] + } + ], + "parameters": [], + "responses": { + "200": { + "description": "Successful response", + "content": { + "application/json": {} + } + }, + "default": { + "$ref": "#/components/responses/error" + } + } + } + }, + "/licenseKey.haveValidLicenseKey": { + "get": { + "operationId": "licenseKey-haveValidLicenseKey", + "tags": [ + "licenseKey" + ], + "security": [ + { + "Authorization": [] + } + ], + "parameters": [], + "responses": { + "200": { + "description": "Successful response", + "content": { + "application/json": {} + } + }, + "default": { + "$ref": "#/components/responses/error" + } + } + } + }, + "/licenseKey.updateEnterpriseSettings": { + "post": { + "operationId": "licenseKey-updateEnterpriseSettings", + "tags": [ + "licenseKey" + ], + "security": [ + { + "Authorization": [] + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "enableEnterpriseFeatures": { + "type": "boolean" + } + }, + "additionalProperties": false + } + } + } + }, + "parameters": [], + "responses": { + "200": { + "description": "Successful response", + "content": { + "application/json": {} + } + }, + "default": { + "$ref": "#/components/responses/error" + } + } + } + }, + "/sso.showSignInWithSSO": { + "get": { + "operationId": "sso-showSignInWithSSO", + "tags": [ + "sso" + ], + "security": [ + { + "Authorization": [] + } + ], + "parameters": [], + "responses": { + "200": { + "description": "Successful response", + "content": { + "application/json": {} + } + }, + "default": { + "$ref": "#/components/responses/error" + } + } + } + }, + "/sso.listProviders": { + "get": { + "operationId": "sso-listProviders", + "tags": [ + "sso" + ], + "security": [ + { + "Authorization": [] + } + ], + "parameters": [], + "responses": { + "200": { + "description": "Successful response", + "content": { + "application/json": {} + } + }, + "default": { + "$ref": "#/components/responses/error" + } + } + } + }, + "/sso.one": { + "get": { + "operationId": "sso-one", + "tags": [ + "sso" + ], + "security": [ + { + "Authorization": [] + } + ], + "parameters": [ + { + "name": "providerId", + "in": "query", + "required": true, + "schema": { + "type": "string", + "minLength": 1 + } + } + ], + "responses": { + "200": { + "description": "Successful response", + "content": { + "application/json": {} + } + }, + "default": { + "$ref": "#/components/responses/error" + } + } + } + }, + "/sso.update": { + "post": { + "operationId": "sso-update", + "tags": [ + "sso" + ], + "security": [ + { + "Authorization": [] + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "providerId": { + "type": "string" + }, + "issuer": { + "type": "string" + }, + "domains": { + "type": "array", + "items": { + "type": "string" + } + }, + "oidcConfig": { + "type": "object", + "properties": { + "clientId": { + "type": "string" + }, + "clientSecret": { + "type": "string" + }, + "authorizationEndpoint": { + "type": "string" + }, + "tokenEndpoint": { + "type": "string" + }, + "userInfoEndpoint": { + "type": "string" + }, + "tokenEndpointAuthentication": { + "type": "string", + "enum": [ + "client_secret_post", + "client_secret_basic" + ] + }, + "jwksEndpoint": { + "type": "string" + }, + "discoveryEndpoint": { + "type": "string" + }, + "skipDiscovery": { + "type": "boolean" + }, + "scopes": { + "type": "array", + "items": { + "type": "string" + } + }, + "pkce": { + "type": "boolean", + "default": true + }, + "mapping": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "email": { + "type": "string" + }, + "emailVerified": { + "type": "string" + }, + "name": { + "type": "string" + }, + "image": { + "type": "string" + }, + "extraFields": { + "type": "object", + "additionalProperties": {} + } + }, + "required": [ + "id", + "email", + "name" + ], + "additionalProperties": false + } + }, + "required": [ + "clientId", + "clientSecret" + ], + "additionalProperties": false + }, + "samlConfig": { + "type": "object", + "properties": { + "entryPoint": { + "type": "string" + }, + "cert": { + "type": "string" + }, + "callbackUrl": { + "type": "string" + }, + "audience": { + "type": "string" + }, + "idpMetadata": { + "type": "object", + "properties": { + "metadata": { + "type": "string" + }, + "entityID": { + "type": "string" + }, + "cert": { + "type": "string" + }, + "privateKey": { + "type": "string" + }, + "privateKeyPass": { + "type": "string" + }, + "isAssertionEncrypted": { + "type": "boolean" + }, + "encPrivateKey": { + "type": "string" + }, + "encPrivateKeyPass": { + "type": "string" + }, + "singleSignOnService": { + "type": "array", + "items": { + "type": "object", + "properties": { + "Binding": { + "type": "string" + }, + "Location": { + "type": "string" + } + }, + "required": [ + "Binding", + "Location" + ], + "additionalProperties": false + } + } + }, + "additionalProperties": false + }, + "spMetadata": { + "type": "object", + "properties": { + "metadata": { + "type": "string" + }, + "entityID": { + "type": "string" + }, + "binding": { + "type": "string" + }, + "privateKey": { + "type": "string" + }, + "privateKeyPass": { + "type": "string" + }, + "isAssertionEncrypted": { + "type": "boolean" + }, + "encPrivateKey": { + "type": "string" + }, + "encPrivateKeyPass": { + "type": "string" + } + }, + "additionalProperties": false + }, + "wantAssertionsSigned": { + "type": "boolean" + }, + "authnRequestsSigned": { + "type": "boolean" + }, + "signatureAlgorithm": { + "type": "string" + }, + "digestAlgorithm": { + "type": "string" + }, + "identifierFormat": { + "type": "string" + }, + "privateKey": { + "type": "string" + }, + "decryptionPvk": { + "type": "string" + }, + "additionalParams": { + "type": "object", + "additionalProperties": {} + }, + "mapping": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "email": { + "type": "string" + }, + "emailVerified": { + "type": "string" + }, + "name": { + "type": "string" + }, + "firstName": { + "type": "string" + }, + "lastName": { + "type": "string" + }, + "extraFields": { + "type": "object", + "additionalProperties": {} + } + }, + "required": [ + "id", + "email", + "name" + ], + "additionalProperties": false + } + }, + "required": [ + "entryPoint", + "cert", + "callbackUrl", + "spMetadata" + ], + "additionalProperties": false + }, + "organizationId": { + "type": "string" + }, + "overrideUserInfo": { + "type": "boolean", + "default": false + } + }, + "required": [ + "providerId", + "issuer", + "domains" + ], + "additionalProperties": false + } + } + } + }, + "parameters": [], + "responses": { + "200": { + "description": "Successful response", + "content": { + "application/json": {} + } + }, + "default": { + "$ref": "#/components/responses/error" + } + } + } + }, + "/sso.deleteProvider": { + "post": { + "operationId": "sso-deleteProvider", + "tags": [ + "sso" + ], + "security": [ + { + "Authorization": [] + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "providerId": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "providerId" + ], + "additionalProperties": false + } + } + } + }, + "parameters": [], + "responses": { + "200": { + "description": "Successful response", + "content": { + "application/json": {} + } + }, + "default": { + "$ref": "#/components/responses/error" + } + } + } + }, + "/sso.register": { + "post": { + "operationId": "sso-register", + "tags": [ + "sso" + ], + "security": [ + { + "Authorization": [] + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "providerId": { + "type": "string" + }, + "issuer": { + "type": "string" + }, + "domains": { + "type": "array", + "items": { + "type": "string" + } + }, + "oidcConfig": { + "type": "object", + "properties": { + "clientId": { + "type": "string" + }, + "clientSecret": { + "type": "string" + }, + "authorizationEndpoint": { + "type": "string" + }, + "tokenEndpoint": { + "type": "string" + }, + "userInfoEndpoint": { + "type": "string" + }, + "tokenEndpointAuthentication": { + "type": "string", + "enum": [ + "client_secret_post", + "client_secret_basic" + ] + }, + "jwksEndpoint": { + "type": "string" + }, + "discoveryEndpoint": { + "type": "string" + }, + "skipDiscovery": { + "type": "boolean" + }, + "scopes": { + "type": "array", + "items": { + "type": "string" + } + }, + "pkce": { + "type": "boolean", + "default": true + }, + "mapping": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "email": { + "type": "string" + }, + "emailVerified": { + "type": "string" + }, + "name": { + "type": "string" + }, + "image": { + "type": "string" + }, + "extraFields": { + "type": "object", + "additionalProperties": {} + } + }, + "required": [ + "id", + "email", + "name" + ], + "additionalProperties": false + } + }, + "required": [ + "clientId", + "clientSecret" + ], + "additionalProperties": false + }, + "samlConfig": { + "type": "object", + "properties": { + "entryPoint": { + "type": "string" + }, + "cert": { + "type": "string" + }, + "callbackUrl": { + "type": "string" + }, + "audience": { + "type": "string" + }, + "idpMetadata": { + "type": "object", + "properties": { + "metadata": { + "type": "string" + }, + "entityID": { + "type": "string" + }, + "cert": { + "type": "string" + }, + "privateKey": { + "type": "string" + }, + "privateKeyPass": { + "type": "string" + }, + "isAssertionEncrypted": { + "type": "boolean" + }, + "encPrivateKey": { + "type": "string" + }, + "encPrivateKeyPass": { + "type": "string" + }, + "singleSignOnService": { + "type": "array", + "items": { + "type": "object", + "properties": { + "Binding": { + "type": "string" + }, + "Location": { + "type": "string" + } + }, + "required": [ + "Binding", + "Location" + ], + "additionalProperties": false + } + } + }, + "additionalProperties": false + }, + "spMetadata": { + "type": "object", + "properties": { + "metadata": { + "type": "string" + }, + "entityID": { + "type": "string" + }, + "binding": { + "type": "string" + }, + "privateKey": { + "type": "string" + }, + "privateKeyPass": { + "type": "string" + }, + "isAssertionEncrypted": { + "type": "boolean" + }, + "encPrivateKey": { + "type": "string" + }, + "encPrivateKeyPass": { + "type": "string" + } + }, + "additionalProperties": false + }, + "wantAssertionsSigned": { + "type": "boolean" + }, + "authnRequestsSigned": { + "type": "boolean" + }, + "signatureAlgorithm": { + "type": "string" + }, + "digestAlgorithm": { + "type": "string" + }, + "identifierFormat": { + "type": "string" + }, + "privateKey": { + "type": "string" + }, + "decryptionPvk": { + "type": "string" + }, + "additionalParams": { + "type": "object", + "additionalProperties": {} + }, + "mapping": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "email": { + "type": "string" + }, + "emailVerified": { + "type": "string" + }, + "name": { + "type": "string" + }, + "firstName": { + "type": "string" + }, + "lastName": { + "type": "string" + }, + "extraFields": { + "type": "object", + "additionalProperties": {} + } + }, + "required": [ + "id", + "email", + "name" + ], + "additionalProperties": false + } + }, + "required": [ + "entryPoint", + "cert", + "callbackUrl", + "spMetadata" + ], + "additionalProperties": false + }, + "organizationId": { + "type": "string" + }, + "overrideUserInfo": { + "type": "boolean", + "default": false + } + }, + "required": [ + "providerId", + "issuer", + "domains" + ], + "additionalProperties": false + } + } + } + }, + "parameters": [], + "responses": { + "200": { + "description": "Successful response", + "content": { + "application/json": {} + } + }, + "default": { + "$ref": "#/components/responses/error" + } + } + } + }, + "/sso.addTrustedOrigin": { + "post": { + "operationId": "sso-addTrustedOrigin", + "tags": [ + "sso" + ], + "security": [ + { + "Authorization": [] + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "origin": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "origin" + ], + "additionalProperties": false + } + } + } + }, + "parameters": [], + "responses": { + "200": { + "description": "Successful response", + "content": { + "application/json": {} + } + }, + "default": { + "$ref": "#/components/responses/error" + } + } + } + }, + "/sso.removeTrustedOrigin": { + "post": { + "operationId": "sso-removeTrustedOrigin", + "tags": [ + "sso" + ], + "security": [ + { + "Authorization": [] + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "origin": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "origin" + ], + "additionalProperties": false + } + } + } + }, + "parameters": [], + "responses": { + "200": { + "description": "Successful response", + "content": { + "application/json": {} + } + }, + "default": { + "$ref": "#/components/responses/error" + } + } + } + }, + "/sso.updateTrustedOrigin": { + "post": { + "operationId": "sso-updateTrustedOrigin", + "tags": [ + "sso" + ], + "security": [ + { + "Authorization": [] + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "oldOrigin": { + "type": "string", + "minLength": 1 + }, + "newOrigin": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "oldOrigin", + "newOrigin" + ], + "additionalProperties": false + } + } + } + }, + "parameters": [], + "responses": { + "200": { + "description": "Successful response", + "content": { + "application/json": {} + } + }, + "default": { + "$ref": "#/components/responses/error" + } + } + } + }, "/schedule.create": { "post": { "operationId": "schedule-create", diff --git a/apps/docs/scripts/generate-templates.mjs b/apps/docs/scripts/generate-templates.mjs new file mode 100644 index 0000000..754eeb8 --- /dev/null +++ b/apps/docs/scripts/generate-templates.mjs @@ -0,0 +1,193 @@ +import fs from 'node:fs'; +import path from 'node:path'; + +const TEMPLATES_URL = 'https://templates.dokploy.com/meta.json'; +const BASE_BLUEPRINT_URL = 'https://templates.dokploy.com/blueprints'; +const OUTPUT_DIR = './content/docs/templates'; + +async function fetchWithTimeout(url, options = {}, timeout = 10000) { + const controller = new AbortController(); + const id = setTimeout(() => controller.abort(), timeout); + try { + const response = await fetch(url, { + ...options, + signal: controller.signal + }); + clearTimeout(id); + return response; + } catch (e) { + clearTimeout(id); + throw e; + } +} + +async function getTemplateFile(id, fileName) { + try { + const response = await fetchWithTimeout(`${BASE_BLUEPRINT_URL}/${id}/${fileName}`); + if (!response.ok) return null; + return await response.text(); + } catch (error) { + console.error(`Error fetching ${fileName} for ${id}:`, error.message); + return null; + } +} + +/** Normalize and indent code so it renders correctly inside MDX code blocks (preserves YAML/TOML formatting). */ +function formatCodeForMdx(code) { + if (!code || !code.trim()) return '# Not available'; + return code + .replace(/\r\n/g, '\n') + .trim() + .split('\n') + .map((line) => line.trimEnd()) + .join('\n') + .split('\n') + .map(line => ` ${line}`) + .join('\n'); +} + +/** Build Base64 payload for Dokploy import (same format as UI: compose + config as JSON, then base64). */ +function templateToBase64(dockerCompose, config) { + const configObj = { + compose: dockerCompose || '', + config: config || '', + }; + const jsonString = JSON.stringify(configObj, null, 2); + return Buffer.from(jsonString, 'utf-8').toString('base64'); +} + +async function generateTemplates() { + try { + console.log('Fetching templates metadata...'); + const response = await fetch(TEMPLATES_URL); + const templates = await response.json(); + + console.log(`Found ${templates.length} templates. Starting data collection...`); + + if (!fs.existsSync(OUTPUT_DIR)) { + fs.mkdirSync(OUTPUT_DIR, { recursive: true }); + } + + const batchSize = 10; + for (let i = 0; i < templates.length; i += batchSize) { + const batch = templates.slice(i, i + batchSize); + console.log(`Processing batch ${i / batchSize + 1}/${Math.ceil(templates.length / batchSize)}...`); + + await Promise.all(batch.map(async (template) => { + const composeYaml = await getTemplateFile(template.id, 'docker-compose.yml'); + const templateToml = await getTemplateFile(template.id, 'template.toml'); + const instructionsRaw = await getTemplateFile(template.id, 'instructions.md'); + const hasRealInstructions = + instructionsRaw && + instructionsRaw.trim().length > 0 && + !/^\s* + +## Configuration + + + + \`\`\`yaml +${formatCodeForMdx(composeYaml)} + \`\`\` + + + \`\`\`toml +${formatCodeForMdx(templateToml)} + \`\`\` + + + +## Base64 + +To import this template in Dokploy: create a **Compose** service → **Advanced** → **Base64 import** and paste the content below: + +\`\`\`text +${templateToBase64(composeYaml, templateToml)} +\`\`\` +${instructionsSafe ? ` + +## Instructions + +${instructionsSafe} +` : ''} + +## Links +${template.links.website ? `- [Website](${template.links.website})` : ''} +${template.links.github ? `- [Github](${template.links.github})` : ''} +${template.links.docs ? `- [Documentation](${template.links.docs})` : ''} + +## Tags +${template.tags.map(tag => `\`${tag}\``).join(', ')} + +--- + +Version: \`${template.version}\` +`; + fs.writeFileSync(path.join(OUTPUT_DIR, `${template.id}.mdx`), mdxContent); + })); + } + + // Generate index.mdx + const indexContent = `--- +title: Introduction +description: Browse our collection of ${templates.length}+ self-hosted open source templates +--- + +# Templates + +Welcome to the Dokploy Templates collection. We currently have **${templates.length}+** pre-configured templates that you can deploy with a single click. + +Our templates cover a wide range of categories, including: +- **Databases**: PostgreSQL, MySQL, MongoDB, Redis, and more. +- **CMS**: WordPress, Ghost, Straple, Directus. +- **Analytics**: Umami, Plausible, Ackee. +- **Development Tools**: Gitea, Jenkins, Woodpecker CI. +- **And much more!** + +Explore the sidebar to find the template you need. + +`; + fs.writeFileSync(path.join(OUTPUT_DIR, 'index.mdx'), indexContent); + + // Update meta.json with all template IDs + const metaContent = { + title: "Templates", + description: `Browse our collection of ${templates.length}+ self-hosted open source templates`, + icon: "LayoutGrid", + root: true, + pages: [ + "index", + "---Templates---", + ...templates.map(t => t.id) + ] + }; + fs.writeFileSync(path.join(OUTPUT_DIR, 'meta.json'), JSON.stringify(metaContent, null, 2)); + + console.log('✓ Successfully generated template documentation'); + } catch (error) { + console.error('Error generating templates:', error); + process.exit(1); + } +} + +generateTemplates(); diff --git a/apps/website/app/page.tsx b/apps/website/app/page.tsx index f87dce4..bf7c2d7 100644 --- a/apps/website/app/page.tsx +++ b/apps/website/app/page.tsx @@ -30,7 +30,7 @@ export default function Home() { - + {/* */} diff --git a/apps/website/app/sitemap.ts b/apps/website/app/sitemap.ts index 503b524..7d4b9e8 100644 --- a/apps/website/app/sitemap.ts +++ b/apps/website/app/sitemap.ts @@ -16,6 +16,18 @@ export default async function sitemap(): Promise { changeFrequency: "monthly", priority: 0.8, }, + { + url: "https://dokploy.com/terms-of-service", + lastModified: new Date(), + changeFrequency: "yearly", + priority: 0.5, + }, + { + url: "https://dokploy.com/privacy", + lastModified: new Date(), + changeFrequency: "yearly", + priority: 0.5, + }, ...posts.map((post) => ({ url: `https://dokploy.com/blog/${post.slug}`, lastModified: new Date(post.published_at), diff --git a/apps/website/app/terms-of-service/page.tsx b/apps/website/app/terms-of-service/page.tsx new file mode 100644 index 0000000..dcb4e0a --- /dev/null +++ b/apps/website/app/terms-of-service/page.tsx @@ -0,0 +1,957 @@ +import type { Metadata } from "next"; + +export const metadata: Metadata = { + title: "Terms of Service", + description: + "Terms of Service for Dokploy's cloud and on-premise deployment platform.", +}; + +export default function TermsOfServicePage() { + return ( +
+

+ Terms of Service +

+

+ Dokploy.com · Last Updated: January 2026 +

+ +
+

Overview

+

+ This website and platform are operated by Dokploy Technologies, Inc. + ("Dokploy", "we", "us", or + "our"). Dokploy provides a deployment and hosting platform + available as both a cloud-hosted service ("Cloud Services") + and self-hosted software ("On-Premise Software"), + collectively referred to as the "Services." +

+

+ By accessing or using our Services, you ("Customer", + "you", or "your") agree to be bound by these Terms + of Service ("Terms"), including our Privacy Policy and + Acceptable Use Policy incorporated herein by reference. If you are + entering into these Terms on behalf of an organization, you represent + that you have authority to bind that organization. +

+

+ If you do not agree to these Terms, you may not access or use the + Services. +

+
+ +
+

+ Section 1 – Definitions +

+
    +
  • + "Authorized Users" means individuals + authorized by Customer to access and use the Services under + Customer's account. +
  • +
  • + "Cloud Services" means the hosted version + of the Dokploy platform provided and maintained by us, accessible + via the internet. +
  • +
  • + "Customer Data" means all data, content, + code, applications, and materials uploaded, stored, or processed by + Customer or its Authorized Users, or on behalf of Customer or its + Authorized users, through the Services. +
  • +
  • + "Documentation" means the user guides, + technical documentation, and other materials we provide describing + the functionality and use of the Services. +
  • +
  • + "Downtime" means periods when the Cloud + Services are unavailable, excluding Scheduled Maintenance and + exclusions defined in the SLA. +
  • +
  • + "On-Premise Software" means the + self-hosted version of the Dokploy platform that Customer installs + and operates on its own infrastructure. +
  • +
  • + "Scheduled Maintenance" means planned + maintenance windows communicated at least [48/72] hours in advance. +
  • +
  • + "Services" means the Cloud Services + and/or On-Premise Software, as applicable to Customer's + subscription. +
  • +
  • + "Subscription Term" means the period + during which Customer has paid for and is entitled to use the + Services. +
  • +
+
+ +
+

+ Section 2 – Services Description +

+

2.1 Cloud Services

+

+ The Cloud Services provide a managed deployment and hosting platform + accessible via the internet. We are responsible for infrastructure + maintenance, security updates, and platform availability in accordance + with our Service Level Agreement (Section 7). The services provided + are permitted to be used by businesses and individuals over the age + of 18 years. +

+

2.2 On-Premise Software

+

+ The On-Premise Software is licensed for installation on + Customer's own infrastructure. Customer is solely responsible for + the installation, configuration, maintenance, security, backups, and + availability of the On-Premise Software and the infrastructure on + which it operates. The Service Level Agreement (Section 7) does not + apply to On-Premise Software. The services provided are permitted to + be used by businesses and individuals over the age of 18 years. +

+

2.3 Modifications to Services

+

+ We reserve the right to modify, update, or discontinue features of the + Services at any time. For material changes that negatively affect + functionality, we will provide thirty [30] days' notice in + writing prior to the implementation of the change. Such modifications + shall not materially reduce the core functionality of the Services + during an active Subscription Term. +

+
+ +
+

+ Section 3 – Account Registration and Responsibilities +

+

3.1 Eligibility

+

+ You must be at least 18 years of age and capable of forming a binding + contract to use the Services. By using the Services, you represent + that you meet these requirements. +

+

3.2 Account Security

+

+ You are responsible for maintaining the confidentiality of your + account credentials and for all activities that occur under your + account. You must immediately notify us of any unauthorized use of your + account or any other breach of security. We are not liable for any + loss arising from unauthorized use of your account. +

+

3.3 Account Information

+

+ You agree to provide accurate, current, and complete information + during registration and to update such information to keep it + accurate, current, and complete. We reserve the right to suspend or + terminate accounts with inaccurate or incomplete information. +

+
+ +
+

Section 4 – License Grant

+

4.1 Cloud Services License

+

+ Subject to these Terms and payment of applicable fees, we grant you a + limited, non-exclusive, non-transferable, non-sublicensable right to + access and use the Cloud Services during the Subscription Term for + your internal business purposes. +

+

4.2 On-Premise Software License

+

+ Subject to these Terms and payment of applicable fees, we grant you a + limited, non-exclusive, non-transferable, non-sublicensable license to + install and use the On-Premise Software on your own infrastructure + during the Subscription Term. This license is limited to the number + of instances, nodes, or users specified in your subscription plan. + The On-Premise Software may be used solely for Customer's internal + business purposes and may not be used to provide services to third + parties, operate as a managed service, or otherwise make the + On-Premise Software available to any third party without our prior + written consent. +

+

4.3 Documentation License

+

+ We grant you a limited, non-exclusive license to use the + Documentation solely in connection with your authorized use of the + Services. +

+

4.4 Restrictions

+

+ You shall not: (a) sublicense, sell, resell, transfer, assign, or + distribute the Services; (b) modify or make derivative works based + upon the Services; (c) reverse engineer, disassemble, or decompile the + Services or attempt to discover the source code; (d) access the + Services to build a competitive product or service; (e) copy any + features, functions, or graphics of the Services; or (f) use the + Services in violation of applicable laws. +

+

4.5 Usage Verification

+

+ We may, upon reasonable prior notice and not more than once annually, + audit Customer's use of the On-Premise Software solely to verify + compliance with the license scope and usage limits. Any such audit + shall be conducted in a manner that does not unreasonably interfere + with Customer's operations. +

+
+ +
+

+ Section 5 – Acceptable Use Policy +

+

5.1 General Prohibitions

+

+ You agree not to use the Services to: (a) violate any applicable law, + regulation, or third-party rights; (b) upload, transmit, or store any + content that is unlawful, harmful, threatening, abusive, defamatory, + obscene, or otherwise objectionable; (c) infringe any intellectual + property rights; (d) transmit viruses, malware, or other malicious + code; (e) interfere with or disrupt the integrity or performance of + the Services; (f) attempt to gain unauthorized access to the Services + or related systems; (g) harass, abuse, or harm another person or + entity; (h) collect personal information without proper consent; (i) + access any computer systems without authorization or attempt to + penetrate or disable any security system; or (j) issue fraudulent + offers to sell or buy products, services, or investments or otherwise + engage in fraud. +

+

+ If you discover a violation of the AUP, you must report it within 24 + (twenty-four) hours of the discovery to <insert contact email> + with as much information as you have including, but not limited to, + the date and time of the violation and any identifying information + regarding the violator including e-mail or IP address, if available. +

+

5.2 Hosting-Specific Prohibitions

+

The following activities are strictly prohibited on our platform:

+
    +
  • + (a) Cryptocurrency mining or any resource-intensive computational + activities not directly related to your hosted applications; +
  • +
  • + (b) Hosting, distributing, or linking to malware, phishing sites, + botnets, or any malicious software; +
  • +
  • + (c) Hosting content that exploits minors in any way, including + child sexual abuse material (CSAM); +
  • +
  • + (d) Operating open proxies, anonymizers, or services designed to + obscure network traffic origins; +
  • +
  • (e) Launching or facilitating denial-of-service (DoS/DDoS) attacks;
  • +
  • + (f) Sending spam, unsolicited bulk messages, or phishing + communications; +
  • +
  • + (g) Circumventing or attempting to circumvent resource limits, + quotas, or usage restrictions; +
  • +
  • + (h) Hosting content or applications that violate export control + laws or sanctions. +
  • +
+

5.3 Resource Usage

+

+ Your use of computational resources must be consistent with your + subscription plan. We reserve the right to throttle, suspend, or + terminate access if your usage materially exceeds normal patterns or + negatively impacts other customers. +

+

5.4 Enforcement

+

+ Violation of this Acceptable Use policy (hereinafter "AUP") + may lead to suspension or termination of your account and legal + action. We reserve the right to take any other remedial action + including reporting illegal activities to appropriate law enforcement + authorities. You may be required to pay for the costs of + investigation and remedial action related to AUP violations. +

+
+ +
+

+ Section 6 – Fees and Payment +

+

6.1 Subscription Fees

+

+ You agree to pay all fees specified in your subscription plan or Order + Form. Fees are charged in advance on a monthly or annual basis as + stated in the subscription plan or Order Form and are non-refundable + except as expressly provided in these Terms. +

+

6.2 Payment Terms

+

+ Payment is due upon invoice or at the start of each billing period. + You authorize us to charge your designated payment method for all + applicable fees. If payment fails, we may suspend access to the + Services until payment is received. +

+

6.3 Taxes

+

+ All fees are exclusive of taxes. You are responsible for paying all + applicable taxes, except for taxes based on our net income. If we are + required to collect or pay taxes, those taxes will be invoiced to you. +

+

6.4 Price Changes

+

+ We may change our pricing at any time. Price changes will take effect + at the start of your next Subscription Term following thirty [30] + days' notice. Continued use after price changes constitutes + acceptance of the new pricing. +

+

6.5 Refunds

+

+ All fees paid pursuant to these Terms of Service are non-refundable + except as expressly stated in these Terms or required by applicable + law. Service Credits under Section 7.3 of these Terms are + Customer's sole and exclusive remedy for any failure to meet + uptime commitments and are not cash refunds. +

+
+ +
+

+ Section 7 – Service Level Agreement (Cloud Services Only) +

+

+ This Section 7 applies only to Cloud Services. On-Premise Software + customers are solely responsible for availability and performance of + their self-hosted installations. +

+

7.1 Uptime Commitment

+

+ We commit to [99.9%] monthly uptime for the Cloud Services, measured + as: ((Total Minutes in Month - Downtime Minutes) / Total Minutes in + Month) × 100. +

+

7.2 Exclusions

+

+ The following are excluded from Downtime calculations: (a) Scheduled + Maintenance; (b) outages caused by factors outside our reasonable + control, including force majeure events, internet service provider + failures, or third-party service outages; (c) outages resulting from + Customer actions or inactions, including misconfiguration; (d) + outages during beta or preview features. +

+

7.3 Service Credits

+

+ If we fail to meet our uptime commitment, you may request service + credits as follows: +

+
    +
  • 99.0% - 99.9% uptime: [10%] credit of monthly fees
  • +
  • 95.0% - 99.0% uptime: [25%] credit of monthly fees
  • +
  • Below 95.0% uptime: [50%] credit of monthly fees
  • +
+

+ Credits must be requested within 30 (thirty) days of the incident. + Credits are applied to future invoices and do not exceed one + month's fees. Credits are your sole and exclusive remedy for + service level failures. +

+
+ +
+

+ Section 8 – Support and Maintenance +

+

8.1 Cloud Services Support

+

+ We provide technical support for Cloud Services via{" "} + + support@dokploy.com + {" "} + or chat during Monday-Friday, 9am-6pm EST. Response times vary by plan + tier as specified in your subscription agreement. +

+

8.2 On-Premise Software Support

+

+ Support for On-Premise Software is limited to software defects and + installation guidance. We do not provide support for Customer's + infrastructure, third-party integrations, or issues arising from + Customer modifications to the software unless otherwise agreed upon + with Dokploy. +

+

8.3 Updates and Upgrades

+

+ For Cloud Services, we apply updates and patches automatically. For + On-Premise Software, we make updates available for download, and + Customer is responsible for applying them. Major version upgrades may + require additional fees as specified in your subscription. +

+
+ +
+

Section 9 – Customer Data

+

9.1 Ownership

+

+ You retain all rights, title, and interest in and to your Customer + Data. Our use and possession thereof is solely on Customer's + behalf and we claim no ownership over Customer Data. +

+

9.2 License to Customer Data

+

+ You grant us a limited, non-exclusive license to access, use, and + process Customer Data solely as necessary to provide the Services, + comply with the law, and enforce these Terms during the term defined + in the Subscription plan. We may process Customer Data and usage + solely to operate, maintain, support, and improve the Services, + including for internal usage analytics, performance monitoring, and + troubleshooting. Any such processing will be performed in accordance + with the DPA incorporated herein. +

+

9.3 Data Security (Cloud Services)

+

+ We implement industry-standard security measures to protect Customer + Data in our Cloud Services, including encryption in transit and at + rest, access controls, and regular security assessments. Our security + practices are described in our Security Documentation available at{" "} + + docs.dokploy.com/docs/core/remote-servers/security + + . +

+

9.4 Data Security (On-Premise Software)

+

+ For On-Premise Software, Customer is solely responsible for + implementing appropriate security measures, including encryption, + access controls, network security, and compliance with applicable data + protection regulations. +

+

9.5 Backups

+

+ For Cloud Services, we perform daily backups and retain them for one + hundred (100) days. For On-Premise Software, Customer is solely + responsible for implementing backup procedures. +

+

9.6 Data Portability

+

+ Upon termination, you may export your Customer Data for thirty (30) + days following termination. After this period, we may delete your + Customer Data. We are not obligated to retain Customer Data after the + export period. +

+

9.7 Data Processing

+

+ Our processing of personal data is governed by our Privacy Policy and, + where applicable, the Data Processing Agreement (hereinafter + "DPA") attached hereto as Appendix I and is incorporated by + reference. The DPA applies only to the extent that the Services + involve the processing of Personal Data on behalf of the customer. In + the event of a conflict between these terms and the DPA, the DPA + shall prevail solely with respect to the Processing of Personal Data. +

+
+ +
+

+ Section 10 – Intellectual Property +

+

10.1 Our Intellectual Property

+

+ The Services, including all software, designs, text, graphics, and + other content (excluding Customer Data), are owned by us or our + licensors and are protected by intellectual property laws. These Terms + do not grant you any rights to our trademarks, service marks, or + logos. +

+

10.2 Feedback

+

+ If you provide suggestions, ideas, or feedback about the Services + ("Feedback"), you grant us a perpetual, irrevocable, + royalty-free, worldwide license to use, modify, and incorporate such + Feedback into the Services without obligation to you. +

+

10.3 Customer Applications

+

+ You retain all intellectual property rights in applications, code, and + content you develop or deploy using the Services. +

+
+ +
+

+ Section 11 – Confidentiality +

+

11.1 Definition

+

+ "Confidential Information" means any non-public information + disclosed by one party to the other that is designated as + confidential or that a reasonable person would understand to be + confidential, including pricing, business plans, technical data, and + Customer Data. +

+

11.2 Obligations

+

+ Each party agrees to: (a) protect the other party's Confidential + Information using at least the same degree of care it uses to protect + its own confidential information of similar nature but with no less + than reasonable care; (b) use Confidential Information only for + purposes directly related to performing under these Terms and as + described in the Subscription Plan or Order Form; and (c) not disclose + Confidential Information to any third party except as permitted under + these Terms or with the prior written consent of the disclosing party + and in accordance with the disclosing party's privacy policy. +

+

+ Disclosure required by law: Recipient may disclose Confidential + Information to the extent required by applicable law or a valid Court + Order provided that the recipient: (a) notifies the disclosing party + immediately upon receiving notice of such a law or Order so that the + disclosing party may seek a protective order or other remedies; and + (b) reasonably cooperates with any efforts by the disclosing party to + limit or protect the disclosure. +

+

+ Recipient shall promptly notify the disclosing party upon becoming + aware of any authorized access, use, or disclosure of Confidential + Information. +

+

11.3 Exceptions

+

+ Confidentiality obligations do not apply to information that: (a) is + or becomes publicly available without breach; (b) was known prior to + disclosure; (c) is received from a third party without + confidentiality restrictions; or (d) is independently developed + without use of Confidential Information. +

+
+ +
+

+ Section 12 – Third-Party Services +

+

+ The Services may integrate with or rely upon third-party services, + including container registries, cloud providers, and external APIs. + Your use of third-party services is subject to their respective + terms and conditions. We are not responsible for the availability, + accuracy, or content of third-party services, and we make no + warranties regarding them. +

+
+ +
+

+ Section 13 – Term and Termination +

+

13.1 Term

+

+ These Terms commence upon your first use of the Services and continue + until terminated. Subscription Terms automatically renew for + successive periods of the same duration unless either party provides + written notice of non-renewal at least thirty [30] days before the + end of the current term. +

+

13.2 Termination for Convenience

+

+ You may terminate your subscription at any time and without cause by + providing thirty (30) days written notice. If you terminate for + convenience under this Section, you will remain liable for the full + balance of fees due for the remainder of the Term of the Agreement. + No refunds are provided for unused portions of prepaid fees except as + expressly stated in Section 6.5. +

+

13.3 Termination for Cause

+

+ Either party may terminate this Agreement for the other's + material breach by written notice specifying, in detail, the nature + of the breach. The breaching party will have thirty (30) days from the + date the party receives notice of the breach to cure the breach. If + the breaching party fails to cure the breach within thirty (30) days, + the other party may terminate at the expiration of the cure period. +

+

+ Either party may terminate this Agreement without advance notice in + the event that the other party becomes insolvent, files for + bankruptcy, or ceases business operations. +

+

13.4 Suspension

+

+ We may suspend your access to the Services immediately without notice + if: (a) you violate the Acceptable Use Policy; (b) your use poses a + security risk to the Services or other customers; (c) you fail to pay + fees when due; or (d) we are required to do so by law. +

+

13.5 Effect of Termination

+

+ Upon termination: (a) your license to use the Services immediately + terminates; (b) you must cease all use of the Services and uninstall + any On-Premise Software and delete all copies in its possession or + control; (c) you may export Customer Data for thirty [30] days as + provided in Section 9.6; (d) each party must return or destroy the + other party's Confidential Information. Sections that by their + nature should survive termination shall survive, including Sections + 9, 10, 11, 14, 15, and 16. +

+
+ +
+

+ Section 14 – Warranties and Disclaimers +

+

14.1 Our Warranties

+

+ We warrant that: (a) we have the authority to enter into these Terms; + (b) the Services will perform materially in accordance with the + Documentation; and (c) we will not knowingly introduce viruses or + malicious code into the Services. +

+

14.2 Disclaimer

+

+ Except as expressly provided in Section 14.1, the Services are + provided "AS IS" and "AS AVAILABLE" with no + representation or warranty of any kind. We disclaim all warranties, + express or implied, including warranties of merchantability, fitness + for a particular purpose, non-infringement of intellectual property + rights, and any warranties arising from course of dealing or usage of + trade. We do not warrant that the Services will be uninterrupted, + error-free, or completely secure. Without limiting the generality of + the foregoing, we have no obligation to indemnify, defend, or hold + harmless Customer, including without limitation against claims related + to product liability or infringement of intellectual property + rights, unless this Agreement specifically provides for such an + indemnity. +

+

14.3 Beta Features

+

+ Beta, preview, or experimental features are provided "as + is" without any warranty. We may modify or discontinue beta + features at any time without notice. +

+
+ +
+

+ Section 15 – Limitation of Liability +

+

15.1 Exclusion of Damages

+

+ To the maximum extent permitted by law, neither party shall be liable + for any indirect, incidental, special, consequential, or punitive + damages, including lost profits, lost revenue, lost data, or business + interruption, regardless of the theory of liability and even if + advised of the possibility of such damages. +

+

15.2 Liability Cap

+

+ Our total cumulative liability under these Terms shall not exceed the + greater of: (A) the amounts paid by you to us in the twelve [12] + months preceding the claim; or (B) the value of the Agreement for the + preceding twelve (12) months. This limitation applies regardless of + the form of action, whether in contract, tort, strict liability, or + otherwise. +

+

15.3 Exceptions

+

+ The limitations in this Section 15 do not apply to: (a) your payment + obligations; (b) either party's indemnification obligations; (c) + breaches of confidentiality; (d) your violation of our intellectual + property rights; or (e) claims arising from gross negligence or + willful misconduct. +

+
+ +
+

+ Section 16 – Indemnification +

+

16.1 Your Indemnification

+

+ You agree to indemnify, defend, and hold harmless, at your own cost, + Dokploy and its officers, directors, employees, and agents from any + claims, damages, losses, and expenses (including reasonable + attorneys' fees) arising from: (a) your use of the Services; (b) + your Customer Data; (c) your violation of these Terms; (d) your + violation of any third-party rights; or (e) applications or content + you deploy using the Services. +

+

16.2 Our Indemnification

+

+ We will indemnify and defend you, at our own cost, from third-party + claims alleging that your authorized use of the Services infringes a + third party's intellectual property rights, provided you: (a) + promptly notify us of the claim; (b) give us sole control of the + defense and settlement; and (c) provide reasonable cooperation. +

+
+ +
+

+ Section 17 – Governing Law and Dispute Resolution +

+

17.1 Governing Law

+

+ These Terms shall be governed by and construed in accordance with + the laws of the State of Delaware, United States, without regard to + its conflict of law principles. +

+

17.2 Dispute Resolution

+

+ [OPTION 1 - ARBITRATION: Any dispute arising from these Terms shall + be resolved by binding arbitration administered by AAA in accordance + with its Commercial Arbitration Rules. The arbitration shall be + conducted in the State of Delaware. The arbitrator's decision + shall be final and binding.] +

+

17.3 Waiver of Jury Trial

+

+ Each party waives its right to a jury trial for any dispute arising + from these Terms. +

+
+ +
+

+ Section 19 – Changes to Terms +

+

+ We may update these Terms from time to time. For material changes, we + will provide at least thirty [30] days' notice via email or + through the Services. Your continued use of the Services after the + effective date of changes constitutes acceptance of the updated Terms. + If you do not agree to the changes, you may terminate your subscription + before the changes take effect. +

+
+ +
+

+ Section 20 – General Provisions +

+

20.1 Entire Agreement

+

+ This Agreement is the parties' entire agreement regarding its + subject matter and supersedes any prior or contemporaneous agreements + regarding its subject matter. In this Agreement, headings are for + convenience only and "including" and similar terms are to + be construed without limitation. Excluding Orders, terms in business + forms, purchase orders or quotes used by either party will not amend + or modify this Agreement; any such documents are for administrative + purposes only. This Agreement may be executed in counterparts + (including electronic copies and PDFs), each of which is deemed an + original and which together form one and the same Agreement. +

+

20.2 Waivers and Severability

+

+ Waivers must be signed by the waiving party's authorized + representative and cannot be implied from conduct. If any provision of + this Agreement is held invalid, illegal or unenforceable, it will be + limited to the minimum extent necessary so the rest of this Agreement + remains in effect. +

+

20.4 Assignment

+

+ Neither party may assign this Agreement without the prior consent of + the other party, except that either party may assign this Agreement, + with notice to the other party, in connection with the assigning + party's merger, reorganization, acquisition or other transfer + of all or substantially all of its assets or voting securities. Any + non-permitted assignment is void. This Agreement will bind and inure + to the benefit of each party's permitted successors and assigns. +

+

20.5 Notices

+

+ A. Except as set out in this Agreement, notices, requests and approvals + under this Agreement must be in writing to the addresses on the Cover + Page and will be deemed given: (1) upon receipt if by personal + delivery, (2) upon receipt if by certified or registered U.S. mail + (return receipt requested), (3) one day after dispatch if by a + commercial overnight delivery or (4) upon delivery if by email. + Either party may update its address with notice to the other. +

+

B. Provider may also send operational notices through the Cloud Service.

+

20.6 Force Majeure

+

+ Neither party is liable for a delay or failure to perform this + Agreement due to a Force Majeure. If a Force Majeure materially + adversely affects the Cloud Service for 15 or more consecutive days, + either party may terminate the affected Order(s) upon notice to the + other and Provider will refund to Customer any pre-paid, unused fees + for the terminated portion of the Subscription Term. However, this + Section does not limit Customer's obligations to pay fees owed. +

+

20.7 Independent Contractors

+

+ The parties are independent contractors. Nothing in these Terms + creates a partnership, joint venture, agency, or employment + relationship. +

+
+ +
+

+ Section 21 – Contact Information +

+

+ If you have questions about these Terms of Service, please contact us + at: +

+

Dokploy Technologies, Inc.

+

2912 Steiner St Unit 4 + San Francisco, CA 94123

+

+ Email:{" "} + + contact@dokploy.com + +

+
+ +
+

+ Appendix I - Data Processing Addendum +

+

+ This Data Protection Addendum ("DPA") is attached to and + incorporated into the Terms of Service. Customer and Provider enter + into this DPA by agreeing to the Terms of Service. Capitalized terms + not defined in this DPA are defined in the Terms of Service or DPA + Setup Page. +

+

Definitions

+
    +
  • + "Agreement" means the Agreement between Customer and + Provider incorporating the Bonterms Cloud Terms which is specified + on the DPA Setup Page. +
  • +
  • + "Audit" and "Audit Parameters" are defined in + Section 9.3 below. +
  • +
  • "Audit Report" is defined in Section 9.2 below.
  • +
  • + "Controller" means the natural or legal person, public + authority, agency or other body which, alone or jointly with + others, determines the purposes and means of Processing of + Personal Data. +
  • +
  • "Customer Instructions" is defined in Section 3.1 below.
  • +
  • + "Customer Personal Data" means Personal Data in Customer + Data (as defined in the Agreement). +
  • +
  • + "Data Protection Laws" means all laws and regulations + applicable to the Processing of Customer Personal Data under the + Agreement, including, as applicable: (i) the California Consumer + Privacy Act, as amended by the California Privacy Rights Act, and + any binding regulations promulgated thereunder ("CCPA"), + (ii) the General Data Protection Regulation (Regulation (EU) + 2016/679) ("EU GDPR" or "GDPR"), (iii) the + Swiss Federal Act on Data Protection ("FADP"), (iv) the EU + GDPR as it forms part of the law of England and Wales by virtue of + section 3 of the European Union (Withdrawal) Act 2018 (the "UK + GDPR") and (v) the UK Data Protection Act 2018; in each case, + as updated, amended or replaced from time to time. +
  • +
  • + "Data Subject" means the identified or identifiable + natural person to whom Customer Personal Data relates. +
  • +
  • + "DPA Effective Date" is specified on the DPA Setup Page. +
  • +
  • + "DPA Setup Page" means a separate document executed by + Customer and Provider which causes this DPA to become an + Attachment to their Agreement. +
  • +
  • "EEA" means European Economic Area.
  • +
  • + "Key Terms" means Agreement, DPA Effective Date and + Subprocessor List as specified by the parties on the DPA Setup + Page. +
  • +
  • + "Personal Data" means information about an identified or + identifiable natural person or which otherwise constitutes + "personal data", "personal information", + "personally identifiable information" or similar terms + as defined in Data Protection Laws. +
  • +
  • + "Processing" and inflections thereof refer to any + operation or set of operations that is performed on Personal Data + or on sets of Personal Data, whether or not by automated means. +
  • +
  • + "Processor" means a natural or legal person, public + authority, agency or other body which Processes Personal Data on + behalf of the Controller. +
  • +
  • + "Restricted Transfer" means: (i) where EU GDPR applies, a + transfer of Customer Personal Data from the EEA to a country + outside the EEA that is not subject to an adequacy determination, + (ii) where UK GDPR applies, a transfer of Customer Personal Data + from the United Kingdom to any other country that is not subject to + an adequacy determination or (iii) where FADP applies, a transfer + of Customer Personal Data from Switzerland to any other country + that is not subject to an adequacy determination. +
  • +
  • + "Schedules" means one or more schedules incorporated by + the parties in their DPA Setup Page. The default Schedules for this + DPA are: Schedule 1 Subject Matter and Details of Processing; + Schedule 2 Technical and Organizational Measures; Schedule 3 + Cross-Border Transfer Mechanisms; Schedule 4 Region-Specific Term. +
  • +
  • + "Security Incident" means any breach of security that + leads to the accidental or unlawful destruction, loss, alteration, + unauthorized disclosure of, or access to, Customer Personal Data + being Processed by Provider. +
  • +
  • "Specified Notice Period" is 48 hours.
  • +
  • + "Subprocessor" means any third party authorized by + Provider to Process any Customer Personal Data. +
  • +
  • + "Subprocessor List" means the list of Provider's + Subprocessors as identified or linked to on the DPA Setup Page. +
  • +
+

+ The full DPA continues with sections on Scope and Duration, Processing + of Personal Data, Confidentiality, Compliance with Laws, Subprocessors, + Security, Data Subject Requests, Data Return or Deletion, Audits, and + Cross-Border Transfers/Region-Specific Terms. For the complete + legal text of the Data Processing Addendum, please contact{" "} + + support@dokploy.com + + . +

+
+
+ ); +} diff --git a/apps/website/components/Footer.tsx b/apps/website/components/Footer.tsx index e325612..4639bc1 100644 --- a/apps/website/components/Footer.tsx +++ b/apps/website/components/Footer.tsx @@ -47,6 +47,7 @@ export function Footer() { > Docs + Terms of Service Privacy Policy diff --git a/apps/website/package.json b/apps/website/package.json index 3088490..c7f7e80 100644 --- a/apps/website/package.json +++ b/apps/website/package.json @@ -36,7 +36,7 @@ "clsx": "^2.1.0", "framer-motion": "^11.3.19", "lucide-react": "0.364.0", - "next": "16.0.10", + "next": "16.1.5", "react": "^19.2.0", "react-dom": "^19.2.0", "react-ga4": "^2.1.0", diff --git a/apps/website/public/install.sh b/apps/website/public/install.sh index 6624c16..1bed881 100644 --- a/apps/website/public/install.sh +++ b/apps/website/public/install.sh @@ -261,7 +261,11 @@ install_dokploy() { # Installation # Set RELEASE_TAG environment variable for canary/feature versions release_tag_env="" - if [ "$VERSION_TAG" != "latest" ]; then + if [[ "$VERSION_TAG" =~ ^v[0-9]+\.[0-9]+\.[0-9]+ ]]; then + # Specific version (v0.26.6, v0.26.7, etc.) → latest + release_tag_env="-e RELEASE_TAG=latest" + elif [ "$VERSION_TAG" != "latest" ]; then + # canary, feature/*, etc. → use the tag as-is release_tag_env="-e RELEASE_TAG=$VERSION_TAG" fi diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5d20134..0e8b81b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -32,7 +32,7 @@ importers: dependencies: '@next/third-parties': specifier: 16.0.7 - version: 16.0.7(next@16.0.10(@babel/core@7.26.9)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1) + version: 16.0.7(next@16.1.5(@babel/core@7.26.9)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1) '@radix-ui/react-dropdown-menu': specifier: ^2.1.16 version: 2.1.16(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) @@ -44,22 +44,22 @@ importers: version: 2.1.1 fumadocs-core: specifier: 16.2.3 - version: 16.2.3(@types/react@19.2.2)(lucide-react@0.552.0(react@19.2.1))(next@16.0.10(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(zod@4.1.13) + version: 16.2.3(@types/react@19.2.2)(lucide-react@0.552.0(react@19.2.1))(next@16.1.5(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(zod@4.1.13) fumadocs-mdx: specifier: 14.1.0 - version: 14.1.0(fumadocs-core@16.2.3(@types/react@19.2.2)(lucide-react@0.552.0(react@19.2.1))(next@16.0.10(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(zod@4.1.13))(next@16.0.10(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1) + version: 14.1.0(fumadocs-core@16.2.3(@types/react@19.2.2)(lucide-react@0.552.0(react@19.2.1))(next@16.1.5(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(zod@4.1.13))(next@16.1.5(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1) fumadocs-openapi: specifier: 10.1.1 - version: 10.1.1(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(fumadocs-core@16.2.3(@types/react@19.2.2)(lucide-react@0.552.0(react@19.2.1))(next@16.0.10(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(zod@4.1.13))(fumadocs-ui@16.2.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(lucide-react@0.552.0(react@19.2.1))(next@16.0.10(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(tailwindcss@4.1.17)(zod@4.1.13))(prettier@3.3.3)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + version: 10.1.1(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(fumadocs-core@16.2.3(@types/react@19.2.2)(lucide-react@0.552.0(react@19.2.1))(next@16.1.5(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(zod@4.1.13))(fumadocs-ui@16.2.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(lucide-react@0.552.0(react@19.2.1))(next@16.1.5(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(tailwindcss@4.1.17)(zod@4.1.13))(prettier@3.3.3)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) fumadocs-ui: specifier: 16.2.3 - version: 16.2.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(lucide-react@0.552.0(react@19.2.1))(next@16.0.10(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(tailwindcss@4.1.17)(zod@4.1.13) + version: 16.2.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(lucide-react@0.552.0(react@19.2.1))(next@16.1.5(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(tailwindcss@4.1.17)(zod@4.1.13) lucide-react: specifier: ^0.552.0 version: 0.552.0(react@19.2.1) next: - specifier: 16.0.10 - version: 16.0.10(@babel/core@7.26.9)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + specifier: 16.1.5 + version: 16.1.5(@babel/core@7.26.9)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) react: specifier: ^19.2.0 version: 19.2.1 @@ -111,7 +111,7 @@ importers: version: 0.2.1(tailwindcss@3.4.7) '@next/third-parties': specifier: 16.0.7 - version: 16.0.7(next@16.0.10(@babel/core@7.26.9)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1) + version: 16.0.7(next@16.1.5(@babel/core@7.26.9)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1) '@prettier/plugin-xml': specifier: ^3.4.1 version: 3.4.1(prettier@3.3.3) @@ -176,8 +176,8 @@ importers: specifier: 0.364.0 version: 0.364.0(react@19.2.1) next: - specifier: 16.0.10 - version: 16.0.10(@babel/core@7.26.9)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + specifier: 16.1.5 + version: 16.1.5(@babel/core@7.26.9)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) prettier: specifier: ^3.3.3 version: 3.3.3 @@ -1027,53 +1027,53 @@ packages: '@mixmark-io/domino@2.2.0': resolution: {integrity: sha512-Y28PR25bHXUg88kCV7nivXrP2Nj2RueZ3/l/jdx6J9f8J4nsEGcgX0Qe6lt7Pa+J79+kPiJU3LguR6O/6zrLOw==} - '@next/env@16.0.10': - resolution: {integrity: sha512-8tuaQkyDVgeONQ1MeT9Mkk8pQmZapMKFh5B+OrFUlG3rVmYTXcXlBetBgTurKXGaIZvkoqRT9JL5K3phXcgang==} + '@next/env@16.1.5': + resolution: {integrity: sha512-CRSCPJiSZoi4Pn69RYBDI9R7YK2g59vLexPQFXY0eyw+ILevIenCywzg+DqmlBik9zszEnw2HLFOUlLAcJbL7g==} - '@next/swc-darwin-arm64@16.0.10': - resolution: {integrity: sha512-4XgdKtdVsaflErz+B5XeG0T5PeXKDdruDf3CRpnhN+8UebNa5N2H58+3GDgpn/9GBurrQ1uWW768FfscwYkJRg==} + '@next/swc-darwin-arm64@16.1.5': + resolution: {integrity: sha512-eK7Wdm3Hjy/SCL7TevlH0C9chrpeOYWx2iR7guJDaz4zEQKWcS1IMVfMb9UKBFMg1XgzcPTYPIp1Vcpukkjg6Q==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@16.0.10': - resolution: {integrity: sha512-spbEObMvRKkQ3CkYVOME+ocPDFo5UqHb8EMTS78/0mQ+O1nqE8toHJVioZo4TvebATxgA8XMTHHrScPrn68OGw==} + '@next/swc-darwin-x64@16.1.5': + resolution: {integrity: sha512-foQscSHD1dCuxBmGkbIr6ScAUF6pRoDZP6czajyvmXPAOFNnQUJu2Os1SGELODjKp/ULa4fulnBWoHV3XdPLfA==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@16.0.10': - resolution: {integrity: sha512-uQtWE3X0iGB8apTIskOMi2w/MKONrPOUCi5yLO+v3O8Mb5c7K4Q5KD1jvTpTF5gJKa3VH/ijKjKUq9O9UhwOYw==} + '@next/swc-linux-arm64-gnu@16.1.5': + resolution: {integrity: sha512-qNIb42o3C02ccIeSeKjacF3HXotGsxh/FMk/rSRmCzOVMtoWH88odn2uZqF8RLsSUWHcAqTgYmPD3pZ03L9ZAA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@16.0.10': - resolution: {integrity: sha512-llA+hiDTrYvyWI21Z0L1GiXwjQaanPVQQwru5peOgtooeJ8qx3tlqRV2P7uH2pKQaUfHxI/WVarvI5oYgGxaTw==} + '@next/swc-linux-arm64-musl@16.1.5': + resolution: {integrity: sha512-U+kBxGUY1xMAzDTXmuVMfhaWUZQAwzRaHJ/I6ihtR5SbTVUEaDRiEU9YMjy1obBWpdOBuk1bcm+tsmifYSygfw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@16.0.10': - resolution: {integrity: sha512-AK2q5H0+a9nsXbeZ3FZdMtbtu9jxW4R/NgzZ6+lrTm3d6Zb7jYrWcgjcpM1k8uuqlSy4xIyPR2YiuUr+wXsavA==} + '@next/swc-linux-x64-gnu@16.1.5': + resolution: {integrity: sha512-gq2UtoCpN7Ke/7tKaU7i/1L7eFLfhMbXjNghSv0MVGF1dmuoaPeEVDvkDuO/9LVa44h5gqpWeJ4mRRznjDv7LA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@16.0.10': - resolution: {integrity: sha512-1TDG9PDKivNw5550S111gsO4RGennLVl9cipPhtkXIFVwo31YZ73nEbLjNC8qG3SgTz/QZyYyaFYMeY4BKZR/g==} + '@next/swc-linux-x64-musl@16.1.5': + resolution: {integrity: sha512-bQWSE729PbXT6mMklWLf8dotislPle2L70E9q6iwETYEOt092GDn0c+TTNj26AjmeceSsC4ndyGsK5nKqHYXjQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@16.0.10': - resolution: {integrity: sha512-aEZIS4Hh32xdJQbHz121pyuVZniSNoqDVx1yIr2hy+ZwJGipeqnMZBJHyMxv2tiuAXGx6/xpTcQJ6btIiBjgmg==} + '@next/swc-win32-arm64-msvc@16.1.5': + resolution: {integrity: sha512-LZli0anutkIllMtTAWZlDqdfvjWX/ch8AFK5WgkNTvaqwlouiD1oHM+WW8RXMiL0+vAkAJyAGEzPPjO+hnrSNQ==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@16.0.10': - resolution: {integrity: sha512-E+njfCoFLb01RAFEnGZn6ERoOqhK1Gl3Lfz1Kjnj0Ulfu7oJbuMyvBKNj/bw8XZnenHDASlygTjZICQW+rYW1Q==} + '@next/swc-win32-x64-msvc@16.1.5': + resolution: {integrity: sha512-7is37HJTNQGhjPpQbkKjKEboHYQnCgpVt/4rBrrln0D9nderNxZ8ZWs8w1fAtzUx7wEyYjQ+/13myFgFj6K2Ng==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -2309,6 +2309,10 @@ packages: resolution: {integrity: sha512-3XSA2cR/h/73EzlXXdU6YNycmYI7+kicTxks4eJg2g39biHR84slg2+des+p7iHYhbRg/udIS4TD53WabcOUkw==} engines: {node: '>= 0.4'} + baseline-browser-mapping@2.9.19: + resolution: {integrity: sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==} + hasBin: true + binary-extensions@2.3.0: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} @@ -3537,8 +3541,8 @@ packages: react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc - next@16.0.10: - resolution: {integrity: sha512-RtWh5PUgI+vxlV3HdR+IfWA1UUHu0+Ram/JBO4vWB54cVPentCD0e+lxyAYEsDTqGGMg7qpjhKh6dc6aW7W/sA==} + next@16.1.5: + resolution: {integrity: sha512-f+wE+NSbiQgh3DSAlTaw2FwY5yGdVViAtp8TotNQj4kk4Q8Bh1sC/aL9aH+Rg1YAVn18OYXsRDT7U/079jgP7w==} engines: {node: '>=20.9.0'} hasBin: true peerDependencies: @@ -5129,35 +5133,35 @@ snapshots: '@mixmark-io/domino@2.2.0': {} - '@next/env@16.0.10': {} + '@next/env@16.1.5': {} - '@next/swc-darwin-arm64@16.0.10': + '@next/swc-darwin-arm64@16.1.5': optional: true - '@next/swc-darwin-x64@16.0.10': + '@next/swc-darwin-x64@16.1.5': optional: true - '@next/swc-linux-arm64-gnu@16.0.10': + '@next/swc-linux-arm64-gnu@16.1.5': optional: true - '@next/swc-linux-arm64-musl@16.0.10': + '@next/swc-linux-arm64-musl@16.1.5': optional: true - '@next/swc-linux-x64-gnu@16.0.10': + '@next/swc-linux-x64-gnu@16.1.5': optional: true - '@next/swc-linux-x64-musl@16.0.10': + '@next/swc-linux-x64-musl@16.1.5': optional: true - '@next/swc-win32-arm64-msvc@16.0.10': + '@next/swc-win32-arm64-msvc@16.1.5': optional: true - '@next/swc-win32-x64-msvc@16.0.10': + '@next/swc-win32-x64-msvc@16.1.5': optional: true - '@next/third-parties@16.0.7(next@16.0.10(@babel/core@7.26.9)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1)': + '@next/third-parties@16.0.7(next@16.1.5(@babel/core@7.26.9)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1)': dependencies: - next: 16.0.10(@babel/core@7.26.9)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + next: 16.1.5(@babel/core@7.26.9)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) react: 19.2.1 third-party-capital: 1.0.20 @@ -6403,6 +6407,8 @@ snapshots: base64-js@0.0.8: {} + baseline-browser-mapping@2.9.19: {} + binary-extensions@2.3.0: {} brace-expansion@2.0.1: @@ -6415,7 +6421,7 @@ snapshots: browserslist@4.23.2: dependencies: - caniuse-lite: 1.0.30001643 + caniuse-lite: 1.0.30001679 electron-to-chromium: 1.5.2 node-releases: 2.0.18 update-browserslist-db: 1.1.0(browserslist@4.23.2) @@ -6867,7 +6873,7 @@ snapshots: fsevents@2.3.3: optional: true - fumadocs-core@16.2.3(@types/react@19.2.2)(lucide-react@0.552.0(react@19.2.1))(next@16.0.10(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(zod@4.1.13): + fumadocs-core@16.2.3(@types/react@19.2.2)(lucide-react@0.552.0(react@19.2.1))(next@16.1.5(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(zod@4.1.13): dependencies: '@formatjs/intl-localematcher': 0.6.2 '@orama/orama': 3.1.16 @@ -6890,21 +6896,21 @@ snapshots: optionalDependencies: '@types/react': 19.2.2 lucide-react: 0.552.0(react@19.2.1) - next: 16.0.10(@babel/core@7.26.9)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + next: 16.1.5(@babel/core@7.26.9)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) react: 19.2.1 react-dom: 19.2.1(react@19.2.1) zod: 4.1.13 transitivePeerDependencies: - supports-color - fumadocs-mdx@14.1.0(fumadocs-core@16.2.3(@types/react@19.2.2)(lucide-react@0.552.0(react@19.2.1))(next@16.0.10(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(zod@4.1.13))(next@16.0.10(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1): + fumadocs-mdx@14.1.0(fumadocs-core@16.2.3(@types/react@19.2.2)(lucide-react@0.552.0(react@19.2.1))(next@16.1.5(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(zod@4.1.13))(next@16.1.5(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1): dependencies: '@mdx-js/mdx': 3.1.1 '@standard-schema/spec': 1.0.0 chokidar: 5.0.0 esbuild: 0.27.1 estree-util-value-to-estree: 3.5.0 - fumadocs-core: 16.2.3(@types/react@19.2.2)(lucide-react@0.552.0(react@19.2.1))(next@16.0.10(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(zod@4.1.13) + fumadocs-core: 16.2.3(@types/react@19.2.2)(lucide-react@0.552.0(react@19.2.1))(next@16.1.5(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(zod@4.1.13) js-yaml: 4.1.1 mdast-util-to-markdown: 2.1.2 picocolors: 1.1.1 @@ -6918,12 +6924,12 @@ snapshots: vfile: 6.0.3 zod: 4.1.13 optionalDependencies: - next: 16.0.10(@babel/core@7.26.9)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + next: 16.1.5(@babel/core@7.26.9)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) react: 19.2.1 transitivePeerDependencies: - supports-color - fumadocs-openapi@10.1.1(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(fumadocs-core@16.2.3(@types/react@19.2.2)(lucide-react@0.552.0(react@19.2.1))(next@16.0.10(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(zod@4.1.13))(fumadocs-ui@16.2.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(lucide-react@0.552.0(react@19.2.1))(next@16.0.10(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(tailwindcss@4.1.17)(zod@4.1.13))(prettier@3.3.3)(react-dom@19.2.1(react@19.2.1))(react@19.2.1): + fumadocs-openapi@10.1.1(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(fumadocs-core@16.2.3(@types/react@19.2.2)(lucide-react@0.552.0(react@19.2.1))(next@16.1.5(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(zod@4.1.13))(fumadocs-ui@16.2.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(lucide-react@0.552.0(react@19.2.1))(next@16.1.5(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(tailwindcss@4.1.17)(zod@4.1.13))(prettier@3.3.3)(react-dom@19.2.1(react@19.2.1))(react@19.2.1): dependencies: '@fumari/json-schema-to-typescript': 2.0.0(prettier@3.3.3) '@radix-ui/react-accordion': 1.2.12(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) @@ -6934,8 +6940,8 @@ snapshots: '@scalar/openapi-parser': 0.23.3 ajv: 8.17.1 class-variance-authority: 0.7.1 - fumadocs-core: 16.2.3(@types/react@19.2.2)(lucide-react@0.552.0(react@19.2.1))(next@16.0.10(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(zod@4.1.13) - fumadocs-ui: 16.2.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(lucide-react@0.552.0(react@19.2.1))(next@16.0.10(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(tailwindcss@4.1.17)(zod@4.1.13) + fumadocs-core: 16.2.3(@types/react@19.2.2)(lucide-react@0.552.0(react@19.2.1))(next@16.1.5(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(zod@4.1.13) + fumadocs-ui: 16.2.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(lucide-react@0.552.0(react@19.2.1))(next@16.1.5(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(tailwindcss@4.1.17)(zod@4.1.13) github-slugger: 2.0.0 hast-util-to-jsx-runtime: 2.3.6 js-yaml: 4.1.1 @@ -6955,7 +6961,7 @@ snapshots: - prettier - supports-color - fumadocs-ui@16.2.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(lucide-react@0.552.0(react@19.2.1))(next@16.0.10(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(tailwindcss@4.1.17)(zod@4.1.13): + fumadocs-ui@16.2.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(lucide-react@0.552.0(react@19.2.1))(next@16.1.5(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(tailwindcss@4.1.17)(zod@4.1.13): dependencies: '@radix-ui/react-accordion': 1.2.12(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@radix-ui/react-collapsible': 1.1.12(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) @@ -6968,7 +6974,7 @@ snapshots: '@radix-ui/react-slot': 1.2.4(@types/react@19.2.2)(react@19.2.1) '@radix-ui/react-tabs': 1.1.13(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) class-variance-authority: 0.7.1 - fumadocs-core: 16.2.3(@types/react@19.2.2)(lucide-react@0.552.0(react@19.2.1))(next@16.0.10(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(zod@4.1.13) + fumadocs-core: 16.2.3(@types/react@19.2.2)(lucide-react@0.552.0(react@19.2.1))(next@16.1.5(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(zod@4.1.13) lodash.merge: 4.6.2 next-themes: 0.4.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) postcss-selector-parser: 7.1.1 @@ -6979,7 +6985,7 @@ snapshots: tailwind-merge: 3.4.0 optionalDependencies: '@types/react': 19.2.2 - next: 16.0.10(@babel/core@7.26.9)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + next: 16.1.5(@babel/core@7.26.9)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) tailwindcss: 4.1.17 transitivePeerDependencies: - '@mixedbread/sdk' @@ -7938,24 +7944,25 @@ snapshots: react: 19.2.1 react-dom: 19.2.1(react@19.2.1) - next@16.0.10(@babel/core@7.26.9)(react-dom@19.2.1(react@19.2.1))(react@19.2.1): + next@16.1.5(@babel/core@7.26.9)(react-dom@19.2.1(react@19.2.1))(react@19.2.1): dependencies: - '@next/env': 16.0.10 + '@next/env': 16.1.5 '@swc/helpers': 0.5.15 + baseline-browser-mapping: 2.9.19 caniuse-lite: 1.0.30001679 postcss: 8.4.31 react: 19.2.1 react-dom: 19.2.1(react@19.2.1) styled-jsx: 5.1.6(@babel/core@7.26.9)(react@19.2.1) optionalDependencies: - '@next/swc-darwin-arm64': 16.0.10 - '@next/swc-darwin-x64': 16.0.10 - '@next/swc-linux-arm64-gnu': 16.0.10 - '@next/swc-linux-arm64-musl': 16.0.10 - '@next/swc-linux-x64-gnu': 16.0.10 - '@next/swc-linux-x64-musl': 16.0.10 - '@next/swc-win32-arm64-msvc': 16.0.10 - '@next/swc-win32-x64-msvc': 16.0.10 + '@next/swc-darwin-arm64': 16.1.5 + '@next/swc-darwin-x64': 16.1.5 + '@next/swc-linux-arm64-gnu': 16.1.5 + '@next/swc-linux-arm64-musl': 16.1.5 + '@next/swc-linux-x64-gnu': 16.1.5 + '@next/swc-linux-x64-musl': 16.1.5 + '@next/swc-win32-arm64-msvc': 16.1.5 + '@next/swc-win32-x64-msvc': 16.1.5 sharp: 0.34.5 transitivePeerDependencies: - '@babel/core' @@ -8178,7 +8185,7 @@ snapshots: dependencies: react: 19.2.1 react-style-singleton: 2.2.1(@types/react@19.2.2)(react@19.2.1) - tslib: 2.6.3 + tslib: 2.8.1 optionalDependencies: '@types/react': 19.2.2 @@ -8217,7 +8224,7 @@ snapshots: get-nonce: 1.0.1 invariant: 2.2.4 react: 19.2.1 - tslib: 2.6.3 + tslib: 2.8.1 optionalDependencies: '@types/react': 19.2.2 @@ -8780,7 +8787,7 @@ snapshots: use-callback-ref@1.3.2(@types/react@19.2.2)(react@19.2.1): dependencies: react: 19.2.1 - tslib: 2.6.3 + tslib: 2.8.1 optionalDependencies: '@types/react': 19.2.2 @@ -8795,7 +8802,7 @@ snapshots: dependencies: detect-node-es: 1.1.0 react: 19.2.1 - tslib: 2.6.3 + tslib: 2.8.1 optionalDependencies: '@types/react': 19.2.2