Templates let you deploy popular open-source tools in seconds without writing a single line of Docker Compose YAML. Each template is a pre-packaged blueprint that bundles aDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/Nettalco/dokploy/llms.txt
Use this file to discover all available pages before exploring further.
docker-compose.yml with a configuration file describing environment variables, domains, file mounts, and optional isolated networking — everything Dokploy needs to get the application running on your server straight away.
How Templates Work
When you deploy a template, Dokploy performs the following steps automatically:- Fetches the template’s
docker-compose.ymlandtemplate.tomlconfiguration fromhttps://templates.dokploy.com/blueprints/<id>/. A cached local copy is used as a fallback if the remote fetch fails. - Generates dynamic values — random passwords, JWT secrets, a unique
sslip.iodomain based on your server IP, and an application name — using theprocessTemplateengine. - Substitutes all
${variable}placeholders in the compose file and environment variable definitions with the generated (or user-provided) values. - Creates a Docker Compose service in the selected project, pre-populated with the processed compose file, environment variables, and any required file mounts.
- Deploys the stack immediately using the same engine as any other Docker Compose service.
template.toml) drives all of this. It declares:
Browsing Templates
compose.templates fetches the full template catalogue from https://templates.dokploy.com/meta.json and returns an array of template metadata objects. Each object contains:
| Field | Description |
|---|---|
id | Unique template identifier (used for fetching blueprint files). |
name | Human-readable template name. |
description | Short description of the application. |
tags | Array of category strings (e.g. ["analytics", "privacy"]). |
version | Template version string. |
logo | URL to the application’s logo image. |
links.github | URL to the application’s GitHub repository. |
links.website | Optional URL to the application’s website. |
links.docs | Optional URL to the application’s documentation. |
compose.getTags derives a deduplicated list of all tags across the catalogue, which the dashboard uses to power the category filter:
Deploying a Template
Create a new Docker Compose service
Inside a project, click New Service → Docker Compose. In the compose creation dialog, switch to the Templates tab.
Select a template
Browse or filter the template library by category tag. Click on a template card to select it. The template description, logo, and links are shown in a preview panel.
Configure domain and environment variables
Dokploy pre-fills a randomly generated
sslip.io domain and all required credentials (passwords, secrets, etc.). You can override any of these values before deploying — for example, replacing the generated domain with your own custom domain.Select a server (if applicable)
On multi-server setups, choose the target server from the Server dropdown. The server’s IP address is used to generate the
sslip.io domain.Template Categories
The template library is organised by tags. Common categories include:| Category | Example Applications |
|---|---|
| Analytics | Plausible Analytics, Umami |
| CMS | Ghost, Directus, Strapi |
| Databases | PostgreSQL, MySQL, MariaDB, Redis, MongoDB |
| Dev Tools | Gitea, Plane, AppSmith |
| Productivity | Cal.com, Nextcloud, Mattermost |
| Backend / BaaS | PocketBase, Supabase, Appwrite |
| Monitoring | Grafana, Uptime Kuma |
| Storage | MinIO |
compose.getTags to retrieve the live list of available tags, as new templates are added to the catalogue regularly.
How compose.processTemplate Works
compose.processTemplate is the engine behind template variable substitution. It accepts a base64-encoded payload containing a raw docker-compose.yml and a TOML configuration string, decodes them, and performs the following substitutions in the configuration’s env block:
| Placeholder | Substituted with |
|---|---|
${domain} | A randomly generated <project>-<hash>-<server-ip>.sslip.io hostname. |
${password} | A 16-character alphanumeric random password. |
${hash} | An 8-character random hex string. |
${base64} | A 32-byte base64-encoded random string. |
${jwt} | A signed HS256 JWT token. |
${APP_NAME} | The application’s internal name (derived from the project name and template ID). |
| Any named variable | The value of the corresponding entry in the template’s [variables] block. |
envs— an array ofKEY=valuestrings ready to be joined with newlines and written as the service’s.envfile.mounts— an array of{ filePath, content }objects for config files that need to be written to the container’s filesystem.domains— the list of domain/port/service mappings to register automatically.
Custom Templates
You can deploy your own template by pointing Dokploy to a Git repository that contains adocker-compose.yml and a template.toml at its root (or in a blueprints/<id>/ subdirectory matching the template CDN layout). Use a Docker Compose service with Git as the source type and set the source path to your repository.
For one-click deployment of a custom template from an external URL, compose.deployTemplate accepts an optional baseUrl parameter. Set this to the base URL of your own template CDN (or a raw GitHub URL prefix) to override the default https://templates.dokploy.com.
Updating a Template
Templates are fetched live fromhttps://templates.dokploy.com at deploy time. To pick up upstream changes to a template (a new application version, updated environment variables, etc.), simply redeploy the service from the dashboard. Dokploy will fetch the latest docker-compose.yml and template.toml and regenerate the compose file.
Isolated Deployments
Templates can declareisolated = true in their [config] block. When this flag is set, Dokploy places the compose stack in its own Docker network, preventing other services from reaching it directly. This is the default for most templates that bundle a database alongside the application.
You can inspect whether a template uses isolated networking by checking the config.isolated field on the template metadata returned by compose.templates.