* chore: remove compose version + add checks (#1268) * fix: reject deprecated Docker Compose version field * chore: remove deprecated version field in docker compose * chore(orbit): drop the obsolete compose version key orbit was merged after this PR was opened and still had version: '3.8' at the end of the file, which the new validator check rejects. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Mauricio Siu <siumauricio@icloud.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * Update Calcom Template to add all env vars (#1278) * feat: add all env variables for calcom image and health checking for postgres + restart config for containers * feat: add postgres var generators * cachkey: bump version to 0.2.0 (#1277) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * feat: add PrivatePaste template (#1276) * feat: add PrivatePaste template Self-hosted clipboard sync with an encrypted, searchable history; apps for Windows, macOS, Linux and Android. Image ghcr.io/dynamicsninja/privatepaste:0.2.0 (linux/amd64, linux/arm64). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01S7qnD4vNtkFtpTzPq1fw5R * chore(privatepaste): use image 0.3.1 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(phpmyadmin): migrate to the official phpMyAdmin Docker image (#1275) * fix(phpmyadmin): migrate to the official phpMyAdmin Docker image See: https://github.com/phpmyadmin/docker/issues/363 Signed-off-by: William Desportes <williamdes@wdes.fr> * fix(phpmyadmin): update phpMyAdmin to 5.2.3 Pin the official image to the current release instead of a floating reference. See: https://github.com/phpmyadmin/docker/issues/363 Signed-off-by: William Desportes <williamdes@wdes.fr> * fix(phpmyadmin): match meta.json version to the 5.2.3 image Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Signed-off-by: William Desportes <williamdes@wdes.fr> Co-authored-by: Mauricio Siu <siumauricio@icloud.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * Legejo: update to 1.33.0 (#1273) Co-authored-by: Markus Rådberg <3110202+jularboolean@users.noreply.github.com> * Add Uptime kotlin template (#1272) * feat: add Uptime Kotlin Docker Compose setup * fix: remove default timezone setting from Docker Compose * fix: update Docker Compose configuration for uptime-kotlin service * feat: add mcpspan template (#1270) * feat: add mcpspan template * chore(mcpspan): update to 0.13.0, with the dashboard's address for MCP clients signing in * fix(junctio): update image to 0.2.6 (#1269) * fix(junctio): update image to 0.2.5 * fix(junctio): update image to 0.2.6 * feat: add PostgreSQL with 80+ extensions (postgres-extensor) template (#1267) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(yuvomi): bump to 2.80.0 and generate DB_ENCRYPTION_KEY (#1266) Co-authored-by: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Co-authored-by: Ulas Kalayci <ulas.kalayci@icloud.com> * feat: add OpenTodo template (#1265) * feat: add OpenTodo template * OpenTodo: update to 0.12.0 * OpenTodo 0.13.0 * fix(ponos): update template to 0.2.0 and move to the hermez-agency image (#1263) * Add Reelsaw template (#1262) Signed-off-by: dillonstreator <dillonstreator@gmail.com> * feat(blueprints): add maintenant template (#1261) * fix(docuseal): correct PostgreSQL 18 volume mount (#1290) * feat(blueprints): add Zeqqat template (#1288) * feat(umami): bump to 3.4.1 (#1287) * feat(umami): bump to 3.4.1 * feat(umami): bump to 3.4.1 * feat(privatepaste): bump to 0.5.0 (#1286) * feat(privatepaste): bump to 0.5.0 * feat(privatepaste): bump to 0.5.0 * feat(privatepaste): bump to 0.5.0 * fix(libredb-studio): update the blueprint to 1.2.0 (#1283) * chore(libredb-studio): bump image to 1.2.0 * fix(libredb-studio): set version to 1.2.0 and update the engine counts meta.json still pinned 1.0.0 while docker-compose.yml pulls 1.2.0, which the blueprint rules require to match. The description also carried the 0.18.2 driver and engine counts; 1.2.0 ships 42 drivers reaching 69 named engines. * Update OpenTodo to 0.19.0 (#1281) * feat(blueprints): add itsaplan template (#1282) * Add Calnode template (#1280) * feat: add calnode template * feat: add commas to fix template * feat: replace logo * fix: add url prefix * fix: Remove default value for litestream url when unconfigured * fix(calnode): pin the exact 0.12.0 tag instead of the moving 0.12 tag Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Mauricio Siu <siumauricio@icloud.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * feat: add Customermates template (#1279) Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com> * feat: update openwa template to 0.25.0 (#1260) * feat(openwa): bump template to 0.25.0 - Update OpenWA image to 0.25.0 - Add 75s stop grace period for the longer bounded teardown * feat(openwa): enable the MCP server by default - Add mcp_enabled and mcp_readonly template variables - Pass MCP_ENABLED and MCP_READONLY to the container - Keep the read-only tool tier as the safe default * feat(openwa): enable Swagger UI by default Add an enable_swagger variable, wired to ENABLE_SWAGGER, so /api/docs is served despite the upstream production default. * chore: update the dossier version and disable germany's BA (#1258) * chore: update the dossier version and disable germany's BA * fix(dossier): match meta.json version to the v1.9.0 image Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Mauricio Siu <siumauricio@icloud.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * Add Container Monitoring template (cAdvisor, Prometheus, Grafana) (#1257) * Add container-monitoring template * Default container detail dashboard to a single container * Update SolidPing to 0.41.0 (#1256) * feat: update appwrite template to 2.7.0 (#1259) * feat(appwrite): bump template to 2.6.1 - Update appwrite/appwrite images to 2.6.1 and console to 1.2.97 - Add ExifTool service for image metadata stripping - Add S3 path-style, VCS Entire, and maintenance queue variables - Add maintenance scheduler interval and worker pool sizing - Harden healthcheck with readiness marker and raise PostgreSQL shm - Bump orchestrator to 2.2.4 - Remove duplicate _APP_CONSOLE_HOSTNAMES entry * feat(appwrite): bump template to 2.6.2 * fix(appwrite): keep wildcard routers below console Dokploy generates the console/API routers without a priority, so Traefik falls back to rule length. A Sites/Functions HostRegexp rooted at the apex also matches the console host and is longer, so it 404s the console. The generated router names include a per-domain serial, so the template cannot set their priority. Pin the template-owned wildcard routers to the lowest priority instead, for both web and websecure. * feat(appwrite): bump template to 2.7.0 - appwrite/appwrite 2.6.2 -> 2.7.0 across all services - Console 1.2.108 -> 1.2.138 (and fix VITE_APPWRITE_VERSION default) - browser 0.3.8 -> 0.3.10 - orchestrator 2.2.4 -> 4.0.0 - add server key rotation vars (V2, CURRENT, OLDEST) - add realtime limits, DNS_EXTERNAL, ALLOWED_INTERNAL_ADDRESSES, DB_MAX_CONNECTIONS - add alert config, APNs push and DOMAIN_FUNCTIONS_FALLBACK - add the optional appwrite-hansi code review service - raise worker max coroutines from 79 to 83 * fix(appwrite): ship the reviews worker disabled by default The self-hosted console profile keeps features.reviews off, so the Reviews screen only shows up behind the internal debug flag. Running appwrite-hansi without it means a container that cannot be configured from the UI, so keep the service and its _APP_REVIEWS_* variables commented out and document the three steps to opt in. * Update Uptime Kuma image to 'next' version (#1264) * Update Uptime Kuma image to 'next' version Uptime Kuma "latest" status is stuck at older version and the official resource recommends to use the "next" tag to get the latest version. * fix(uptime-kuma): pin 2.5.8 instead of the moving next tag Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Mauricio Siu <siumauricio@icloud.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * feat: add Puppetflow with Postgres template (#1271) * feat: add Puppetflow with Postgres template * chore: bump Puppetflow templates to v2026.10.25 * feat: add second Puppetflow queue worker * fix: send Puppetflow logs to stderr * fix: harden Puppetflow Dokploy deployments * fix: keep Dokploy default certificate handling * fix: use Dokploy default HTTP domains * chore: bump Puppetflow templates to v2026.10.26 * fix: configure Puppetflow locale and connection timeout * chore: bump Puppetflow templates to v2026.10.27 * chore: bump Puppetflow templates to v2026.10.28 * chore: bump Puppetflow templates to v2026.10.29 * chore: bump Puppetflow templates to 2026.10.30 * chore: bump Puppetflow templates to 2026.10.32 * fix: align Pinokio production browser config * chore: bump Puppetflow templates to v2026.11.1 * chore: bump Puppetflow templates to v2026.11.3 * chore: bump Puppetflow templates to v2026.11.4 * chore: bump Puppetflow templates to v2026.11.5 * chore: bump Puppetflow templates to v2026.11.6 * chore: bump Puppetflow templates to v2026.11.7 * fix(puppetflow): use service names instead of container_name Templates must not set container_name; Compose service names already resolve inside the project, so REDIS_HOST, PINOKIO_HOST, DB_HOST and the internal URLs now point at them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(puppetflow): pinokio has no v2026.11.7 image, use v2026.11.1 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Mauricio Siu <siumauricio@icloud.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * Update NaviMusic to version 4.3.0 (#1285) * fix(navi-music): update to version 4.3.0 * feat(navi-music): update entrypoint for improved startup behavior * fix(navi-music): pin yt-cipher by digest (it only publishes a moving master tag) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Mauricio Siu <siumauricio@icloud.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * chore: update Windshift to v0.9.3 (#1254) * chore: update Windshift to v0.9.1 * chore: update Windshift to v0.9.3 Point the blueprint at the current release instead of v0.9.1. * fix: updates actions runner to 2.338.2 and maintained Node24 (#1255) * fix: updates actions runner and selects maintained node runtime * fix: updates actions runner to 2.338.2 * Add ShopNex (#1284) * Add ShopNex template * fix(shopnex): pin v0.13.1 instead of latest Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Mauricio Siu <siumauricio@icloud.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * Bump Dagu to 2.25.4 (#1293) The template pins 2.10.7, which is fifteen minor releases behind the current Dagu release. The compose file, basic auth variables, volume, and port are unchanged and still valid on 2.25.4. * Add kortix deployment to the list of templates (#1294) * feat: upgrade Seafile template to 14.0 (#1251) * feat: upgrade Seafile template to 14.0 * fix(seafile): pin seafile-mc 14.0.9 and sdoc-server 2.0.11 instead of moving -latest tags Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Mauricio Siu <siumauricio@icloud.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * feat(blueprints): add CakePHP 5 template (#1291) * feat(blueprints): add CakePHP 5 template (themusicdev/php-apache runtime + MariaDB) * ci: re-trigger build preview (first run hit a transient npm registry failure) * fix(blueprints/cakephp): env via [config.env] names; pin image to released 1.0.0 (review feedback) --------- Signed-off-by: William Desportes <williamdes@wdes.fr> Signed-off-by: dillonstreator <dillonstreator@gmail.com> Co-authored-by: Khiet Tam Nguyen <86177399+nktnet1@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: Madhav Gupta <114633095+M4dhav@users.noreply.github.com> Co-authored-by: Félicio de SOUZA <feliciodsa.dev@gmail.com> Co-authored-by: Ivan Ficko <ivan.ficko@outlook.com> Co-authored-by: William Desportes <williamdes@wdes.fr> Co-authored-by: Jularbool <markus@radberg.org> Co-authored-by: Markus Rådberg <3110202+jularboolean@users.noreply.github.com> Co-authored-by: Théo Meunier <62860058+TheoMeunier@users.noreply.github.com> Co-authored-by: Kacper <kcprzaton@gmail.com> Co-authored-by: Web Artisan <ad4ptec@gmail.com> Co-authored-by: Jose Garcia <47431411+ruxwez@users.noreply.github.com> Co-authored-by: Ulaş Kalaycı <108589275+ulsklyc@users.noreply.github.com> Co-authored-by: Ulas Kalayci <ulas.kalayci@icloud.com> Co-authored-by: Raffaele Pizzari <raffaele.pizzari@gmail.com> Co-authored-by: Cardona <18017015+SalvadorCardona@users.noreply.github.com> Co-authored-by: dillonstreator <dillonstreator@gmail.com> Co-authored-by: Benjamin Touchard <benjamin@kolapsis.com> Co-authored-by: JRK <jessym.reziga@gmail.com> Co-authored-by: Perminus Gaita <35493600+Perminus-Gaita@users.noreply.github.com> Co-authored-by: Lezetho <126505858+lezetho@users.noreply.github.com> Co-authored-by: Yusuf Gündoğdu <yusufgundogdu555@gmail.com> Co-authored-by: Waleed <waleedi825@gmail.com> Co-authored-by: Benjamin Wagner <72468969+benjiwagner@users.noreply.github.com> Co-authored-by: Carlos Dorneles <duducp2013@gmail.com> Co-authored-by: Alien <hi@aien.me> Co-authored-by: Ghazi Ben Dahmane <ghazi.ben.dahmane@gmail.com> Co-authored-by: Florent Clairambault <florent.clairambault@gmail.com> Co-authored-by: Thet Hmuu <thethmuueinsoe@gmail.com> Co-authored-by: Andre Carbajal Vargas <carbajalvargasandre@gmail.com> Co-authored-by: Stefan Ernst <ernst.stefan@icloud.com> Co-authored-by: Noah <70114451+zFl4wless@users.noreply.github.com> Co-authored-by: ArseniyDev <41956571+ArseniyX@users.noreply.github.com> Co-authored-by: Yota Hamada <yohamta@gmail.com> Co-authored-by: Kortix SEO <347261315+Kortix-seo@users.noreply.github.com> Co-authored-by: Angel S. Moreno <angelxmoreno@gmail.com>
Dokploy Open Source Templates
This is the official repository for the Dokploy Open Source Templates.
How to add a new template
- Fork the repository
- Create a new branch
- Add the template to the
blueprintsfolder (docker-compose.yml,template.toml) - Add the template metadata (name, description, version, logo, links, tags) in a
meta.jsonfile inside your template folder (blueprints/<id>/meta.json) — do NOT create or edit a root-levelmeta.json, it is generated at build time - Add the logo to the template folder
- Commit and push your changes
- Create a pull request (PR)
- Every PR will automatically deploy a preview of the template to Dokploy.
- if anyone want to test the template before merging it, you can enter to the preview URL in the PR description, and search the template, click on the Template Card, scroll down and then copy the BASE64 value, and paste in the advanced section of your compose service, in the Import section or optional you can use the preview URL and paste in the BASE URL when creating a template.
Optional
If you want to run the project locally, you can run the project with the following command:
cd app
pnpm install
pnpm run dev
go to http://localhost:5173/
Example
Let's suppose you want to add the Grafana template to the repository.
- Create a new folder inside the
blueprintsfolder namedgrafana - Add the
docker-compose.ymlfile to the folder
services:
grafana:
image: grafana/grafana-enterprise:9.5.20
restart: unless-stopped
volumes:
- grafana-storage:/var/lib/grafana
volumes:
grafana-storage: {}
- Add the
template.tomlfile to the folder, this is where we specify the domains, mounts and env variables, to understand more the structure oftemplate.tomlyou can read here Template.toml structure
[variables]
main_domain = "${domain}"
[config]
[[config.domains]]
serviceName = "grafana"
port = 3000
host = "${main_domain}"
[config.env]
[[config.mounts]]
- Add the meta information in
blueprints/<id>/meta.json(a single JSON object; the rootmeta.jsonis generated automatically at build time)
{
"id": "grafana",
"name": "Grafana",
"version": "9.5.20",
"description": "Grafana is an open source platform for data visualization and monitoring.",
"logo": "grafana.svg",
"links": {
"github": "https://github.com/grafana/grafana",
"website": "https://grafana.com/",
"docs": "https://grafana.com/docs/"
},
"tags": [
"monitoring"
]
},
- Add the logo to the folder
- Commit and push your changes
- Create a pull request
Template.toml structure
Dokploy use a defined structure for the template.toml file, we have 4 sections available:
variables: This is where we define the variables that will be used in thedomains,envandmountssections.domains: This is where we define the configuration for the template.env: This is where we define the environment variables for the template.mounts: This is where we define the mounts for the template.
- The
variables(Optional)structure is the following:
[variables]
main_domain = "${domain}"
my_domain = "https://my-domain.com"
my_password = "${password:32}"
any_helper = "${you-can-use-any-helper}"
- The
configstructure is the following:
[config]
# Optional sections below
[[config.domains]]
serviceName = "grafana" # Required
port = 3000 # Required
host = "${main_domain}" # Required
path = "/" # Optional
env = [
"AP_HOST=${main_domain}",
"AP_API_KEY=${api_key}",
"AP_ENCRYPTION_KEY=${encryption_key}",
"AP_JWT_SECRET=${jwt_secret}",
"AP_POSTGRES_PASSWORD=${postgres_password}"
]
[[config.mounts]]
filePath = "/content/file.txt"
content = """
My content
"""
Important: you can reference any variable in the domains, env and mounts sections. just use the ${variable_name} syntax, in the case you don't want to define a variable, you can use the domain, base64, password, hash, uuid, randomPort, timestamp, jwt, email, or username helpers.
Helpers
We have a few helpers that are very common when creating a template, these are:
domain: This is a helper that will generate a random domain for the template.base64 or base64:length: This is a helper that will encode a string to base64 (lenght is the number of bytes to encode not the encoded string length).password or password:length: This is a helper that will generate a random password for the template.hash or hash:length: This is a helper that will generate a hash for the templateuuid: This is a helper that will generate a uuid for the template.randomPort: This is a helper that will generate a random port for the template.email: This is a helper that will generate a random email for the template.username: This is a helper that will generate a random username in lowercase for the template.timestamp: This is a helper that will generate a timestamp for "now" in milli-second.timestampms or timestampms:datetime: This is a helper that will generate a timestamp in milli-seconds.timestamps or timestamps:datetime: This is a helper that will generate a timestamp in seconds.datetimeparameter fortimestamps/timestampmshelpers must be a valid value for javascript new Date() (ie:timestamps:2030-01-01T00:00:00Z)
jwt: This is a helper that will generate a jwt for the template.jwt:length: will generate a random hex string of bytes length. This should not be used in newer templatesjwt:secret_var_name: will generate a jwt with some default values, secret var name should be the name of the variable holding the secretjwt:secret_var_name:payload_var_name: is the same as above but you can pass partial or full payload for the jwt. Here's a full example[variables] main_domain = "${domain}" mysecret = "cQsdycq1hDLopQonF6jUTqgQc5WEZTwWLL02J6XJ" mypayload = """ { "role": "jwt-tester", "iss": "dokploy-templates", "exp": ${timestamps:2030-01-01T00:00:00Z} } """ jwt = "${jwt:mysecret:mypayload}"
General Requirements when creating a template
- Don't use this way in your docker compose file:
services:
grafana:
image: grafana/grafana-enterprise:9.5.20
restart: unless-stopped
ports:
- 3000:3000
# Instead use this way:
expose:
- 3000
- Don't use this way in your template.toml file, make sure to use the same service name as the one in the docker compose file:
[config]
[[config.domains]]
serviceName = "MyGrafanaService"
# Instead use this way:
serviceName = "grafana" # Make sure to use the same service name as the one in the docker compose file
- Don't use container_name in your docker compose file, make sure to use the same service name as the one in the template.toml file:
services:
grafana:
container_name: grafana # ❌ Remove this
- Don't use dokploy-network in your docker compose file, by default all the templates have this flag enabled https://docs.dokploy.com/docs/core/docker-compose/utilities#isolated-deployments, so by default they have a internal network created, so you don't need to create a new one or use the dokploy-network name.
services:
grafana:
networks:
- dokploy-network # ❌ Remove this or any other network defined
- Please before submit a PR, make sure to test the template in your instance, so the maintainers don't spend time trying to figure out what's wrong.
- Everytime you submit a PR, it will display a Preview Link.
- Enter to the Preview Link and search the template you've submitted.
- Click on the Template Card, and click the Copy Button in the Base64 Configuration.
- Go to your instance, create a new Compose Service, go to Advanced Section -> Scroll Down -> Import Section -> Paste the Base64 Value -> Click on the Import Button
- If everything is correct and set, you should see a modal with all the details (Compose File, Environment Variables, Mounts, Domains, etc)
- Now you can click on the Deploy Button and wait for the deployment to finish, and try to access to the service, if everything is correct you should access to the service and see the template working.
Each template's metadata lives in blueprints/<id>/meta.json; the global meta.json is generated at build time. Use node build-scripts/generate-meta.js --check to validate all template metadata.