Compare commits

...
473 Commits
Author SHA1 Message Date
+28 b373a6b7c5 New Version (#1295)
* 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>
2026-11-05 10:20:57 +01:00
Mauricio SiuandGitHub cfce6b69d1 Merge pull request #1253 from Dokploy/canary
New version
2026-10-20 23:26:53 -06:00
hanshs474andGitHub e44418a2fc feat: add Seedance 2.5 Video Generator (emaki) template (#1229)
* add emaki-video-starter docker-compose.yml

* add emaki-video-starter template.toml

* add emaki-video-starter meta.json

* add emaki-video-starter emaki-video-starter.png
2026-10-20 19:58:37 -06:00
9a61776e91 fix(libredb-studio): update image to 1.0.0 (#1230)
* libredb-studio: bump to 1.0.0

* fix(libredb-studio): match meta.json version to the 1.0.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>
2026-10-20 19:58:33 -06:00
f9dd6e28ba feat: add Falco template (#1236)
* feat: add Falco template

* fix: verify Falco template in Dokploy

* fix: make Telegram optional in Falco template

* fix(falco): default MONITORED_HOST so the template deploys out of the box

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>
2026-10-20 19:58:31 -06:00
089933f619 feat: add Legejo template (#1233)
* feat: add Legejo template

* feat(legejo): pass the whole environment and list the optional variables

---------

Co-authored-by: Markus Rådberg <3110202+jularboolean@users.noreply.github.com>
2026-10-20 19:55:31 -06:00
Benjamin NussbaumandGitHub 98799bc962 feat(blueprint): update trmnl-larapaper template (#1235) 2026-10-20 19:53:53 -06:00
NoahandGitHub d89d479bb5 feat: adds GitHub Actions runner template (#1234) 2026-10-20 19:53:05 -06:00
Brahim RizqandGitHub 0de3c52420 feat: add Shoutrrr social media scheduler template (#1238)
* feat: add Shoutrrr social media scheduler template

* docs: record Shoutrrr deployment verification

* docs: clarify Shoutrrr health checks and polling units
2026-10-20 19:50:06 -06:00
38caad0c5d feat: add Dossier template (#1240)
* feat: add Dossier template

* docs: note Dossier dashboard timezone limitation

* fix(dossier): derive the password hash at startup so the template deploys

DOSSIER_PASSWORD must be an argon2id hash and the template shipped it empty
behind a :? guard, so the deploy always failed. The template now generates
DOSSIER_ADMIN_PASSWORD and the container hashes it with the bundled
hash-password tool before starting; a user-provided DOSSIER_PASSWORD hash
still takes precedence.

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>
2026-10-20 19:47:55 -06:00
Brahim RizqandGitHub ac9a28da53 feat: add TryPost social media scheduler template (#1239)
* feat: add TryPost social media scheduler template

* docs: record TryPost deployment and integration tests
2026-10-20 19:42:51 -06:00
Brahim RizqandGitHub 4b8900972c feat: add WUD monitoring template (#1242)
* feat: add WUD monitoring template

* feat(wud): exclude Dokploy infrastructure by default
2026-10-20 19:31:33 -06:00
58c610dbbe feat: add 3Dokploy template (#1243)
3Dokploy is a live, read-only, isometric 3D view of the Dokploy it runs
on: projects as buildings, services as racks, deploys on carts.

Claude-Session: https://claude.ai/code/session_01KxDD5rKN6o74v1MFAaGiMe

Co-authored-by: suleyman <24796754+suleyman@users.noreply.github.com>
2026-10-20 19:31:28 -06:00
276fe60979 fix(convex): GHCR image path and bump version (#1245)
* fix(convex): update GHCR image path from get-convex to convex & bump convex version

* fix(convex): set meta version to the pinned image commit

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>
2026-10-20 19:29:41 -06:00
Victor LunaandGitHub 1153a9094d Add kuukura template (self-hosted secrets vault) (#1250)
Signed-off-by: Victor Luna <victor.luna.mullisaca@gmail.com>
2026-10-20 19:29:37 -06:00
Angel S. MorenoandGitHub 9663d868a6 feat: add Cypht template (#1244)
Add Cypht 2.13.0 webmail aggregator with MariaDB for accounts and settings and Redis for sessions and cache.
2026-10-20 19:29:08 -06:00
8ce3d7f453 feat: add Harbor 2.15.4 template with Trivy (#1249)
* feat: add standalone Harbor initialization source

* feat: add Harbor Dokploy blueprint and validation

* docs: record GitHub publication and remote build validation

* chore: scope Harbor contribution for upstream review

* chore(harbor): keep the PR inside blueprints/

Drop the repo-level validate-harbor workflow and the .gitignore entry; the
blueprint's own tools/ and tests/ still document how it was validated.

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>
2026-10-20 19:29:05 -06:00
Khiet Tam NguyenandGitHub 2dbd7aa550 feat(blueprint): add template for eclipse mosquitto MQTT broker (#1247)
* feat(blueprint): add template for eclipse mosquitto MQTT broker

* fix: safely regenerate Mosquitto password file on startup
2026-10-20 19:29:00 -06:00
Khiet Tam NguyenandGitHub a69580f988 feat: add HiveMQ Community Edition broker blueprint (#1248)
* feat: add HiveMQ Community Edition broker blueprint

* refactor: mount HiveMQ CE initialization script

* fix: eliminate HiveMQ CE configuration warnings
2026-10-20 19:22:09 -06:00
eaa6b986a7 fix(wise-mcp): pin image to 1.1.1 instead of latest (#1227)
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 13:26:12 -06:00
Narciso E. Núñez AriasandGitHub 769f9661bc fix(deps): bump source-map-js to 1.2.2 (Dependabot alert #67) (#1228) 2026-10-15 11:25:32 -06:00
9453dcad98 UptimeKit Compose Fixes (#1209)
* fix: remove status-page, no longer in use

* chore: remove unused domain (status-page removed)

* fix(uptimekit): pin dash 5.2.1 and clickhouse 26.8-alpine instead of latest

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(uptimekit): select the bundled ClickHouse as time-series backend

UptimeKit 5.x defaults TIMESERIES_BACKEND to timescale, which needs the
TimescaleDB extension that postgres:18-alpine doesn't ship, so dash
crash-looped. The template already bundles ClickHouse.

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>
2026-10-15 10:32:52 -06:00
8aaa93c6fb fix(senddock): report the floating image tag in template metadata (#1213)
* fix(senddock): report the floating image tag in template metadata

The compose file tracks ghcr.io/arkhe-systems/senddock:latest, but meta.json still
named 0.8.0 as the version. Nothing derives that field from the image, so the gallery
badge and the softwareVersion in the page metadata froze at 0.8.0 while a fresh
install already pulled 0.8.3, which reads as a template shipping a release with
defects that were fixed since.

Declaring latest matches what the other blueprints do when the image is not pinned to
a fixed tag, and it cannot drift again on the next release.

* fix(senddock): pin image to 0.8.3 and report that version

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>
2026-10-15 10:14:26 -06:00
Alexandru PopaandGitHub 97622faedf feat: add Wise MCP template (#1220)
* feat: add Wise MCP template

* chore(wise-mcp): bump to 1.1.0

* chore(wise-mcp): use the latest image tag
2026-10-15 10:12:44 -06:00
d7b7097fdc libredb-studio: bump version to 0.18.2 (#1210)
0.18.1 fixes GHSA-jwvh-6phv-j9jh, whose affected range this blueprint was
squarely inside: it sets STORAGE_PROVIDER=sqlite, and the advisory covers
every release from 0.8.0 through 0.18.0 on a server store.

The blueprint also seeds two accounts, admin and user. Where those two go
to different people who share a browser profile, that is the shape the
defect needs: the second to sign in received the first one's browser copy
of the workspace, with its saved connection passwords and its query
history. Both passwords come from this template's own generated secrets,
so by default the two logins belong to one deployer and nothing crosses a
privacy boundary; it is handing USER_PASSWORD to someone else that opens
it.

0.18.2 then adds a run of fixes across the PostgreSQL family, the
wire-compatible engines, MySQL, MongoDB, Redis and Oracle.

meta.json also said twenty-six drivers. Databend became a connection type
of its own in 0.18.1, where it had been reached as a relative of the MySQL
type, so the count is twenty-seven. The fifty-four named engines are
unchanged, because Databend only moved from one side of that sum to the
other.

One line is added beside the bump, because testing the upgrade turned up a
lockout the blueprint could not recover from. Since 0.18.0 ADMIN_PASSWORD
seeds the account table only while it is empty, so an operator who edits
it in Dokploy's Environment panel gets 401 on the new password while the
old one, which the panel no longer shows, still works. The app logs the
way out, "set ADMIN_PASSWORD_RESET=true and restart", but the compose
environment list is an allowlist: typing that variable into the same panel
never reached the container, so the advice could not be followed without
editing the blueprint itself. ADMIN_PASSWORD_RESET is now passed through
with an empty default. Measured on 0.18.2 with this file: empty leaves the
container with the variable defined and blank, both accounts sign in
normally and neither reset line appears in the log; with it set to true the
new password returns 200 and the old one 401; with the flag removed again
the new password keeps working. There is no USER equivalent in the
application, which the comment says, so that account is changed from
Studio's own Accounts screen.

Co-authored-by: yusuf-gundogdu <devgundogdu86@gmail.com>
2026-10-15 10:07:28 -06:00
8f816caa2f chore: remove duplicate appwrite-2 template (#1217)
* chore: remove duplicate appwrite-2 template (appwrite already provides this)

* chore: remove duplicate appwrite-2 template

The appwrite template is on 2.x (2.5.0 after #1215), so appwrite-2 is a
duplicate. The original removal was undone by a later merge of main.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com>
Co-authored-by: Mauricio Siu <siumauricio@icloud.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 10:05:06 -06:00
061c975a1c feat: update appwrite template to 2.5.0 with MariaDB, node-24/26, console domain (#1215)
* feat: update appwrite template to 2.4.0 with MariaDB, node-24/26, console domain

* feat: enable DocumentsDB and VectorsDB by default in appwrite 2.4.0 template

* feat: update appwrite template to 2.4.0 with MariaDB, node-24/26, console domain

* fix(appwrite): repair 2.4.0 template structure and console setup

- Restore [config] table so config.env/config.isolated parse correctly
  (the env block had been swallowed into config.mounts[0], leaving the
  deployment with no environment variables)
- Add missing mongo-entrypoint.sh mount so the mongodb service can start
- Remove the mariadb [[config.domains]] entry: it exposed the DB on
  main_domain and duplicated the appwrite-console route
- Route the dedicated console domain via config.domains and drop the
  broken HostRegexp Traefik labels; set _APP_CONSOLE_URL/HOSTNAMES
- Bump appwrite-console image to 1.2.55-self-hosted (2.4.0 console)
- Restore the pinned appwrite-builds volume name
- Drop the removed Appwrite Assistant env/service

* feat(appwrite): apply remaining 2.4.0 hardening (clickhouse logs, browser)

- ClickHouse: add the two 2.4.0 config mounts (clickhouse-config.xml for
  system-log retention, clickhouse-init.sh to backfill TTLs on existing
  tables) plus CLICKHOUSE_ALWAYS_RUN_INITDB_SCRIPTS=1; the files are
  generated via [[config.mounts]] and bind-mounted from ../files/
- Browser: bump appwrite/browser 0.3.4 -> 0.3.6, set ALLOWED_HOSTS=appwrite
  and public DNS resolvers to block SSRF to internal services
- Bump appwrite/geo 0.3.1 -> 0.3.2 (matches 2.4.0)

* feat(appwrite): bump template to 2.5.0

Update the Appwrite blueprint to the 2.5.0 release (published
2026-10-13), which only moves images with no new environment
variables:

- appwrite/appwrite 2.4.0 -> 2.5.0 across all services
- appwrite/new console 1.2.55-self-hosted -> 1.2.74-self-hosted
- openruntimes/executor 0.29.0 -> 1.1.2

Brings project passkeys, interval-based function schedules, and
runtime containers that survive executor restarts.

---------

Co-authored-by: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com>
2026-10-15 10:04:06 -06:00
Carlos DornelesandGitHub 4d4116312f feat: add OpenWA template (#1218)
* feat: add OpenWA template

* fix(openwa): load dashboard over plain HTTP via CSP_UPGRADE_INSECURE_REQUESTS
2026-10-15 09:55:15 -06:00
CardonaandGitHub e158e5d134 feat: add Ponos template (#1223) 2026-10-15 09:48:37 -06:00
273a36391d Update Umami to v3.4.0 and generate the database password (#1224)
* chore(umami): update to v3.4.0

* fix(umami): generate the database password instead of hardcoding "umami"

---------

Co-authored-by: Mauricio Siu <siumauricio@icloud.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 09:47:12 -06:00
Yash KumarandGitHub 084d1cb15f feat: template SEO titles and descriptions (#1212)
* feat: template SEO titles and descriptions

* feat: add configText for 55 templates

* feat: add newConfig flag to 55 templates
2026-10-15 09:44:11 -06:00
JOYBOY dyandGitHub 802f453b16 feat: add Cachkey template (#1225)
* feat: add Cachkey template

* fix(cachkey): name the public service after the template, env as array

* fix(cachkey): unique internal API service name, APP_URL note
2026-10-15 09:43:55 -06:00
Mauricio SiuandGitHub a0e70f95e7 Merge pull request #1221 from Dokploy/feat/wazuh-template
feat: add Wazuh template
2026-10-12 09:12:39 -06:00
Mauricio SiuandClaude Opus 5.5 7687957871 feat: add Wazuh template
Single-node Wazuh 4.14.8 (manager, indexer, dashboard) adapted from the
official wazuh-docker single-node setup:
- internal TLS PKI generated on first deploy by wazuh-certs-generator into a
  named volume (no host files)
- indexer internal users hashed from generated passwords before the security
  index is initialized; no default credentials
- dashboard served over HTTP behind Traefik on the template domain
- agent ports 1514/1515 published on the host (raw TCP, can't go through
  Traefik)

Closes #440

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 17:45:59 -06:00
Mauricio SiuandGitHub 62199f7d1e Merge pull request #1205 from Dokploy/canary
New Version
2026-10-07 21:12:57 -06:00
Mauricio SiuandGitHub 8986ec18a5 Merge pull request #1207 from Dokploy/feat/orbit-template
feat: add Orbit by Noveum (with storage fix)
2026-10-07 21:12:31 -06:00
Mauricio SiuandGitHub 4363ee8630 Merge pull request #1198 from duducp/feat/opendots-template
feat: add OpenDots template
2026-10-07 21:12:08 -06:00
Mauricio SiuandGitHub 796a9eb73b Merge pull request #1189 from ohemilyy/add-reloop-template
feat: add reloop template
2026-10-07 21:11:56 -06:00
Mauricio SiuandGitHub f8516ed065 Merge pull request #1206 from Dokploy/fix/toml4-and-dependabot-canary
fix: resolve dependabot alerts and make templates parse under toml 4 (canary)
2026-10-07 21:11:45 -06:00
Mauricio SiuandGitHub c28bfff733 Merge pull request #1197 from naveenrao2k/fix/kaneo-single-image
fix(kaneo): use single bundled image and require AUTH_SECRET
2026-10-07 21:11:20 -06:00
Mauricio SiuandGitHub ca2759228a Merge pull request #1190 from fdciabdul/patch-1
Use waxum latest tag instead of specific version
2026-10-07 21:11:10 -06:00
Mauricio SiuandGitHub 728bd6b869 Merge pull request #1186 from jr-k/feat/puppetflow-template
feat: add Puppetflow template
2026-10-07 21:10:46 -06:00
Mauricio SiuandGitHub 175fe77c43 Merge pull request #1187 from naimhasim/docktail
feat: add DockTail template
2026-10-07 21:10:25 -06:00
Mauricio SiuandGitHub 7d3ac4fa6d Merge pull request #1142 from nktnet1/drop-docker-compose-version-obsolete
fix: remove obsolete docker-compose version property
2026-10-07 21:10:02 -06:00
Mauricio SiuandGitHub 09b02a961e Merge pull request #1125 from nktnet1/airbyte
feat(blueprint): airbyte template v2 (no hardcoded networks aliases/IPs)
2026-10-07 21:09:51 -06:00
Mauricio SiuandGitHub 5f72171882 Merge pull request #1122 from gpiechnik2/add-heyo-docs-template
Add heyo docs template
2026-10-07 21:09:41 -06:00
Mauricio SiuandGitHub 4dcdd1f9b4 Merge pull request #1114 from GhaziBenDahmane/feat/azerothcore-template
feat: add AzerothCore and AzerothCore Portal templates
2026-10-07 21:09:31 -06:00
Mauricio SiuandGitHub ed2b6c5f6e Merge pull request #1086 from sapientorius/canary
Add Nebulynk Template
2026-10-07 21:09:21 -06:00
Mauricio SiuandClaude Opus 5.5 df3f70f568 fix(opendots): pin build context to an upstream commit
Build from CopilotKit/OpenDots commit 625452e (package.json 0.1.0, upstream has
no tags yet) instead of the moving main branch, and set meta.json version to
0.1.0-625452e instead of "latest".

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 20:54:46 -06:00
Mauricio SiuandClaude Opus 5.5 03cede076e fix(docktail): bundle a tailscaled sidecar instead of the host socket
The template mounted the host's /var/run/tailscale, which does not exist on a
standard Dokploy server, so DockTail could never reach tailscaled. Use the
upstream sidecar setup: a pinned tailscale/tailscale container (userspace
networking, state and socket in named volumes) authenticated with
TAILSCALE_AUTH_KEY, sharing its socket with DockTail.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 20:49:45 -06:00
Mauricio SiuandClaude Opus 5.5 d8087ee88a Merge canary and drop the obsolete version key from new templates
Resolves the conflicts with canary and removes the top-level version key from
the templates added since this PR was opened.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 20:44:18 -06:00
3b9cbec16e fix: resolve dependabot alerts and make templates parse under toml 4 (canary)
Port of #1191 (which targets main) onto canary:
- app/ and build-scripts/ dependency bumps from #1191
- signoz, timescaledb, valkey template.toml fixes from #1191
- supabase: kept canary's version (already parses under toml 4 after #1131/#1149)
- appwrite-2 (merged after #1191 was opened): escape the backslash in the
  mongo entrypoint (\! -> \\!), which toml 4 rejects as an invalid escape

All 559 blueprints/*/template.toml parse with toml@4.2.0.

Co-authored-by: narcisonunez <narcisonunez@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 20:42:42 -06:00
Mauricio SiuandClaude Opus 5.5 533f2ae947 fix(heyo-docs): pin scaffolder and runtime package versions
create-heyo-docs@0.2.3 writes "@heyo-sh/heyo-docs": "latest", which now resolves
to 3.4.1 and no longer exports heyoDocs, so astro build fails. Scaffold with
create-heyo-docs@3.1.0, pin @heyo-sh/heyo-docs@3.4.1, and set meta version.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 20:42:40 -06:00
Mauricio SiuandClaude Opus 5.5 250d10ff14 fix(airbyte): replace MinIO with SeaweedFS S3 storage
minio/minio images are no longer pullable. Run chrislusf/seaweedfs:4.48
as the 'minio' service with S3 on port 9000 and the same credentials, so
MINIO_ENDPOINT and the k3s ExternalName stay unchanged. Buckets are
created with weed shell in minio-init.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 20:42:12 -06:00
Mauricio SiuandClaude Opus 5.5 96731d0408 chore(azerothcore): drop the portal template, keep the base server
As offered by the author: the portal depends on a new, unpinned image of
the author's own; the base template uses only official images.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 20:37:25 -06:00
Mauricio SiuandClaude Opus 5.5 1392c62489 fix(nebulynk): build from the v0.7.1 tag instead of the moving stable branch
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 20:37:24 -06:00
Mauricio SiuandClaude Opus 5.5 055787adcc fix(reloop): pin images by digest instead of latest
reloopsh/* images only publish a moving 'latest' tag (fe-dashboard also has
commit tags, the rest don't), so every image is pinned to the digest of the
2026-10-06 build. meta.json version reflects that build date.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 20:36:58 -06:00
Mauricio SiuandClaude Opus 5.5 7b2830c8ff fix(kaneo): pin image to 2.35.0 instead of latest
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 20:34:58 -06:00
Mauricio SiuandClaude Opus 5.5 aa5ee57ff2 fix(waxum): pin image to 0.13.5 instead of latest
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 20:34:58 -06:00
Mauricio SiuandClaude Opus 5.5 96d258fd27 fix(puppetflow): match meta.json version to the v2026.10.20 images
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 20:34:57 -06:00
Mauricio SiuandGitHub 90b4fcd9c8 Merge pull request #1199 from Dokploy/dosu/doc-update-1198
docs: clarify image and version guidance for templates
2026-10-07 20:31:34 -06:00
Mauricio SiuandGitHub a31506f60a Merge pull request #1204 from Dokploy/fix/hydrodactyl-mariadb-tls
fix(hydrodactyl): MariaDB 11.4 with TLS, pin images, wait for db
2026-10-07 20:31:08 -06:00
Mauricio SiuandGitHub 55d12a54d7 Merge pull request #1203 from Dokploy/fix/feedbacks-bundled-s3
fix(feedbacks): bundle private S3 storage so the template deploys out of the box
2026-10-07 20:30:40 -06:00
Mauricio SiuandGitHub d572490c00 Merge pull request #1143 from nktnet1/elastic-search
feat(elasticsearch): update template to v9 with security
2026-10-07 20:30:23 -06:00
Mauricio SiuandGitHub ce32fae273 Merge pull request #1128 from moskoweb/9router
fix: harden and update 9router template
2026-10-07 20:30:15 -06:00
Mauricio SiuandGitHub 3adf3a0fcd Merge pull request #1138 from mrbobzar/canary
Added Pretix Templete
2026-10-07 20:30:06 -06:00
Mauricio SiuandGitHub 10b25f1a51 Merge pull request #1163 from duducp/update-authentik-2026-8-2
feat: update Authentik to 2026.8.2
2026-10-07 20:29:58 -06:00
Mauricio SiuandGitHub 92e0d238ff Merge pull request #1167 from duducp/feat/appwrite-2
feat: add Appwrite 2 template
2026-10-07 20:29:40 -06:00
Mauricio SiuandGitHub bf2947cacc Merge pull request #1173 from jr-k/patch-1
Fix Zitadel when behind a reverse proxy
2026-10-07 20:29:24 -06:00
Mauricio SiuandGitHub ff20013dd9 Merge pull request #1176 from drudge/sable
feat: Add sable template
2026-10-07 20:29:16 -06:00
Mauricio SiuandGitHub 354311df9f Merge pull request #1177 from Nargor/feat/add-mc-controller-template
feat: add MC Controller template
2026-10-07 20:28:53 -06:00
Mauricio SiuandGitHub 213a3142a9 Merge pull request #1179 from fincrawmcq/canary
feat: Fix Fluxer template
2026-10-07 20:28:39 -06:00
Mauricio SiuandClaude Opus 5.5 1d98aa17dd fix(hydrodactyl): MariaDB 11.4 with TLS, pin images, wait for db
The panel's mysql client requires TLS when loading the schema
("SSL is required, but the server does not support it") and MariaDB 10.11
doesn't offer it, so migrations failed and the panel returned 500. MariaDB
11.4 enables TLS by default. Also pin hydrodactyl to v6.4.1 and redis to
7-alpine, drop the MySQL-only auth flag and wait for a healthy database.

Verified on Dokploy: panel returns 200 «Hydrodactyl», database healthy.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 20:25:05 -06:00
Mauricio SiuandClaude Opus 5.5 ad464c371b fix(feedbacks): bundle private S3 storage so the template deploys out of the box
The template shipped every S3_* variable empty while the compose requires
them, so it could never deploy. Feedbacks needs an HTTPS S3 endpoint in
production: the template now ships SeaweedFS (minio images are no longer
pullable) with a self-signed cert generated on first start and trusted via
NODE_EXTRA_CA_CERTS, plus a one-shot bucket job. External S3 can still be
used by overriding S3_*. The image digest is pinned in the compose file.

Verified on Dokploy: feedbacks returns 200, all services healthy.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 20:24:23 -06:00
JRKandGitHub 6b382a33ad Update docker-compose.yml 2026-10-08 03:32:55 +02:00
Mauricio SiuandGitHub 4cc1cbbe77 Merge pull request #1194 from officialsuyogdixit/codex/add-feedbacks-template
Add Feedbacks template
2026-10-07 18:18:02 -06:00
Mauricio SiuandGitHub e38ef3abd5 Merge pull request #1171 from Furox-Art/add/versitygw
feat: add VersityGW template
2026-10-07 17:48:16 -06:00
Mauricio SiuandGitHub 4c4b8c6ac3 Merge pull request #1152 from bariscelik/inkvoice-0.3.0
chore(inkvoice): bump to 0.3.0 and cap memory at 512M
2026-10-07 17:42:57 -06:00
Mauricio SiuandGitHub fffa46deac Merge pull request #1182 from skender18/add-opencode
feat: add OpenCode template
2026-10-07 17:42:40 -06:00
Mauricio SiuandGitHub 1278af50b5 Merge pull request #1145 from guidoesser/add-prozesswerk-template
feat: add Prozesswerk template (text-to-BPMN, self-hosted)
2026-10-07 17:41:05 -06:00
Mauricio SiuandGitHub 816134d4d0 Merge pull request #1141 from yusuf-gundogdu/fix/libredb-studio-0.14.1
libredb-studio: bump version to 0.18.0, add a healthcheck and pass the generated secrets
2026-10-07 17:40:33 -06:00
Mauricio SiuandGitHub 34d9dca9ee Merge pull request #1149 from whollacsek/feat/supabase-sb-key-only-and-s3-backend
fix(supabase): make sb_-key-only mode work, and document the S3/R2 backend
2026-10-07 17:36:11 -06:00
Mauricio SiuandGitHub 5b41b6bbda Merge pull request #1170 from aindot/canary
New template: OpenProject 17
2026-10-07 17:34:14 -06:00
Mauricio SiuandGitHub a9061f61cf Merge pull request #1132 from ChiragAgg5k/appwrite-2.0.0
feat(appwrite): update template to 2.3.0
2026-10-07 17:32:58 -06:00
Mauricio SiuandClaude Opus 5.5 51910ed53a fix(elastic-search): drop memory_lock and give ES 1.5 GiB
With a 512m heap Elasticsearch 9 still uses ~1 GiB of anonymous memory
(direct buffers, metaspace, code cache, threads), so the 1 GiB
mem_limit got it SIGKILLed in a loop on the server (no shutdown log,
restart every ~1 min). bootstrap.memory_lock made it worse by pinning
pages. Remove memory_lock/memlock ulimits and raise ES_MEM_LIMIT to
1.5 GiB while keeping the heap at 512m.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 17:28:45 -06:00
Mauricio SiuandGitHub 7a594e8eb1 Merge pull request #1185 from fclairamb/add-solidping-template
Add SolidPing template
2026-10-07 17:26:53 -06:00
Mauricio SiuandGitHub 5e4eb93f6b Merge pull request #1155 from vitabaks/autobase-2-11
Update Autobase to version 2.11
2026-10-07 17:26:41 -06:00
Mauricio SiuandGitHub cae917a8fd feat: add OpenLivery multi-client WhatsApp agent template (#1140)
* feat: add OpenLivery template

* Use canonical self-hosting documentation link
2026-10-07 17:26:25 -06:00
Mauricio SiuandGitHub 3d7dbc0f70 Merge pull request #1136 from xob0t/feat/hyperdx-template
feat: add HyperDX template
2026-10-07 17:25:48 -06:00
Mauricio SiuandGitHub ab35b586e1 Merge pull request #1133 from jdjimenez2312/update-gitea-1.27.3
fix: update Gitea with PostgreSQL blueprint template whit 1.27.3 version
2026-10-07 17:25:39 -06:00
Mauricio SiuandGitHub dae4af28be Merge pull request #1148 from kacperwyczawski/canary
feat: update seafile to 13.0
2026-10-07 17:22:49 -06:00
Mauricio SiuandGitHub c77bd2ca70 Merge pull request #1175 from reynaldichernando/feat/corsfix-template
Add Corsfix template
2026-10-07 17:21:55 -06:00
Mauricio SiuandGitHub e3ead8bfa8 Merge pull request #1174 from grovs-io/add-grovs-template
feat: add Grovs template
2026-10-07 17:17:09 -06:00
Mauricio SiuandClaude Opus 5.5 b5196c49a4 fix(elastic-search): pin modest heap and disable ML
Set ES_JAVA_OPTS=-Xms512m -Xmx512m and xpack.ml.enabled=false so
Elasticsearch fits its 1 GiB mem_limit on small hosts, and give the
healthcheck a 120s start_period so a slow first boot does not abort
the depends_on chain.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 17:16:38 -06:00
Mauricio SiuandGitHub 60fb82046e Merge pull request #1165 from duducp/fix/metabase-v0.63.18
fix: update Metabase template to v0.63.18
2026-10-07 17:16:22 -06:00
Mauricio SiuandGitHub d93f17ed53 Merge pull request #1169 from DouglasAR01/patch-1
chore: Update BentoPDF template
2026-10-07 17:11:46 -06:00
Mauricio SiuandGitHub fad0db2689 Merge pull request #1153 from kacperwyczawski/feat/opencloud
feat: add OpenCloud template
2026-10-07 17:09:31 -06:00
Mauricio SiuandGitHub 9c2bfce278 Merge pull request #1157 from paulolinder/update-velix-api-v1.1.0
feat(velix-api): bump to v1.1.0
2026-10-07 17:09:17 -06:00
Mauricio SiuandGitHub a33ce26ace Merge pull request #1162 from lilsnibbi/feat/add-keyzori-template
feat: add Keyzori template
2026-10-07 17:09:01 -06:00
Mauricio SiuandGitHub 41841e1441 Merge pull request #1160 from manganate006/add-openlmnp
Add OpenLMNP template
2026-10-07 17:08:46 -06:00
Mauricio SiuandGitHub 446a0faece Merge pull request #1168 from k2so-dev/add-junctio-template
feat(template): add junctio
2026-10-07 16:59:59 -06:00
Mauricio SiuandClaude Opus 5.5 3fb632006a fix(orbit): give storage its own generated domain
"storage-${domain}" pushes the first DNS label of Dokploy's generated
sslip.io hosts past 63 characters, so the storage domain never resolves
and browser uploads can't reach it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 16:59:42 -06:00
xob0tandGitHub 56bfaea59e feat: add Graylog Open template (#1135) 2026-10-07 14:34:58 -06:00
Mauricio SiuandGitHub 9cbed1788e Merge pull request #1129 from moskoweb/obscura 2026-10-07 14:34:42 -06:00
Mauricio SiuandGitHub 7a41d04323 Merge pull request #1146 from Tekipeps/template/instatic 2026-10-07 14:32:19 -06:00
Mauricio SiuandGitHub a218ca579a Merge pull request #1151 from shivaansh74/feat/add-hydrodactyl-template 2026-10-07 14:32:01 -06:00
Mauricio SiuandGitHub 3b41a21613 Merge pull request #1154 from Windshiftapp/chore/windshift-v0.8.8 2026-10-07 14:31:44 -06:00
Mauricio SiuandGitHub 94e39254bf Merge pull request #1193 from phwizard/feat/ethora-core 2026-10-07 14:31:07 -06:00
Mauricio SiuandClaude Opus 5.5 cc9b579e05 fix(9router): probe 127.0.0.1 in healthcheck
localhost resolves to ::1 first in the image, but Next.js listens on IPv4
0.0.0.0 only, so the healthcheck always failed and Traefik never routed to
the unhealthy container (404).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 13:39:47 -06:00
Mauricio SiuandGitHub 736718b4ff Merge pull request #1130 from BryanFRD/add-lfsx
feat: add LFSX template
2026-10-07 13:34:00 -06:00
Mauricio SiuandGitHub 1373a7760b Merge pull request #1131 from whollacsek/feat/supabase-envoy-gateway
fix(supabase): move the API gateway to Envoy and close five parity gaps with official self-host
2026-10-07 13:33:42 -06:00
Mauricio SiuandGitHub 10fb6bacaf Merge pull request #1172 from ablause/feat/orca-server
feat: add Orca Server template
2026-10-07 13:27:16 -06:00
Mauricio SiuandGitHub a1f497250e Merge pull request #1184 from spacewaterbear/prefect-with-auth
feat: add auth to prefect
2026-10-07 13:27:02 -06:00
Mauricio SiuandClaude Opus 5.5 d98b63e309 fix(pretix): add postgres/redis, pin image, fix port and config
The standalone image was deployed with no database, no Redis and no config,
so celery fell back to amqp://guest@127.0.0.1:5672 and the web never came up
(502); the domain also pointed at port 3000 while the image serves on 80.
Pin pretix/standalone:2026.8.0, add postgres:16 and redis:7, configure
pretix via PRETIX_* env vars (url, secret, database, redis cache/sessions,
celery broker/backend, mail), route the domain to port 80, and set meta
version and tags.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 12:36:24 -06:00
Mauricio SiuandClaude Opus 5.5 b2bb06c8ee fix(sable): configurable DNS host port and pinned image
Host port 53 is usually already bound on Dokploy servers (systemd-resolved),
so publishing 53:8053 made the deploy fail. Publish DNS on SABLE_DNS_PORT
(default 1053; set to 53 once the host port is free) so the web console
works out of the box. Pin ghcr.io/drudge/sable to the 1.6.1 release.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 12:25:17 -06:00
Mauricio SiuandClaude Opus 5.5 f05bb6b377 fix(mc-controller): probe 127.0.0.1 in healthcheck
busybox wget resolves localhost to ::1 first, but Nitro listens on
0.0.0.0 (IPv4 only), so the healthcheck always failed. The container
never became healthy and Traefik never routed the domain (404).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 12:21:48 -06:00
Mauricio SiuandClaude Opus 5.5 4535080ff4 fix(fluxer): add required FLUXER_PROFILE_PSEUDONYM_SECRET
The fluxer v1 images now refuse to start in production without
FLUXER_PROFILE_PSEUDONYM_SECRET (api unhealthy, users-shard crash loop).
Generate it as a template variable and pass it to all services.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 12:20:27 -06:00
Mauricio SiuandClaude Opus 5.5 63b0eef948 fix(orbit): replace MinIO with SeaweedFS S3 storage
MinIO images on quay.io/Docker Hub are no longer publicly pullable, so the
deploy failed at image pull. Storage now runs SeaweedFS (S3 on port 9000,
credentials orbit/MINIO_PASSWORD) and the bucket service uses mc from the
orbit-bucket image to create orbit-uploads and set its CORS rule for the
app origin (browser presigned PUT uploads).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 12:19:35 -06:00
Mauricio SiuandClaude Opus 5.5 8a99147cc1 fix(authentik): start worker after server to avoid data volume copy-up race
server and worker both mount the fresh named volume "data" at /data. The image
ships /data/media as a symlink, and when both containers are created at the same
time Docker populates the volume twice and fails with
"failed to create symlink ... /data/media: file exists". Ordering the worker
after the server makes the first-time copy happen once.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 12:19:25 -06:00
Mauricio SiuandClaude Opus 5.5 c7ae79d3ad fix(appwrite-2): mount mongo init files from ../files
Dokploy writes [[config.mounts]] files to ../files/, not next to the
compose file. ./mongo-entrypoint.sh did not exist, so Docker created an
empty directory at /mongo-entrypoint.sh and bash exited 126.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 12:17:23 -06:00
Mauricio SiuandClaude Opus 5.5 5f937bd00e fix(zitadel): use literal "disabled" for tls_mode default
"${disabled}" is not a Dokploy helper, so ZITADEL_TLSMODE was not a valid
--tlsMode value and zitadel exited 1 on start. Default the variable to the
literal value "disabled" (users can switch it to "external" behind HTTPS).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 12:17:02 -06:00
Mauricio SiuandGitHub 97648ba37b Merge pull request #1202 from sipamungkas/main
feat: add databasement template
2026-10-07 11:08:40 -06:00
Mauricio SiuandGitHub cda0f75a16 Merge pull request #1192 from dseegers/activepieces-0-91-2
Update Active pieces 0.91.2
2026-10-07 11:08:29 -06:00
Mauricio SiuandGitHub 86861a7c95 Merge pull request #1196 from forrestzhang107/dexio
feat(template): add Dexio
2026-10-07 11:06:25 -06:00
Mauricio SiuandGitHub ac45a0c2db Merge pull request #1181 from tizianozonta/feat/healthchecks-template
feat: add Healthchecks template
2026-10-07 11:06:13 -06:00
Yusuf Gundogdu b5df69fddb libredb-studio: say "named engines" for the wire-compatible total
The product's own copy rule reads a numeral in front of a bare "engines" as the
count of drivers it ships, which is twenty-six. Fifty-four is the total once the
twenty-eight engines that speak an existing driver's wire protocol are counted,
so it needs the narrower noun the upstream README uses for the same figure.
2026-10-05 18:11:13 +03:00
Yusuf Gundogdu 51b419dc23 libredb-studio: pass the generated secrets to the container
Dokploy does not substitute variables in object items of an env array, so the
three [[config.env]] tables reached the container as literal ${...} and the app
started with empty ADMIN_PASSWORD, USER_PASSWORD and JWT_SECRET. The
[config.env] table form, which every other blueprint in this repo uses,
substitutes correctly. Same change as #1201.
2026-10-05 18:03:50 +03:00
Yusuf Gundogdu 386823709e libredb-studio: move to 0.18.0
0.18.0 is the current release. The description's engine count moves with it:
this release ships twenty-six drivers reaching fifty-four named engines,
where 0.17.0 reached forty-six.
2026-10-05 18:03:50 +03:00
Ragil Burhanudin Pamungkas 68e6a27ab1 fix: correct APP_DISPLAY_TIMEZONE variable in databasement template 2026-10-05 09:46:14 +07:00
Ragil Burhanudin Pamungkas 5efe1e1103 feat: add databasement template 2026-10-05 07:44:51 +07:00
dosubot[bot]andGitHub cbccbcdc39 docs: clarify image and version guidance for templates 2026-10-03 13:44:19 +00:00
Carlos Dorneles daeb5b4b8f feat: add OpenDots template
Adds the blueprints/opendots entry for CopilotKit/OpenDots. No official
image is published, so the compose builds both app and browser targets
from the upstream repo, exposes 4310 only, and persists /data. Secrets
(OWNER_TOKEN, BROWSER_SECRET) are generated per deploy; the browser runs
without a compose profile because Dokploy does not activate profiles.

🤖 Generated with Codebuff
Co-Authored-By: Codebuff <noreply@codebuff.com>
2026-10-03 10:32:25 -03:00
Yusuf Gündoğdu c1716ad72b libredb-studio: correct the engine count in the description 2026-10-02 17:00:43 +03:00
JRKandGitHub b88afd51fb bump 2026-10-02 00:39:32 +02:00
jr-k 242a33cdc7 chore(puppetflow): bump to v2026.9.39 2026-10-01 23:57:10 +02:00
JRKandGitHub 20b031224f bump 2026-10-01 23:44:24 +02:00
NaveenRao fd02137aaf fix(kaneo): use single bundled image and require AUTH_SECRET
Kaneo now ships web and API in one image (ghcr.io/usekaneo/kaneo,
API served under /api on port 5173). The old ghcr.io/usekaneo/api
image exits on start with "AUTH_SECRET is not set", so fresh
deployments of this template are broken.

- Replace backend/frontend services with the single kaneo service
- Set AUTH_SECRET and KANEO_CLIENT_URL; drop JWT_ACCESS and BACKEND_HOST
- Use one domain instead of separate frontend/backend domains
- Add healthchecks and wait for Postgres to be healthy
2026-10-01 21:10:31 +05:30
Forrest Zhang 5459883b47 feat(template): add Dexio (logo.svg) 2026-10-01 05:10:48 -07:00
Forrest Zhang 774850fc8c feat(template): add Dexio (meta.json) 2026-10-01 05:10:47 -07:00
Forrest Zhang e6c50bedcd feat(template): add Dexio (template.toml) 2026-10-01 05:10:46 -07:00
Forrest Zhang bd491662af feat(template): add Dexio (docker-compose.yml) 2026-10-01 05:10:45 -07:00
Suyog Dixit 6d276ca4a5 Add Feedbacks template 2026-10-01 12:10:25 +05:30
Forrest Zhang 1f1b900782 feat(template): add Dexio (logo.svg) 2026-09-30 10:04:20 -07:00
Forrest Zhang e0208cd9f3 feat(template): add Dexio (meta.json) 2026-09-30 10:04:19 -07:00
Forrest Zhang 63023253dd feat(template): add Dexio (template.toml) 2026-09-30 10:04:17 -07:00
Forrest Zhang da2bc238fa feat(template): add Dexio (docker-compose.yml) 2026-09-30 10:04:15 -07:00
Taras Filatov 444fa72771 feat: add Ethora Core template 2026-09-30 15:22:24 +01:00
Daan Seegers 44bceb5b64 update meta file for activepieces 2026-09-29 22:44:30 +02:00
Yusuf GUNDOGDU 0bf1113ad7 libredb-studio: refresh to 0.17.0 and correct the engine count
0.16.2 was current when this branch was last refreshed. The description also
said sixteen engines; 0.17.0 reaches eighteen, because Prometheus and Apache
Kafka were added since.
2026-09-29 23:20:34 +03:00
Daan Seegers 4af1d7b278 Update Active pieces 0.91.2 2026-09-29 22:17:58 +02:00
JRKandGitHub 46031f2518 bump 2026-09-29 21:41:18 +02:00
JRKandGitHub b8b6999707 bump 2026-09-29 13:25:41 +02:00
taqinandGitHub 49ab1b3d85 Use latest tag instead of specific version
Latest tag always has bug fix  without breaking change
2026-09-29 13:50:12 +07:00
JRKandGitHub 24ab6ce3f7 bump version 2026-09-29 04:35:28 +02:00
JRKandGitHub 99679eab51 bump version 2026-09-29 04:35:18 +02:00
Finley Crawford-McQuillanandGitHub e335d1b1a9 Merge pull request #1 from fincrawmcq/copilot/canary-fix-fluxer-template
Fixing Fluxer template issues and updating instructions
2026-09-28 18:40:36 +01:00
250d469f00 fix(fluxer): add valid fallback VAPID keys
Co-authored-by: fincrawmcq <173572131+fincrawmcq@users.noreply.github.com>
2026-09-28 17:36:16 +00:00
ohemilyy 24e0b49b68 feat: add reloop template 2026-09-27 14:20:42 -04:00
Naim Hasim 6460c55fb5 feat: add DockTail template 2026-09-28 00:10:00 +08:00
jr-k dda5fb1730 feat: add Puppetflow template 2026-09-27 02:34:21 +02:00
Florent ClairambaultandClaude Opus 4.8 55411395de Add SolidPing monitoring template
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-26 15:49:42 +02:00
spacewaterbear ca7959dad9 feat: add auth to prefect 2026-09-26 14:51:35 +02:00
Reynaldi Chernando 11089396dc fix: make Corsfix auth URL configurable 2026-09-26 14:03:32 +07:00
Alexander Zerling c07d622714 Update Docker Compose configurationfor Nebulynk. Added new transcription worker service which is new since version 0.7.0. 2026-09-25 22:40:50 +02:00
Chirag Aggarwal 32a7d0ac70 feat(appwrite): bump template to 2.3.0
Adds the appwrite-mqtt push broker (MQTT over WebSocket on mqtt.<domain>), replaces the removed _APP_CONSOLE_URL_SCHEME with _APP_CONSOLE_URL, adds _APP_PWNED_PASSWORDS_DSN, and moves the console to 1.1.159, orchestrator to 2.2.2 and autogravity to 0.0.11 to match the stock 2.3.0 installer.
2026-09-25 19:28:20 +01:00
Chirag Aggarwal c8df2286f9 fix(appwrite): opt out of isolated deployment so build jobs can reach the API
Dokploy v0.29.3 to v0.29.13 deploys templates with isolated deployment on unless the template sets isolated = false (older releases always isolate, v0.29.14+ never does by default). That mode attaches every service to an external <appName> network and never creates <appName>_default, so the orchestrator starts build jobs on a network that does not exist and the executor puts runtimes on a network of its own. The orchestrator cannot create or join networks itself, and the repo validator rejects a networks section, so the template opts out of isolation to keep the default network every service shares.
2026-09-25 19:28:20 +01:00
Carlos Dorneles 235acdea23 feat(appwrite-2): update to Appwrite 2.3.0
- Bump appwrite/appwrite to 2.3.0, console to 1.1.159, autogravity to 0.0.11
- Replace _APP_CONSOLE_URL_SCHEME with _APP_CONSOLE_URL (removed in 2.3.0)
- Add appwrite-mqtt service with MQTT envs (_APP_MQTT_REPLAY_DEPTH, _APP_MQTT_MAX_PACKET_SIZE)
- Add _APP_PWNED_PASSWORDS_DSN (2.3.0 password breach policy)
- Add flutter-3.44 sites runtime (Jaspr SSR) and its executor image
- Adopt upstream MongoDB init fix (#13593): idempotent init on port 27018

🤖 Generated with Codebuff
Co-Authored-By: Codebuff <noreply@codebuff.com>
2026-09-24 20:23:09 -03:00
Skender f7dd6b9988 opencode template: force https on generated domain 2026-09-24 22:15:26 +01:00
Skender 0fe93d8e39 opencode template: update meta.json 2026-09-24 22:10:14 +01:00
Skender 9551602df7 opencode template: update template.toml 2026-09-24 22:10:13 +01:00
Skender f9ccaf6c34 opencode template: update docker-compose.yml 2026-09-24 22:10:11 +01:00
Skender 5308f0d04a add opencode template: opencode.svg 2026-09-24 22:05:51 +01:00
Skender 82f8a12b29 add opencode template: meta.json 2026-09-24 22:05:50 +01:00
Skender 00b6c160a0 add opencode template: template.toml 2026-09-24 22:05:49 +01:00
Skender 77b708e335 add opencode template: docker-compose.yml 2026-09-24 22:05:48 +01:00
shashank agarwal e429bff0c2 fix(orbit): use tested versioned multi-platform images 2026-09-24 13:32:24 +05:30
Tiziano Zonta 50da81b19a fix: disable debug mode in Healthchecks template 2026-09-24 09:28:51 +02:00
Tiziano Zonta 3be5179a10 feat: add Healthchecks template 2026-09-24 09:13:27 +02:00
Furox-Art c13cced0f0 fix(template): align VersityGW runtime configuration 2026-09-24 03:16:31 +03:00
shashank agarwal 6425052f98 fix: support generated storage passwords 2026-09-24 01:41:50 +05:30
shashank agarwal 62c2f0ed73 feat: add Orbit task management template 2026-09-24 01:20:22 +05:30
Finley Crawford-McQuillanandGitHub 7dda34013a Fix typo in template.toml 2026-09-22 19:26:58 +01:00
Finley Crawford-McQuillanandGitHub 52fb40bc19 Clear VAPID keys and add setup instructions to template.toml 2026-09-22 19:22:47 +01:00
Finley Crawford-McQuillanandGitHub c98bc28eb4 Add FLUXER_ERLANG_COOKIE to docker-compose.yml 2026-09-22 19:04:50 +01:00
Finley Crawford-McQuillanandGitHub 1ac802dd8d add FLUXER_ERLANG_COOKIE to template.toml 2026-09-22 19:04:12 +01:00
Nargor 0d15b50e92 feat: bump mc-controller template to 1.0.2 2026-09-22 23:45:53 +07:00
Nargor 8a95f2a2a0 feat: add MC Controller template 2026-09-22 22:01:18 +07:00
Nicholas Penree e1e99b1a99 feat: Add sable template 2026-09-21 21:25:59 -04:00
Carlos Dorneles 32fe660cc4 feat(appwrite-2): use node LTS runtimes 22, 24 and 26 2026-09-21 14:56:37 -03:00
Reynaldi Chernando 34fd42e2e5 feat: add Corsfix self-hosting template 2026-09-21 21:23:48 +07:00
Yusuf Gundogdu 7bb611134c libredb-studio: move to 0.16.2 2026-09-21 09:50:50 +03:00
Release 4e67eaa911 feat: add Grovs template 2026-09-21 09:45:30 +03:00
JRKandGitHub a239603a3f Update template.toml 2026-09-20 16:48:19 +02:00
JRKandGitHub c6d9ed96e0 Update docker-compose.yml 2026-09-20 16:45:39 +02:00
Yusuf Gündoğdu a1a811bbf4 libredb-studio: bump meta version to 0.16.1 2026-09-20 13:55:01 +03:00
Yusuf Gündoğdu eb7994560f libredb-studio: bump version to 0.16.1 and add healthcheck 2026-09-20 13:55:00 +03:00
Carlos Dorneles 3ad2b05013 chore(appwrite-2): bump orchestrator to 2.2.2 and executor to 0.29.1 2026-09-19 19:01:37 -03:00
Alexandre Blause ea98830477 feat(blueprint): add orca server template
Run the headless Orca runtime (orca serve) on Dokploy. Orca publishes
no container image, so the compose builds one from the pinned upstream
release AppImage (amd64 or arm64) on Ubuntu 24.04, following the
official headless Linux server guide.

The runtime is served on one domain for both the WebSocket endpoint and
the web client. ORCA_PAIRING_ADDRESS sets the address advertised in
pairing links, and ORCA_SERVE_ARGS passes extra serve flags such as
--mobile-pairing for the Orca mobile app.
2026-09-19 20:32:39 +02:00
Carlos Dorneles 8841f90c9e feat(appwrite-2): add all supported runtimes with multiple versions 2026-09-19 10:23:00 -03:00
Furox-Art e3c611741d feat: add VersityGW template
S3-compatible gateway over a POSIX backend with versioning, flat-file IAM
and the built-in WebUI exposed on the domain; S3 API and admin API ports
stay internal per the upstream Docker guide.
2026-09-18 18:35:35 +03:00
Abdullah A e9b1f1585a adjust env 2026-09-18 15:32:21 +03:00
Abdullah A c42e1c3fc8 adjust env 2026-09-18 15:14:55 +03:00
Abdullah A a145a44964 Add OpenProject 17 AiO template 2026-09-18 14:47:42 +03:00
Carlos Dorneles 573afcfca8 fix(appwrite-2): use service name as executor hostname
openruntimes-executor resolves its own container with gethostname()
against Docker's name filter. With hostname "exc1" the filter never
matches "<project>-openruntimes-executor-1", so the executor crash
loops with "Own container not found" (appwrite/appwrite#13016).

Mirror the appwrite blueprint: set hostname to the service name (a
substring of the generated container name) and point _APP_EXECUTOR_HOST
at http://openruntimes-executor/v1. Avoids container_name, which the
compose validator rejects and which is not deployment-unique.
2026-09-17 18:42:57 -03:00
Carlos Dorneles df4d401ad7 fix(appwrite-2): set executor container_name to match hostname
openruntimes-executor looks itself up in Docker by matching its hostname
against the container name. Without container_name the generated name is
"<project>-openruntimes-executor-1", so the lookup fails and the executor
crash loops with "Own container not found" (appwrite/appwrite#13016),
leaving site/function deployments stuck in "building".
2026-09-17 18:37:58 -03:00
Carlos Dorneles c88ef64e29 feat(appwrite-2): support a dedicated console domain
Add a console_domain variable (defaults to console.<main_domain>) and
route the Console, API (/v1) and Realtime (/v1/realtime) on that host,
while keeping the existing main-domain routes intact. Point
_APP_CONSOLE_DOMAIN and _APP_CONSOLE_HOSTNAMES at the console host so
the Console can reach the API on its own origin and can be protected
independently (e.g. Cloudflare Access).
2026-09-17 17:18:14 -03:00
Douglas RamírezandGitHub 851a6601f2 chore: Update Docker image to specific version 2026-09-17 13:34:00 -05:00
Douglas RamírezandGitHub 1b2e06cb4b chore: Change port from 80 to 8080 in template.toml 2026-09-17 13:22:49 -05:00
Douglas RamírezandGitHub 78f0e98b86 chore: Update Docker image and exposed port in compose file 2026-09-17 13:20:56 -05:00
Web Artisan 259eb8a402 fix(junctio): widen the generated secret 2026-09-17 17:30:52 +03:00
Web Artisan a880b39d48 fix(junctio): generate the secret as hex 2026-09-17 17:22:04 +03:00
Web Artisan ad5a86fc61 feat(template): add junctio 2026-09-17 17:14:25 +03:00
Yusuf GUNDOGDU b7e522a9a0 libredb-studio: bump version to 0.16.0 2026-09-17 13:07:04 +03:00
Chirag Aggarwal f9c496fa57 style(appwrite): drop stray blank line to keep the diff focused 2026-09-17 10:29:35 +01:00
Chirag Aggarwal e65859bced feat(appwrite): bump template to 2.2.0
Picks up the 2.1 and 2.2 releases on top of the 2.0 rebuild: console
1.1.96 self-hosted build, orchestrator 2.2.0, the autogravity service, and
the env changes from those releases (executions are ClickHouse only, the
pool adapter and legacy logging providers are gone).
2026-09-17 10:25:33 +01:00
lilsnibbi e52b86baef fix(keyzori): simplify template and align container routing 2026-09-17 16:44:55 +10:00
Carlos Dorneles e887280386 fix(appwrite-2): default _APP_OPTIONS_FORCE_HTTPS to disabled 2026-09-16 21:42:16 -03:00
Carlos Dorneles b1b5a61e7d fix(appwrite-2): set meta.json id to match renamed blueprint folder 2026-09-16 21:02:01 -03:00
Carlos Dorneles 81325f0731 refactor(appwrite-2): rename blueprint from appwrite-2-2 to appwrite-2 2026-09-16 20:58:56 -03:00
Carlos Dorneles 2bddfa780a fix(appwrite-2-2): wait for postgres, redis and geo health before appwrite
Use depends_on conditions so appwrite does not start before its backing
services are healthy. Compose rejects interpolation in depends_on keys,
so postgresql is referenced by its literal service name.
2026-09-16 20:46:29 -03:00
Carlos Dorneles 79fb54496b fix(appwrite-2-2): route function and site preview subdomains
Appwrite serves function/site previews on <sub>.<functionsDomain> and
<unique>.<sitesDomain>. Dokploy rejects wildcard hosts in template.toml,
so add Traefik HostRegexp labels on the appwrite service, matching the
existing appwrite blueprint.

Also disable _APP_ROUTER_AUTO_CERTIFICATES since Dokploy terminates TLS
and the bundled Appwrite Traefik is not deployed.
2026-09-16 20:44:11 -03:00
Carlos Dorneles 8beb87f3ab feat: add Appwrite 2.2 template
Add a self-hosted Appwrite 2.2 stack adapted from the official
docker-compose, using Dokploy domains instead of the bundled Traefik.

- Fix the compose file so it parses: drop the dangling networks block that
  duplicated the appwrite service and created phantom gateway/runtimes
  services
- Pin all images to explicit versions (appwrite/appwrite:2.2.0, etc.)
- Add restart: unless-stopped to the always-on services and to the
  separate-profile workers
2026-09-16 18:46:27 -03:00
Carlos Dorneles 18c3bf2858 fix: keep /dev/urandom mount recommended by Metabase docs 2026-09-16 18:28:28 -03:00
Carlos Dorneles bf7e3e9d69 fix: update Metabase template to v0.63.18
- Bump metabase/metabase image from v0.50.8 to v0.63.18
- Bump postgres from 14 to 16 and persist data with a named volume
- Generate the database password via the password helper instead of
  hardcoding it
- Add restart policy, expose port and depends_on with healthchecks
2026-09-16 18:26:53 -03:00
Carlos Dorneles 8a1ecbfb74 feat: update authentik to 2026.8.2 2026-09-16 09:05:54 -03:00
lilsnibbi 35b1f66c7a chore: limit Keyzori contribution to blueprint files 2026-09-16 14:20:33 +10:00
lilsnibbi e1c13b9bae chore: use latest Keyzori image in template 2026-09-16 14:02:54 +10:00
lilsnibbi b21588b34e test: cover Keyzori template deployment and persistence 2026-09-16 13:26:34 +10:00
Jeremie e8d2615c2b Add OpenLMNP template 2026-09-14 19:05:06 +02:00
lilsnibbi 63adcdadc2 feat: add Keyzori template 2026-09-14 11:47:44 +10:00
root 974b6ed8f4 feat(velix-api): bump to v1.1.0 — security hardening and Chatwoot SSRF fix 2026-09-13 12:35:23 +00:00
Yusuf Gundogdu 50f0b5f9d9 libredb-studio: bump version to 0.15.0 2026-09-12 03:40:12 +03:00
Vitaliy Kukharik 8e50aaeaa3 Update Autobase to version 2.11
Bump autobase service images (console_ui, console_db, console_api) to 2.11.0.
2026-09-11 20:45:10 +02:00
Stefan Ernst aa6354bda0 chore: update Windshift to v0.8.8 2026-09-11 14:21:37 +02:00
Kacper Wyczawski 2a725ce0fc feat: add OpenCloud template 2026-09-10 10:23:46 +02:00
Barış Çelik 01d4ae2f04 chore(inkvoice): bump to 0.3.0 and cap memory at 512M 2026-09-10 10:48:28 +03:00
Shivaansh Dhingra b343e232ae feat: add Hydrodactyl template (#1139) 2026-09-09 19:38:27 -04:00
William HollacsekandClaude Opus 5 8d416a8a87 Make sb_-only mode work, and name the S3 settings nobody documents
Clearing ANON_KEY and SERVICE_ROLE_KEY is a supported mode — Envoy guards
every legacy branch — but four places broke when you did it. storage,
studio, functions and the realtime healthcheck all read the legacy pair
directly, and storage can never use an sb_ key because it calls PostgREST
at rest:3000 and never traverses the gateway. All four now resolve
${ANON_KEY:-${ANON_KEY_ASYMMETRIC}}. Verified with docker compose config
against a real deployment env: all six land on the ES256 JWTs and the
healthcheck token is non-empty.

Storage S3 block, with the three traps: REGION is read as the S3 signing
region when STORAGE_S3_REGION is unset, and this template ships it as
"stub"; STORAGE_S3_DISABLE_CHECKSUM is needed for providers that reject
the SDK's CRC32 and appears in no upstream file; GLOBAL_S3_PROTOCOL is
in the official compose and read nowhere in supabase/storage. Also noted
that imgproxy needs no S3 config — storage hands it a presigned URL.

STORAGE_TENANT_ID is the top-level key prefix, so it is permanent.

Two more warnings from a real first deploy: the domain is interpolated at
creation, so editing the Domains tab later leaves API_EXTERNAL_URL — and
therefore every token's iss — pointing at the old host; and the ES256
six-value swap does not touch the legacy pair.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-09 15:48:05 -05:00
Kacper Wyczawski b8c5f2bab5 fix: actually remove some of the patches suggested by copilot because they were stupid and outdated 2026-09-09 20:46:18 +02:00
Kacper Wyczawski 914e393f51 fix: incorrect version 2026-09-09 20:40:50 +02:00
Kacper Wyczawski f1295b6518 fix: apply patches suggested by copilot 2026-09-09 20:40:01 +02:00
Kacper Wyczawski d718f761b1 fix: accidentally deleted labels 2026-09-09 20:22:59 +02:00
Kacper Wyczawski 5a8b088c49 fix: remove explicit network config 2026-09-09 20:16:50 +02:00
Kacper Wyczawski 91061251de fix: missing traeffc labels for seafile 2026-09-09 20:13:01 +02:00
Kacper Wyczawski 4d90eab114 feat: update seafile to 13.0 2026-09-09 19:39:34 +02:00
Tekena Solomon bede4dbd80 Merge branch 'template/instatic' of github.com:Tekipeps/templates into template/instatic 2026-09-09 16:15:32 +01:00
Tekena Solomon 6ae5bb5103 Merge branch 'canary' of github.com:Tekipeps/templates into template/instatic 2026-09-09 16:14:50 +01:00
Tekena Solomon e02190ab18 chore: bump Instatic to 0.0.18
Signed-off-by: Tekena Solomon <tekena157@gmail.com>
2026-09-09 16:12:03 +01:00
Guido Esser d742938c5a feat: add Prozesswerk template (text-to-BPMN, self-hosted) 2026-09-09 11:30:53 +02:00
Tam Nguyen 2224b5561d fix: rearrange services + add documentations, remove volume driver 2026-09-08 17:46:58 +10:00
Tam Nguyen 33e928ec64 feat(elasticsearch): update template to v9 with security 2026-09-08 16:54:33 +10:00
Tam Nguyen 72f1ea9318 fix: remove leftover docker compose versioning 2026-09-08 16:38:26 +10:00
Tam Nguyen 95fe69fc48 fix: remove obsolete docker-compose version property
Ref:
- https://docs.docker.com/reference/compose-file/version-and-name
https://docs.docker.com/compose/intro/history
2026-09-08 16:34:07 +10:00
yusuf-gundogdu 8f836f5f28 libredb-studio: bump version to 0.14.1 2026-09-08 08:51:33 +03:00
Andrés Sarrazola aefe3143ce Use canonical self-hosting documentation link 2026-09-07 16:48:19 -05:00
Andrés Sarrazola 543ce0b9a5 feat: add OpenLivery template 2026-09-07 16:28:17 -05:00
MRBobzaRandGitHub 3a7efa52a3 Added Pretix Template 2026-09-06 12:41:32 -05:00
MRBobzaRandGitHub e80389efbc Adding Pretix Template 2026-09-06 12:31:31 -05:00
MRBobzaRandGitHub 343629716a Added Pretix Templete 2026-09-06 11:50:44 -05:00
xob0t 4fd2873a67 fix: map HyperDX exponential histogram metrics 2026-09-06 13:20:34 +03:00
xob0t df88ec0972 docs: record HyperDX web validation 2026-09-06 13:13:52 +03:00
xob0t 4dd732170c feat: add tested HyperDX template 2026-09-06 13:07:55 +03:00
juancho 80a50aa0d0 feat: add Gitea with PostgreSQL Security & Privacy Settings 2026-09-05 23:28:37 -05:00
juancho a9e07bf677 fix: update Gitea with PostgreSQL blueprint template whit 1.27.3 version 2026-09-05 23:05:32 -05:00
William HollacsekandClaude Opus 5 78e1b776ad Pass SB_JWT_ISSUER to Edge Functions, and correct the ES256 instructions
Three fixes found by deploying this blueprint and testing it surface by surface.

The functions service sets SUPABASE_URL to the internal gateway address, while
Auth signs tokens with API_EXTERNAL_URL as the issuer. Supabase's own edge
function JWT helper (_shared/jwt/default.ts) derives its expected issuer from
SUPABASE_URL unless SB_JWT_ISSUER is set, so it rejects every valid token with
an issuer mismatch. Passing SB_JWT_ISSUER through fixes that, and is inert for
functions that do not read it.

The ES256 procedure had three problems. It told you to clone supabase/supabase,
which is a very large monorepo, for one 7 KB script; fetching that file is
enough and node is its only requirement. It omitted --update-env, without which
only four of the six values are printed at all — ANON_KEY_ASYMMETRIC and
SERVICE_ROLE_KEY_ASYMMETRIC reach .env alone, so "replace all six with the ones
it prints" could not be followed. And the script exits 1 after writing the keys,
because it then looks for a docker-compose.yml to patch that is not there and
need not be, since this blueprint already wires all four variables; that made a
successful run look like a failure.

Also documents that pg_graphql is not installed on a fresh database, so the
/graphql/v1 route the gateway already exposes answers with an error until one
statement is run. The hosted platform ships it enabled, so this is a real
difference for code moving across.

Verified against a live deployment: the documented steps run as written, all six
values land, and the issuer now matches so edge-function JWT verification
succeeds. Blueprint validators and generate-meta --check all pass.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017DjX4ai6xiixeV8knW9Hpa
2026-09-05 15:12:19 -05:00
Chirag Aggarwal 4699cf0de8 feat(appwrite): update template to 2.0.0
Appwrite 2.0 replaces the engine, ships the new root-path console and
defaults new installs to PostgreSQL, so the template is rebuilt from the
stock 2.0.0 installer output rather than bumped:

- PostgreSQL (appwrite/postgres) is the database; MariaDB/MongoDB and
  their init mounts are dropped.
- Combined worker/scheduler topology (appwrite-worker, appwrite-task-scheduler)
  replaces the per-queue worker containers.
- New services: orchestrator (builds), clickhouse (usage/executions),
  appwrite-geo; executor bumped to 0.29.0, console to appwrite/new.
- Console is served at / with the API on /v1 and /.well-known and the
  realtime server on /v1/realtime.
- Runtime and build containers join the stack's own Compose network and
  the builds volume is pinned per project via COMPOSE_PROJECT_NAME.
2026-09-05 16:29:25 +01:00
William HollacsekandClaude Opus 5 7fca9845cf Warn that a domain without TLS needs the http scheme
The template generates SUPABASE_PUBLIC_URL, API_EXTERNAL_URL and
ADDITIONAL_REDIRECT_URLS with https://, which is right for a public domain with
a certificate. Dokploy creates the template's domain with none, so until one is
enabled the domain answers on http only and those three values point at a
scheme that does not respond.

Measured on a live deploy: the stack reports 11/11 healthy and the gateway
answers http with Studio's 401 basic-auth challenge, while https returns 404 —
so nothing looks broken, but Studio's own calls fail, Envoy's CORS check
compares Origin against the https string and refuses, and GoTrue builds its
issuer, OAuth redirects and email links from the dead scheme.

Also records that Let's Encrypt cannot rescue a private address: an sslip.io
name pointing at a Tailscale 100.x or a LAN address cannot be validated.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-03 20:34:39 -05:00
William HollacsekandClaude Opus 5 e309adc45b Close five parity gaps with official Supabase self-host
A multi-agent audit of the Envoy port compared the blueprint against
supabase/supabase@master, against Dokploy's own source, and against the repo's
conventions. Three findings survived an adversarial refute pass and two more
were traced to the same cause. All five are divergences from official that
predate this branch, but they sit on the surface this branch touches.

- template.toml: API_EXTERNAL_URL gains /auth/v1, matching official
  docker/.env.example:101 since supabase e7abda8d (PR #47640, 2026-07-07).
  Without it GoTrue advertises https://<domain>/callback for every OAuth and
  SAML flow, and Envoy's lds routes bare /callback to the `/` catch-all — that
  is Studio, not auth. Measured: /auth/v1/authorize returns GoTrue's 400, while
  /callback returns Studio's 401 basic-auth challenge.

- template.toml: add the /volumes/functions/deno.jsonc import map and point
  main/index.ts at it, and take official's `hello` sample. Upstream shipped
  these in 9ef9f1b8 (2026-08-14) and f5f897a2 (2026-08-28); the blueprint's
  functions volume was still at the 2023-era deno.land/std sample with
  importMapPath = null, so no function written against current Supabase docs
  could resolve @supabase/server. Also injects SUPABASE_FUNCTION_SLUG.

- docker-compose.yml: restore official's SELinux flags on the shared functions
  directory — `:z` not `:Z`, and `:ro` back on Studio's copy. `:Z` applies a
  private MCS label, so mounting one host directory into two containers with
  it revokes the first container's access on an SELinux host. Every other bind
  flag in the file already matched official; these three were the only drift.

- meta.json: version becomes 2026.08.03-3. The images are unchanged from
  official's 2026.08.03 snapshot, so 2026.08.17 advertised a state the template
  does not ship.

- template.toml: API_GW_HTTP_PORT is inert, because the port is pinned by
  `expose` and by the domain block. The comment above it said the opposite.

- instructions.md: two operational gaps the audit surfaced. Renaming kong to
  api-gw makes Dokploy reject a redeploy of an existing service until the
  domain's Service Name is edited. And the Postgres data directory is a bind
  mount, so Dokploy's Volume Backups cannot see it, deleting the service
  destroys it regardless of the delete-volumes toggle, and "redeploy with fresh
  volumes" does not reset the database.

Re-verified end to end on Docker 29.4.0: all three repo validators pass, all 11
services healthy, and the eight original checks still pass. Two new ones: the
hello sample returns 200 {"message":"Hello from Edge Functions!"} for both
sb_publishable_ and sb_secret_ keys — proving the import map resolves — and
/auth/v1/settings and /auth/v1/authorize reach GoTrue.

Note a deliberate behaviour change from official: the new sample declares
auth: ["publishable","secret"], so a legacy anon JWT now gets a 401 with an
explanatory INVALID_API_KEY body where the old sample accepted it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-03 20:13:49 -05:00
William HollacsekandClaude Opus 5 615f8d8d69 Move the Supabase blueprint from Kong to the Envoy API gateway
Official Supabase made Envoy the default API gateway on 2026-08-11 (PR #48153,
self-hosted release 0.8.0) and shipped a CORS fix for /pg/ routes on 2026-08-17
(PR #49136) that only Envoy carries. This blueprint still shipped Kong.

Changes:
- docker-compose.yml: rename `kong` to `api-gw`, on envoyproxy/envoy:v1.39.0.
  TCP healthcheck because the image has no curl or wget. Expose 8000 only —
  Envoy has no 8443 listener. Env vars follow official: ANON_KEY /
  SERVICE_ROLE_KEY replace SUPABASE_ANON_KEY / SUPABASE_SERVICE_KEY, every
  KONG_* is dropped, and SUPABASE_PUBLIC_URL is added for #49136. Rename the
  three internal references to the gateway, and add official's `functions`
  healthcheck.
- template.toml: swap the two Kong mounts for the four envoy ones, copied from
  supabase/supabase@master. serviceName becomes `api-gw`; KONG_HTTP_PORT
  becomes API_GW_HTTP_PORT and KONG_HTTPS_PORT is dropped.
- meta.json: version marker names the Envoy switch.
- instructions.md: Kong replaced by Envoy in all four places, plus a note that
  Studio's basic-auth credential is a SHA1+base64 hash of DASHBOARD_PASSWORD
  computed by Envoy's entrypoint at startup.

Two Dokploy adaptations, deliberate and both needed:
- No `networks:` aliases block and no `ports:` mapping — validate-docker-compose
  rejects both. The alias exists upstream only for backwards compatibility, and
  nothing here still points at `kong`.
- cds.yaml points the realtime cluster at `realtime`, not at official's
  `realtime-dev.supabase-realtime` container_name, because this blueprint sets
  no container_name. lds.template.yaml is byte-identical to official, so the
  Host header realtime uses for tenant resolution is unchanged.

Verified locally against Docker 29.4.0 / Compose v5.1.2, rendering the template
the way Dokploy does. All 11 services healthy; legacy keys work; sb_publishable_
is blocked by RLS while sb_secret_ reads the row; Studio basic auth challenges
and accepts; /realtime/v1/api/tenants and /realtime/v1/api/openapi return 403
and the /rest/v1/ root stays service-role only; an OPTIONS to /pg/ returns
access-control-allow-origin matching SUPABASE_PUBLIC_URL; a realtime channel
join over ?apikey=sb_publishable_… replies status ok; and the sample edge
function returns its response.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-03 14:59:48 -05:00
moskoweb 271aa8224f fix(obscura): support token auth in CDP websocket URL 2026-09-03 14:07:43 +00:00
Khiet Tam Nguyen 127fd8260c fix: trailing slash for manifest-server healthcheck to avoid redirect in logs 2026-09-03 19:15:52 +10:00
BryanFRD fa06c0d2e2 feat: add LFSX template 2026-09-03 10:34:24 +02:00
moskoweb ef51d95292 feat(obscura): expose authenticated CDP and MCP endpoints 2026-09-02 18:04:05 +00:00
moskoweb 8a191639b6 feat: add Obscura Browser template 2026-09-02 12:52:58 +00:00
moskoweb 51f065c794 fix: harden and update 9router template 2026-09-02 12:30:14 +00:00
Tam Nguyen 7328d9c0ab feat: add AIRBYTE_ENABLE_UNSAFE_CODE for manifest-server and workload-launcher 2026-09-02 08:32:33 +10:00
Khiet Tam Nguyen ef94e85e12 chore: format airbyte logo svg 2026-09-01 20:00:07 +10:00
830d6bbc8d Add OpenStatus template (#1126)
Self-hosted OpenStatus (status pages + uptime monitoring) following the
official docker-compose.github-packages.yaml setup: local libSQL database,
one-shot migration runner built from the pinned upstream commit, workflows,
API server, dashboard, status-page, and the private-location ingest server.
All app images pinned to upstream commit e1a9825; Tinybird analytics run in
no-op mode by default.

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-08-31 14:05:48 -06:00
gpiechnik2 ef4cedcc86 Update versioning 2026-08-31 09:12:01 +02:00
Tam Nguyen 8a6f23ca15 feat: add healthchecks to all long-running containers 2026-08-31 15:17:45 +10:00
Tam Nguyen 40683e2afa fix: remove reliance on hard-coded network
Changes based on:
- https://github.com/nktnet1/airbyte-compose/pull/2

Hopefully addresses:
- https://github.com/Dokploy/templates/pull/1119#issuecomment-5471586794
2026-08-31 10:48:52 +10:00
Ghazi Ben DahmaneandGitHub b87d9a9a8a feat: add Rustrak SQLite full-stack template (#1115) 2026-08-30 17:46:06 -06:00
Ghazi Ben DahmaneandGitHub a9aa64ee51 feat: add FalkorDB template (#1116) 2026-08-30 17:45:24 -06:00
Ghazi Ben DahmaneandGitHub 8ac27a0f89 fix: update Pocket ID template to v2.14.0 (#1113) 2026-08-30 17:44:43 -06:00
614e4fef12 fix(odoo_17, odoo_18): provide odoo.conf via config mount and enable proxy_mode (#1124)
Same root cause as odoo_19 (#1108, fixed in #1110): the compose file
bind-mounts ../files/config over /etc/odoo, but with mounts = [] the
directory is empty, hiding the image's /etc/odoo/odoo.conf. As a result
wait-for-psql.py crashes with configparser.NoSectionError: No section:
'options' and the web container never starts.

Ship odoo.conf through the template config mount instead, with
proxy_mode enabled so websocket/POS/livechat work behind Traefik.

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-08-30 16:45:14 -06:00
c784f9b9c8 feat: add Silo object storage service with Docker Compose setup (#1112)
* feat: add Silo object storage service with Docker Compose setup

* update version to match docker image

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
2026-08-30 16:35:58 -06:00
Steven TranandGitHub 698ab85f6d feat(template): add Quire Ink (#1117) 2026-08-30 16:35:18 -06:00
egedemirkaranandGitHub 6284bbc74f fix: Update outdated website URL (#1120) 2026-08-30 16:34:37 -06:00
7b1cf99803 fix(postiz): pass all social provider env vars and fix Temporal healthcheck (#1121)
* fix(postiz): pass all social provider env vars and fix Temporal healthcheck

* fix(postiz): drop env vars Postiz does not read, unset NOT_SECURED

- GOOGLE_CLIENT_ID/GOOGLE_CLIENT_SECRET are not read by Postiz:
  the Google auth provider and GMB both use YOUTUBE_CLIENT_ID
  (google.provider.ts, gmb.provider.ts).
- NEXT_PUBLIC_FRONTEND_URL does not exist in the Postiz codebase.
- Postiz checks NOT_SECURED for truthiness only, so the string
  "false" still enables insecure mode; remove the variable so
  secure cookies are actually on for the HTTPS deployment.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Mauricio Siu <mauricio@dokploy.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-08-30 16:33:41 -06:00
1aa2d74f4e data permission right & Traefik configuration (#1110)
* data permission right & Traefik configuration

Permession to write on data directory is mandatory for odoo server to run
Added Traefik configuration to allow POS and live chat to run

* fix(odoo_19): provide odoo.conf via config mount and enable proxy_mode

The empty ../files/config bind mount was hiding the image's
/etc/odoo/odoo.conf, crashing wait-for-psql.py (NoSectionError:
'options') in a restart loop. Ship odoo.conf through the template
mount instead, with proxy_mode enabled so websocket/POS/livechat
work behind Traefik (threaded mode serves /websocket on 8069, so
no extra routing is needed). Revert the manual Traefik labels
(invalid compose: labels must be a mapping; Dokploy generates
routing from template.toml) and the chown command (the named
volume already gets odoo ownership from the image).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Mauricio Siu <mauricio@dokploy.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-08-30 16:33:00 -06:00
Mauricio SiuandClaude Fable 5 de2bf9ece2 fix: make AzerothCore templates start reliably out of the box
- Force the MySQL healthcheck over TCP: with --host=localhost it pings the unix socket, which answers during MySQL's temporary init phase before networking is up, so db-import started too early and failed with connect error 111.
- Serialize the SOAP bootstrap after the admin bootstrap: both jobs insert into acore_auth.account concurrently and hit a MySQL deadlock (Error 1213) that bootstrap-account does not retry.
- Default REQUIRE_EMAIL_VERIFICATION to false via a new PORTAL_REQUIRE_EMAIL_VERIFICATION variable: the template ships empty SMTP settings, so the portal crash-looped on first deploy.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-30 16:31:27 -06:00
JavierandGitHub b35349963e feat(wupnext): add new env vars for mcp server (#1100)
* feat(wupnext): add new env vars for mcp server

* fix: set explicit docker image version tag
2026-08-30 16:21:07 -06:00
Bora GökçeandGitHub 127b607d76 feat: add BlogFactory template (#1111) 2026-08-30 16:20:26 -06:00
Manan SantokiandGitHub c974384957 feat: make Firecrawl template production-ready (#1118)
* feat: make Firecrawl template production-ready

* fix: generate valid Firecrawl API keys
2026-08-30 16:03:35 -06:00
b05ce42a12 chore(plausible): update to v3.2.1 (#1123)
- ghcr.io/plausible/community-edition v2.1.5 -> v3.2.1 (latest stable release)
- clickhouse-server 24.3.3.102-alpine -> 24.12-alpine, matching the official
  CE v3.2.1 compose.yml
- CLICKHOUSE_SKIP_USER_SETUP=1 on the events db: required by ClickHouse
  24.11+ images so Plausible can connect as the passwordless default user
  (without it the app crash-loops with AUTHENTICATION_FAILED)
- plausible-data volume + TMPDIR per the official v3 compose

Deploy-verified on a Dokploy instance: fresh import, all 3 containers
running, HTTP 200 on the domain with the Plausible login page.

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-08-30 15:04:31 -06:00
gpiechnik2 22f7eecbba Update heyo docs logo 2026-08-30 17:35:41 +02:00
gpiechnik2 85144c103b Add heyo docs template 2026-08-30 16:50:01 +02:00
Khiet Tam Nguyen 31dbf42773 fix: sync core dns version in config mount 2026-08-30 13:29:46 +10:00
Khiet Tam Nguyen 0bae8c9e55 fix: expose instead of ports for 8001 2026-08-30 12:01:03 +10:00
Ghazi BEN DAHMANE 5743692cdd feat(azerothcore-portal): configure email verification 2026-08-28 22:22:58 +02:00
Ghazi BEN DAHMANE 8d248a3dee chore: track latest portal image 2026-08-28 21:47:23 +02:00
Ghazi BEN DAHMANE 6df08cfa66 feat: add AzerothCore portal template 2026-08-28 21:41:11 +02:00
Tam Nguyen de7c35ccc5 fix: reduce hard-coded ip reliance for services apart from K3S
Ref:
- https://github.com/nktnet1/airbyte-compose/pull/1
2026-08-28 16:16:20 +10:00
Tam Nguyen d828ed2753 docs(airbyte): note about public access for AIRBYTE_URL 2026-08-28 11:36:19 +10:00
Tam Nguyen 9358c91ae4 fix: use password 32 to meet minimum jwt signature requirement 2026-08-28 11:22:47 +10:00
Tam Nguyen 07d806ae61 feat(blueprint): add airbyte template 2026-08-28 10:56:20 +10:00
Ghazi BEN DAHMANE 902b3d55fc feat: add AzerothCore template 2026-08-27 20:22:53 +02:00
AlexandGitHub baeee743b9 Merge branch 'Dokploy:canary' into canary 2026-08-26 11:43:28 +02:00
Alexander Zerling 299ef205a3 Refactor Nebulynk Docker Compose and template configuration for improved clarity and functionality 2026-08-26 11:35:14 +02:00
Mauricio SiuandGitHub f29a0b7340 Merge pull request #1103 from jmaxdev/canary
feat: add Kotonoba template
2026-08-25 11:46:44 -06:00
AlexandGitHub 7994b28553 Merge branch 'Dokploy:canary' into canary 2026-08-25 12:42:53 +02:00
Mauricio SiuandGitHub b5b37264a4 Merge pull request #1109 from Dokploy/chore/sync-main-into-canary
chore: sync main into canary (OpenSEO #1107)
2026-08-25 00:15:48 -06:00
Mauricio SiuandClaude Fable 5 bf8322317c chore: sync main into canary (brings OpenSEO #1107, merged to main by mistake)
#1107 targeted main instead of canary and was squash-merged there. This merge
brings blueprints/openseo into canary and keeps both histories converged so
the next canary->main release stays conflict-free.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-25 00:14:27 -06:00
a9d21b63b7 Add OpenSEO template (#1107)
* Add OpenSEO template

OpenSEO is an open source, self-hosted alternative to Semrush and
Ahrefs (keyword research, rank tracking, backlinks, site audits).
Requires a DataForSEO API key, which the template leaves blank for
the user to fill in via the Dokploy UI.

* openseo: pin image to v0.1.6 and set ALLOWED_HOST so Vite preview accepts the Dokploy domain

---------

Co-authored-by: Mauricio Siu <mauricio@dokploy.com>
2026-08-25 00:09:45 -06:00
c322999417 Fix Appwrite Function API requests behind HTTPS redirects (#1087)
* fix(appwrite): enable HTTPS for function API endpoint

* appwrite: document that _APP_OPTIONS_FORCE_HTTPS=enabled requires an HTTPS domain

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Mauricio Siu <mauricio@dokploy.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-08-24 23:21:42 -06:00
8deda67f4c update Calcom image version and add QOL Env Var for public signup and Email SMTP (#1091)
* feat: update calcom image version and add QOL Env Var for public signup

* fix: add quotes to env var definition

* fix: add more information for selfhosting

* feat: add env vars and config for Email SMTP Creds

* chore(calcom): bump meta.json version to v6.2.0 and fix ARM comment line reference

---------

Co-authored-by: Mauricio Siu <mauricio@dokploy.com>
2026-08-24 22:56:50 -06:00
0bb292dad3 feat: add Instatic template (#1093)
* feat: add Instatic template

Instatic is a self-hosted, open-source visual CMS combining a canvas
editor, content engine, and static site publisher. Deployed as a
single container backed by SQLite, with uploads and DB on one
persistent volume.

Signed-off-by: Tekena Solomon <tekena157@gmail.com>

* fix: add init container to fix Instatic storage volume permissions

Signed-off-by: Tekena Solomon <tekena157@gmail.com>

* fix(instatic): accept both https and http public origins so the setup wizard works before HTTPS is enabled

---------

Signed-off-by: Tekena Solomon <tekena157@gmail.com>
Co-authored-by: Mauricio Siu <mauricio@dokploy.com>
2026-08-24 22:56:29 -06:00
Abbas AgaandGitHub 63635b1ff6 feat(openanalytics): add Open Analytics blueprint (#1094) 2026-08-24 21:20:43 -06:00
Mauricio SiuandClaude Fable 5 08e0637b57 nebulynk: drop import.base64 (not used by the templates build)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-24 21:00:45 -06:00
Vitaliy KukharikandGitHub 6621a29d54 Autobase: bump to v2.10.0 (#1088)
Update Autobase Docker image from 2.7.2 to 2.10.0 in docker-compose.yml and sync the blueprint meta.json version to match.
2026-08-24 20:58:32 -06:00
e4cd30c15a Add MyLinks template (#1089)
* feat: add MyLinks template

* fix: correct postgres volume mount path

* fix: add compose version key required by Dokploy

* fix(my-links): healthcheck via 127.0.0.1 (localhost resolves to ::1 on Alpine, app listens on IPv4 only)

---------

Co-authored-by: Mauricio Siu <siumauricio@icloud.com>
Co-authored-by: Mauricio Siu <mauricio@dokploy.com>
2026-08-24 20:57:54 -06:00
Mauricio Siu 8754e69d3c merge canary 2026-08-24 20:56:33 -06:00
Mauricio Siu 1f1e3b4651 fix(instatic): accept both https and http public origins so the setup wizard works before HTTPS is enabled 2026-08-24 20:55:32 -06:00
Sadiq Al-AboudiandGitHub 73d257ec11 feat(GoatCounter): Add GoatCounter template (#1096)
* init

* fix(goatcounter): error on deployment
2026-08-24 20:44:44 -06:00
Sadiq Al-AboudiandGitHub b456667931 feat(Kanbn): add Kanbn template (#1098)
* feat(Kan): add and test kan template

* chore(Rename): change from kan to kanbn
2026-08-24 20:44:08 -06:00
Torikul IslamandGitHub fee40dba4c feat: add freellmapi template (#1099)
* feat: add freellmapi template

* fix: align meta.json version with pinned image tag

* fix: use hex helper for ENCRYPTION_KEY
2026-08-24 20:43:32 -06:00
aa60cb637a fix(rustrak-full): bind UI to 0.0.0.0; chore(trmnl-larapaper): bump to 0.40.0 (#1105)
- rustrak-full: the Next.js standalone UI bound to $HOSTNAME (container id),
  so Traefik got connection refused and the UI domain returned 502 (pre-existing
  on canary, confirmed by deploying both #1102 and canary). HOSTNAME=0.0.0.0
  was deploy-verified: UI 200 "Rustrak - Error Tracking System".
- trmnl-larapaper: #1101 bumped to 0.33.0 (Apr 2026); upstream is at 0.40.0.
  0.40.0 was deploy-verified on the same template: healthy, /, /login,
  /register, /up all 200.

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-08-24 20:40:55 -06:00
Benjamin NussbaumandGitHub f343ceb15f feat(blueprint): update trmnl-larapaper template (#1101) 2026-08-24 20:39:44 -06:00
Abian SuarezandGitHub 72491787d4 fix(rustrak): point templates at the official images and current metadata (#1102)
Both Rustrak blueprints shipped abians7/* images pinned to v0.2.1, twelve
minor versions behind the current release, and linked to the old personal
repo. Updated to the official rustrak/* images on latest, refreshed the
metadata, and replaced the logo with the current mark.

The memory figure in the description is now measured rather than estimated:
32 MB resident at idle with SQLite, from docker stats on these images.
2026-08-24 20:39:06 -06:00
9c784b723e feat: add postgres-pgadmin template (#1104)
* feat: add postgres-pgadmin template

* feat: expose postgres via second domain

Add postgres_domain variable and second [[config.domains]] for
postgres:5432 alongside pgadmin:80, so both the DB and the web UI
are reachable via Dokploy domains.

* fix(postgres-pgadmin): drop HTTP domain on postgres:5432, pre-register server in pgAdmin, bump pgAdmin to 9.17

- Remove the second [[config.domains]] pointing an HTTP host at postgres:5432 (Traefik returned 502).
- Mount servers.json + pgpass via config.mounts so pgAdmin comes with the bundled PostgreSQL pre-registered and connects without a password prompt (pgpass is copied to the data volume with 0600 for uid 5050).
- Bump dpage/pgadmin4 8.13 -> 9.17.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Mauricio Siu <mauricio@dokploy.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-08-24 20:34:46 -06:00
Stefan ErnstandGitHub a307ed4720 chore: update Windshift to v0.8.5 (#1090) 2026-08-24 20:30:56 -06:00
Mauricio SiuandClaude Fable 5 39ce5301b4 fix(kotonoba): pin image to 1.0.19, ADMIN_DOMAIN as hostname
- ghcr.io/trixtylab/kotonoba:latest -> 1.0.19 (same digest as latest today); meta.json version 1.0.19.
- ADMIN_DOMAIN is documented upstream as a bare hostname, pass ${main_domain} without scheme.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-24 20:30:35 -06:00
Zakher MasriandGitHub b7ca428d92 fix: update 20+ broken links in templates (#1084)
* fix: update 20+ broken links in templates

* fix: evolution-api links
2026-08-24 20:30:20 -06:00
jmaxdev d5d374ad72 feat: add Kotonoba template 2026-08-22 13:23:56 -03:00
Tekena Solomon 0179ab425c fix: add init container to fix Instatic storage volume permissions
Signed-off-by: Tekena Solomon <tekena157@gmail.com>
2026-08-20 04:45:21 +01:00
Tekena Solomon 1f7fd68b56 feat: add Instatic template
Instatic is a self-hosted, open-source visual CMS combining a canvas
editor, content engine, and static site publisher. Deployed as a
single container backed by SQLite, with uploads and DB on one
persistent volume.

Signed-off-by: Tekena Solomon <tekena157@gmail.com>
2026-08-20 04:32:30 +01:00
Mauricio SiuandGitHub bf8ca3fb35 Merge pull request #1085 from zaaakher/ui-improvements-1
fix: search input icons and scrollbar shift from mode-toggle dropdown
2026-08-18 14:57:06 -06:00
Alexander Zerling 5c84dd7fea Update Nebulynk version to stable and increase meeting transcript wait timeout
- Changed version from 0.4.0 to stable in meta.json
- Increased MEETING_TRANSCRIPT_WAIT_TIMEOUT_MS from 1200000 to 1800000 in template.toml
2026-08-16 02:22:26 +02:00
Alexander Zerling 3f3c3aebeb updated base64 2026-08-16 01:37:10 +02:00
Alexander Zerling 963d77a5be Update template.toml for HTTP-only domains and add optional configurations
- Changed frontend, backend, livekit, and garage URLs to HTTP for sslip.io compatibility.
- Added NODE_ENV set to "development".
- Introduced optional SMTP and integration keys with placeholders.
- Added operational and security settings including rate limits and cookie configurations.
2026-08-16 01:25:22 +02:00
Alexander Zerling 35d8f7869e Refactor code structure for improved readability and maintainability 2026-08-15 20:20:28 +02:00
Alexander Zerling 6fcf6240af Add Nebulynk template configuration with environment variables and domain settings
- Introduced a new template.toml file for Nebulynk blueprint.
- Defined variables for frontend, backend, LiveKit, and garage domains.
- Configured PostgreSQL and storage S3 credentials with secure password generation.
- Set up environment variables for services including JWT and API keys.
- Specified domain configurations for frontend, backend, LiveKit, and garage services.
2026-08-15 20:15:34 +02:00
zakher 350e44ff95 fix: search input icons and scrollbar shift from mode-toggle dropdown 2026-08-15 17:04:27 +03:00
Mauricio SiuandGitHub a0d6ed1527 Merge pull request #1083 from Dokploy/canary
New release
2026-08-14 10:18:29 -06:00
7a343aa1b8 feat: add DockRoute template (#1079)
* feat: add DockRoute template

* fix: pass template env vars through to the dockroute container

The compose file had no environment block, so the DOCKROUTE_*/CLOUDFLARE_*
variables defined in template.toml never reached the container - switching
the provider to cloudflare from the Dokploy environment tab would have
silently stayed in the log dry-run mode.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Mauricio Siu <mauricio@dokploy.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-08-14 09:09:48 -06:00
Loan TALVATandGitHub cd446e9f25 feat: add Louez template (#1081)
Louez is an open-source equipment rental platform (AGPL-3.0): a booking
storefront with live availability plus a back office for reservations,
customers, PDF contracts and statistics.

The blueprint brings up the app, MySQL 8.4 and a private MinIO bucket for
product images. Louez installs its own database schema on first boot.
2026-08-14 09:06:13 -06:00
VA360 LABS S.L.andGitHub f4bf271183 Add Didacta template (#1080)
Didacta is a fair-code self-hosted LMS. The blueprint ships the app image
alongside a pgvector-enabled Postgres (the baseline migration runs
CREATE EXTENSION "vector", so a plain postgres image fails on first boot)
and Redis.

A single domain is enough: the container runs the API on :4000 and the web
on :3000, and Next.js rewrites /api/*, /healthz and /readyz to the internal
API, so the domain only targets port 3000.
2026-08-14 09:03:43 -06:00
Mauricio SiuandGitHub 443976641c Merge pull request #1077 from Dokploy/canary
New version
2026-08-14 08:54:57 -06:00
Mauricio Siu 64073b5ec2 chore: tie main history into canary 2026-08-14 08:52:47 -06:00
Mauricio SiuandGitHub fcac3882ca Change website and docs URLs in meta.json (#1078)
Updated website and documentation links for Drizzle Gateway.
2026-08-09 23:22:40 -06:00
taqinandGitHub 979eadc06a Change website and docs URLs in meta.json
Updated website and documentation links for Drizzle Gateway.
2026-08-09 20:48:59 +07:00
a7339677c9 Reef chain (#776)
* feat: reef chain bootstrap

* fix: missing doc field

* feat: reef rpc

* fix: meta

* feat: toml changes

* fix: var in rpc

* feat: minimal rpc

* feat: default envs

* bootnode toml

* feat: icon

* feat: icon

* feat: old icons

* Update template.toml

* Update template.toml

* fix: service name

* feat: reef-faucet

* feat: reef-keygen

* feat: meta added

* fix: node_name unused var

* fix: service name

* feat: add platform

* feat: dokploy compatible

* force: platform

* feat: linux

* feat: linux-2

* feat: eth-rpc

* fix: image

* fix: variables

* feat: bootnode update

* feat: spec generator running

* feat: validator

* fix: meta.json for validator

* fix: exec binary for reef-validator

* feat: validator start

* feat: remove container name

* fix: env var for eth-rpc

* feat: custom spec generator

* fix: image for reef-spec

* feat: dev cluster

* fix: name

* fix: meta.json

* fix: wget

* feat: reef-* removed

* feat: reef-dev cluster

* Update docker-compose.yml

* feat: close rpc ports for reef-dev-cluster

* feat: removed rpc ports from validator

* feat: rpc node seperate

* feat: rpc node

* feat: reef-rpc

* fix: meta

* feat: removed version from docker-compose bootstrap

* feat: expose 9944 for dev cluster

* fix: start-rpc script

* feat: eth-rpc rpc host

* fix: flag for eth-rpc external rpc connections

* feat: cors for all

* fix: meta.json missing ]

* feat:process meta

* feat: removed container_name from docker-compose

* feat: port and p2p port must be string for bootnode

* feat: ports for reef dev cluster

* fix: ports for reef-dev-cluster

* feat: all ports to strings

* Wire Reef templates to external scripts repo

* fix: align reef templates with dokploy rules

* chore: process meta.json

* fix: route reef spec generator via subdomain

* feat: make reef dev cluster self-contained

* fix: make reef templates amd64 compatible

* chore: update reef images to latest tags

* fix: make reef dev cluster bootstrap portable

* fix: bootstrap reef dev cluster from pinned assets

* fix: make reef dev cluster zero-config

* fix: pin reef dev cluster bootstrap

* feat: add eth rpc to reef dev cluster

* fix: pin reef dev cluster eth rpc assets

* fix: align reef traefik routing

* fix: pin reef dev cluster traefik updates

* feat: add reef faucet frontend

* fix: pin reef faucet frontend assets

* fix: make reef dev cluster eth rpc dokploy-safe

* fix: gate reef dev cluster eth rpc on health

* fix: restore reef dev cluster ws rpc

* fix: pin reef dev cluster ws assets

* fix: proxy reef dev cluster ws host headers

* fix: pin reef dev cluster host proxy assets

* fix: raise reef faucet drip amount

* fix: pin reef faucet amount assets

* Update docker-compose.yml

* chore: scope Reef PR to one-click viable templates (dev-cluster + keygen)

Remove reef-bootnode, reef-rpc, reef-validator, reef-spec-gen,
reef-eth-rpc and reef-faucet: their defaults depend on external
infrastructure (*.reef.host / 72.60.35.83) that is offline, or on
manually wiring values between deployments, so they cannot work as
one-click templates. reef-dev-cluster and reef-keygen are fully
self-contained and verified working.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com>
Co-authored-by: Mauricio Siu <siumauricio@icloud.com>
Co-authored-by: Mauricio Siu <mauricio@dokploy.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-08-09 00:06:41 -06:00
bbd0817b9d Add Langfuse template (#1072)
* Add Langfuse template

Open-source LLM engineering platform: tracing, prompt management,
evaluation and cost/usage analytics for LLM apps.

Stack: langfuse-web + langfuse-worker (image tag 4), Postgres 17,
ClickHouse 25.12, Redis 7, MinIO. Adapted from the official
docker-compose.yml at https://github.com/langfuse/langfuse/blob/main/docker-compose.yml,
with all secrets generated via Dokploy's template.toml helpers instead
of the upstream hardcoded defaults.

MinIO gets its own domain because Langfuse's web UI issues presigned
S3 URLs that the browser fetches directly (media attached to traces),
so that endpoint has to be reachable from outside the internal network.

Validated locally with build-scripts/validate-template.ts,
validate-docker-compose.ts and generate-meta.js --check (all pass),
plus `docker compose config` with sample secrets to confirm the
langfuse-web override of LANGFUSE_S3_MEDIA_UPLOAD_ENDPOINT resolves
correctly. Not yet deployed on a live Dokploy instance.

* fix: bind langfuse-web to 0.0.0.0 so Traefik can reach it

Docker sets HOSTNAME to the container id, and Next.js standalone binds to
it, which resolves to a single network's IP. With Dokploy's proxy network
attached as a second network, Traefik got connection refused (502).
Setting HOSTNAME=0.0.0.0 fixes routing; verified with a live deploy.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Mauricio Siu <mauricio@dokploy.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-08-09 00:01:50 -06:00
c4398d281f feat: add Waxum template (#1074)
* feat: add Waxum template

* fix(waxum): pin SQLITE_PATH inside the mounted session volume

Waxum's default SQLite path already resolves inside
WHATSAPP_STORAGE_PATH, so this was already persisted, but make it
explicit so it doesn't depend on undocumented default derivation
surviving a redeploy.

Addresses: https://github.com/Dokploy/templates/pull/1074#pullrequestreview-4883962555

---------

Co-authored-by: fdciabdul <taqin2731@gmail.com>
2026-08-08 23:45:50 -06:00
7b4af4c234 fix(supabase): generate the new API keys and wire up JWKS verification (#1069)
* fix(supabase): generate the new API keys and wire up JWKS verification

The template has carried the plumbing for Supabase's new opaque API keys
since #872 — kong-entrypoint.sh builds the Lua translation expressions and
kong.yml registers the keys as key-auth credentials — and #1068 added the
studio/kong compose references while aligning with upstream.

But four of the variables that plumbing reads have never been declared in
template.toml, so they never reached the Environment tab:

  SUPABASE_PUBLISHABLE_KEY, SUPABASE_SECRET_KEY,
  ANON_KEY_ASYMMETRIC, SERVICE_ROLE_KEY_ASYMMETRIC

kong-entrypoint.sh gates on the first two being non-empty, so every deploy
silently took the legacy-only branch and users had no field to fill in.

Generate them from [variables] instead:

- SUPABASE_PUBLISHABLE_KEY / SUPABASE_SECRET_KEY as opaque sb_* strings
- ANON_KEY / SERVICE_ROLE_KEY move to [variables] so ANON_KEY_ASYMMETRIC
  and SERVICE_ROLE_KEY_ASYMMETRIC can reuse the same JWT

Kong substitutes whatever token those hold and every backend already
verifies HS256 with JWT_SECRET, so the opaque keys work without an EC
keypair (which the dokploy helpers cannot generate). Clients still only
ever hold an opaque string. JWT_KEYS / JWT_JWKS stay empty as a
documented opt-in for real ES256.

Also fixed while in here:

- JWT_JWKS was missing entirely. GOTRUE_JWT_KEYS was already enabled, so
  anyone setting a real JWKS got Auth signing ES256 tokens that PostgREST,
  Storage, Realtime and Functions had no way to verify. Wire it into all
  four verifiers.
- Restore two routes kong.yml dropped: /realtime/v1/api/tenants and
  /realtime/v1/api/openapi were reachable with the anon key, and the
  PostgREST OpenAPI root at /rest/v1/ was anon-readable (supabase#42949).
  Needs KONG_ROUTER_FLAVOR: expressions, as upstream sets.
- graphql-v1 had key-auth hide_credentials: true. key-auth runs before
  request-transformer, so the apikey header was stripped before the Lua
  expression could read it and service_role GraphQL requests were
  silently downgraded to anon.
- DB_ENC_KEY was hardcoded to the well-known "supabaserealtime" default;
  generate REALTIME_DB_ENC_KEY instead.
- functions/main/index.ts was the old remote-JWKS version pinned to
  deno.land/x/jose@4.14.4; sync with upstream (jsr:@panva/jose@6 and
  local SUPABASE_JWKS).

Verified against all 11 services running locally: an RLS-protected table
confirms anon and publishable keys are blocked while service_role and
secret keys read the row, so the opaque keys really are translated and
not downgraded. Storage and Realtime still verify HS256 with JWT_JWKS
empty. 21/22 end-to-end checks pass; the last was the test not following
Studio's redirect.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* fix(supabase): match dokploy hash helper semantics (length = chars, not bytes)

Dokploy's generateHash(length) returns exactly `length` hex characters,
not `length` random bytes hex-encoded. Realtime requires DB_ENC_KEY to be
exactly 16 characters (AES-128), so ${hash:8} produced an 8-char key and
the realtime container crash-looped. Bump to ${hash:16}, and bump the
opaque API key segments to ${hash:22}/${hash:8} to match the intended
sb_<role>_<22>_<8> shape.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Co-authored-by: Mauricio Siu <mauricio@dokploy.com>
2026-08-07 00:13:27 -06:00
62a418ee4f feat: add NaviMusic template (#1059)
* feat: add NaviMusic blueprint template with docker-compose and configuration support for NaviMusic #1058

* fix: align NaviMusic blueprint metadata

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* fix: remove invalid NaviMusic env comment

* fix: pin NaviMusic to 4.1.0 and keep container alive without credentials

4.1.1+ throws at startup unless a valid YouTube OAuth2 refresh token
(interactive device-code flow) is provided, so no placeholder config can
ever boot those tags. 4.1.0 is the newest release that boots without it.

Also wrap the entrypoint so a clean exit (empty/invalid DISCORD_TOKEN is
logged, not thrown) idles with instructions in the logs instead of
restart-looping; non-zero exits still hit the restart policy.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Mauricio Siu <siumauricio@icloud.com>
Co-authored-by: Mauricio Siu <mauricio@dokploy.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-08-06 23:50:28 -06:00
740981d044 fix: bring remaining blueprints in line with the port conventions (audit green) (#1070)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-08-06 23:20:50 -06:00
ba60abbcf3 feat: add Novu self-hosted notification template (#1056)
* feat: add Novu self-hosted notification template

Co-authored-by: Cursor <cursoragent@cursor.com>

* feat: enhance Novu template with comprehensive environment variable configuration

Added a detailed environment variable section to the Novu template, including secrets, feature flags, service URLs, and database configurations. This update improves clarity and usability for self-hosted deployments.

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-06 22:59:35 -06:00
eec3b3d510 Update forgejo template; bumps Forgejo version to 15; fixes git push over ssh (#880)
* Update forgejo template; bumps Forgejo version to 15; fixes git push over ssh

* updates template compose and toml to use internal port mapping

* fix: bump Forgejo to 16, use expose per repo convention, drop HTTP domain on SSH port

- codeberg.org/forgejo/forgejo:15 -> :16 (current stable, 16.0.2)
- ports -> expose (repo convention since #1053; Traefik reaches the
  container over the docker network, no host port publishing needed)
- remove the [[config.domains]] entry on port 22: Dokploy domains are
  Traefik HTTP routers and cannot proxy SSH (returned 500 in testing)
- drop empty FORGEJO__server__SSH_PORT= and SSH_LISTEN_PORT overrides
  (image defaults already listen on 22)
- clean comment/blank entries from template.toml env array

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Mauricio Siu <siumauricio@icloud.com>
Co-authored-by: Mauricio Siu <mauricio@dokploy.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-08-06 13:50:26 -06:00
1d47fa16e4 fix: normalize template.toml mounts across all 502 blueprints (#1063)
* fix: normalize template.toml mounts across all blueprints (closes #1047)

- 79 blueprints declared a bare [[config.mounts]] header (one empty array
  element in TOML) -> replaced with the repo idiom 'mounts = []'
- 38 blueprints carried doc-style mount blocks (name/mountPath/description)
  that don't match the schema (filePath/content) and are inert in Dokploy's
  template processor -> removed; their named volumes already live in each
  docker-compose.yml
- penpot: duplicate 'expose' map key made its docker-compose.yml invalid
  YAML -> merged into one expose list

After this, validate-template.ts passes for all 502 blueprints. The
remaining validate-docker-compose.ts flags are the intentional host-port
templates (mail/game/streaming protocols: poste.io, mailu, oryx, fivem,
lodestone, etc.) which the validator does not yet model as exceptions.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* feat: validator opt-out marker for intentional host ports + annotate rustdesk

The validate-docker-compose CI on this PR was failing on rustdesk's
hbbs/hbbr port mappings (21115-21119) — intentional host-published ports
for the RustDesk relay/rendezvous protocol, which Traefik cannot route.

Adds a '# dokploy: allow-host-ports' top-of-file marker that downgrades
the port-mapping errors to warnings for such protocol templates
(mail/game/streaming/VPN/remote-desktop), and annotates rustdesk.
Other exception templates (poste.io, mailu, oryx, fivem...) can be
annotated case-by-case as the weekly audit (#1049) surfaces them.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-08-06 01:25:48 -06:00
8ad0f9134e fix(supabase): upgrade database to Postgres 17 (#1068)
Align the template with the current upstream self-hosted stack
(supabase/postgres 17.6.1.136, studio 2026.08.03, kong 3.9.3),
remove the deprecated analytics/vector services and switch
Studio/pg-meta to the postgres role per upstream guidance.

Closes #1067

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-08-06 01:11:35 -06:00
01930d7a71 Add Yuvomi template (#1065)
* Add Yuvomi template

Privacy-first, self-hosted family planner.
- Image pinned to 0.71.10 (latest stable GHCR tag)
- 4 named volumes (data/backups/modules/documents)
- SESSION_SECRET via ${password:64} helper
- Single domain on port 3000
- Healthcheck wired

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* chore(yuvomi): bump image to 1.85.0

The PR pinned ghcr.io/ulsklyc/yuvomi:0.71.10, but upstream's latest
stable release is v1.85.0. Bump the compose image tag and meta.json
version to match.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Mauricio Siu <siumauricio@icloud.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-08-06 01:06:22 -06:00
Szymon BludnikandGitHub ebeeb58dee Add Creed self-host template (#1043)
* feat(templates): add Creed self-host template

Adds a Dokploy blueprint for Creed (creed.md), built from source since
no official Docker image exists yet. Requires an external Supabase
project (schema pushed via the Supabase CLI), so only what can be
generated locally (CREED_ENCRYPTION_SECRET) is auto-filled; Supabase,
Stripe, OpenRouter, Resend, and GitHub OAuth vars are left blank with
setup steps documented in the mounted README.

NEXT_PUBLIC_* vars are threaded through as Docker build args (not just
runtime env), since Next.js inlines them at build time and the app
hard-fails the build if NEXT_PUBLIC_SITE_URL is unset — this was
caught by an actual `docker compose build` run against the upstream
repo, not just template validation.

Verified with docker compose build/up: image builds cleanly, container
boots, / returns 200, and /api/health correctly reports "degraded"
with Supabase unconfigured as expected.

* Pin creed build context and refactor env

- Pin creed docker-compose build context to a specific commit
  hash to ensure reproducible builds
- Expose port 3000 in docker-compose (use expose instead of ports)
- Update meta.json version from latest to the pinned hash e9b096d
- Convert template.toml env block from [config.env] to a single env
  array
- Keep the README.md mount in place

* Modify docker-compose build context URL

Updated the build context URL to the main branch.

* fix(creed): pin build context and move env under [config]

Restore the commit pin so the inline Dockerfile matches the pre-monorepo
layout, and place env under [config] before domains so Dokploy imports
the environment correctly.
2026-08-06 01:06:00 -06:00
ce2864aa12 chore: update stalwart named volumes for v0.16 (#1066)
Co-authored-by: rowupstream <259214402+rowupstream@users.noreply.github.com>
2026-08-05 08:54:26 -06:00
rowupstream b258e9f774 chore: update stalwart named volumes for v0.16 2026-08-04 10:07:09 -05:00
755c7c5c50 Add Open Design template (#966)
* Add Open Design template

Open Design is a local-first, open-source design tool that ships as a
single self-contained container (no external DB or cache). Adds the
blueprint (docker-compose.yml + template.toml + logo) and a meta.json entry.

* Use node-based healthcheck for Open Design template (matches upstream; verified locally)

* Pin Open Design image to 0.16.1 for reproducible deploys

Replace :latest with the immutable released tag ghcr.io/nexu-io/od:0.16.1
in docker-compose.yml and set the matching version in meta.json, per the
repo pinning convention (AGENTS.md). Tag 0.16.1 verified: /api/health
returns 200 and the node-based healthcheck passes.

* Allow both http and https origins for Open Design template

Dokploy's auto-generated domain is served over plain HTTP by default (no
cert), so OD_ALLOWED_ORIGINS=https://${main_domain} alone made the daemon
reject the browser's http origin with 403, breaking the app after the
onboarding shell loaded. List both schemes so the template works on the
default HTTP domain and after a user adds an HTTPS certificate. Verified
against a live deploy: listed origin -> 200, unlisted -> 403; the daemon
supports comma-separated multi-origin per deploy/README.md.

* Disable daemon API auth so the Open Design web UI loads

The daemon token-gates its API when bound to 0.0.0.0 (every container),
and a browser has no way to present that bearer token, so the web UI's
bootstrap calls all returned 401 and the app failed to load. Set
OD_DISABLE_API_AUTH=1 (the daemon's documented escape hatch) so the UI
works on deploy. Add a README noting the instance is then open (front it
with auth/HTTPS if internet-facing) and how to enable AI features.
Verified end to end against a live deploy on a real domain.

---------

Co-authored-by: Abhiigg <abhi@incrediblegoodguys.com>
Co-authored-by: Mauricio Siu <siumauricio@icloud.com>
2026-08-03 05:02:23 -06:00
025ae61c2c feat: add Whatomate template (#1064)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-08-03 05:01:17 -06:00
Marios AntonoudiouandGitHub 0b731157ce Chatto latest (#1060)
* Switch to latest channel for chatto

* Update meta.json too

* Switch to 0.4 series
2026-08-03 04:46:41 -06:00
Juan VargasandGitHub 0eae107272 Update SendDock template: track latest image, drop deprecated env vars (#1057)
- Point the image at ghcr.io/arkhe-systems/senddock:latest so fresh
  deploys always get the current release without a per-release PR.
- Remove DEPLOYMENT_MODE (self-host is the default now; the cloud flag
  became the boolean CLOUD).
- Remove SENDDOCK_LICENSE_KEY (Pro license is activated from the
  dashboard in 0.8; the env var is removed in 0.9).
2026-08-03 04:46:16 -06:00
Jiho LeeandGitHub de726de736 feat: add 9Router template (#1046)
* feat: add 9Router template (#1040)

* fix: pin the headroom sidecar instead of :latest

* fix: use http for BASE_URL per the repo URL convention

* fix: set NEXT_PUBLIC_BASE_URL so the browser hits the deployed domain
2026-08-03 04:39:57 -06:00
a73e4928f2 feat: bump fmd-server to 0.16.0 for compatibility with Open Street Map (#1052)
* feat(fmd-server): bump to version 0.16.0

* fix: use expose instead of ports

* fix: fmd-server image tag is 0.16.0 (upstream dropped the v prefix)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Mauricio Siu <siumauricio@icloud.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-08-03 04:39:40 -06:00
Yusuf GündoğduandGitHub 1dc9c36216 libredb-studio: bump version to 0.9.59 (#1039) 2026-08-03 04:37:04 -06:00
Khiet Tam NguyenandGitHub 5aba7908a2 chore: remove conduwuit in favour of tuwunel (#1054) 2026-08-03 04:36:59 -06:00
Jiho LeeandGitHub a49f00fd7b ci: audit every blueprint on a schedule (#1049)
* ci: audit every blueprint on a schedule (#1047)

* ci: use RUNNER_TEMP and gate the fail step on the dispatch event

* ci: bound the step summary and publish the full report as an artifact

* ci: treat a missing file as a finding, and never truncate mid-fence
2026-08-03 04:36:31 -06:00
Finley Crawford-McQuillanandGitHub 292877b370 feat: Add Fluxer template (#1045)
* feat: Add Fluxer template

* fix: populate config.env in template.toml

* fix: syntax in template.toml for config.env

* fix: use multiline string for config.env in template.toml

* fix: format config.env as valid string array in template.toml

* fix: update template.toml format to match standard env array structure

* add: template.toml with optional env vars and http guidance

* fix: change wording to avoid confusion

* fix: add more missing instructions

* fix: more wording changes

* fix: final wording improvements

* fix: comma missing from previous commit
2026-08-03 04:36:10 -06:00
a176ba3e16 Blueprints/portabase (#1055)
* feat(blueprints): add portabase

* feat(blueprints): add portabase

---------

Co-authored-by: Théo LAGACHE <theo.lagache@soluce-technologies.com>
2026-08-03 04:18:15 -06:00
Khiet Tam NguyenandGitHub 69e731eda1 fix: change "ports" -> "expose" for multiple services (#1053)
* fix: change "ports" -> "expose" for multiple services

* chore: remove helper script
2026-08-03 04:12:26 -06:00
Andre Carbajal VargasandGitHub c1ccb27359 feat: add NaviServer template (#1062)
* feat: add NaviServer template

* fix: address NaviServer template review comments

* fix: align NaviServer template env format

* fix: publish NaviServer Minecraft ports
2026-08-03 04:12:23 -06:00
JavierandGitHub 4de48c2a73 Add WupNext blueprint (#1051) 2026-08-03 04:09:10 -06:00
Jiho LeeandGitHub 0c33668267 fix: bring scrutiny, stack-auth and vault in line with the compose conventions (#1048)
* fix: drop no-op container_name from three blueprints (#1047)

* fix: drop the empty [[config.mounts]] block from vault

* fix: pin vault and scrutiny images, add the missing version header
2026-08-03 04:02:30 -06:00
Stefan ErnstandGitHub 285e667c68 chore: update Windshift to v0.8.2 (#1041) 2026-07-21 21:56:19 -06:00
+4 a14bab01ad New release (#1038)
* fix: meta.json of Poke blueprint

The current github/docs links was broken

before:
https://codeberg.org/ashley/poke
after:
https://codeberg.org/ashleyirispuppy/poke

* fix: broken links in some blueprints

* Add openhabittracker blueprint

* fix(affinepro): update to current AFFiNE images

The template pinned ghcr.io/toeverything/affine-graphql:stable-780dd83,
an ephemeral per-commit tag on the old image name that has since been
removed from GHCR, so the template could no longer pull and deploy.

- Switch both app and migration services to ghcr.io/toeverything/affine:stable,
  the rolling stable tag recommended by the official self-host compose,
  so the template no longer rots when per-commit tags are garbage-collected
- Move postgres to pgvector/pgvector:pg16 and set AFFINE_INDEXER_ENABLED=false,
  matching the current upstream self-host compose requirements
- Add postgres/redis healthchecks and proper depends_on conditions so the
  self-host-predeploy migration job runs only once the database is ready,
  and the server starts only after migrations complete successfully

Closes #777

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(cockpit): persist config and storage volumes per upstream docs

The template mounted `html:/var/www/html` (freezing the app code from the
first deploy) and `data:/var/www/html/storage/data`, which misses uploaded
assets (stored under `storage/uploads`) and cache. Per the official Cockpit
persistent-storage docs, mount `config:/var/www/html/config` and
`storage:/var/www/html/storage` instead.

Closes #549

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(kener): define REDIS_URL and drop unused databases

Kener v4 requires Redis for its BullMQ queues, caching and scheduler,
so the app crashed on startup with "REDIS_URL is not defined in
environment variables" right after printing that it was running
(issue #976). The template also spun up both a postgres and a mariadb
container while DATABASE_URL pointed at SQLite, so neither database
was ever used (issue #282).

Changes, aligned with the upstream docker-compose.yml
(rajnandan1/kener):

- Add a redis:7-alpine service with a healthcheck and persistent
  volume, wire REDIS_URL=redis://redis:6379 and make kener depend on
  redis being healthy
- Remove the unused postgres and mysql services plus their env vars
  and generated passwords; keep SQLite (upstream default) persisted
  in the kener_db volume
- Set ORIGIN to https://<domain> instead of http://localhost:3000 so
  CSRF protection works behind the generated domain
- Drop the stale /app/uploads bind mount (kener v4 only persists
  /app/database) and the obsolete compose version key

Deploy-tested on a Dokploy instance: migrations and seed complete,
schedulers start, "Kener version 4.1.2 is running!", HTTP 200 on the
generated domain, both containers stable.

Closes #976
Closes #282

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(homarr): use named volume for /appdata and hex encryption key

- Replace the relative bind mount `../homarr/appdata:/appdata` with a
  named volume `homarr_appdata:/appdata` so the data survives cleanups
  and can be backed up through Dokploy volume backups.
- Generate SECRET_ENCRYPTION_KEY with `${hash:64}` instead of
  `${password:64}`: homarr requires a 64-character hex string
  (`openssl rand -hex 32`) and the password helper emits non-hex
  characters (g-z).

Closes #738

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(logto): fix postgres role error and update to 1.41.0

The postgres healthcheck ran pg_isready without -U while POSTGRES_USER
was set to logto, so every probe attempted to connect as role
"postgres" and spammed FATAL: role "postgres" does not exist.
Pass -U logto -d logto explicitly and set POSTGRES_DB.

Also fix LOGTO_ENDPOINT pointing at the admin domain instead of the
main domain, update Logto 1.27.0 -> 1.41.0, use ${password:32} for the
generated password, drop the ephemeral host port publishing and add
restart policies.

Closes #130

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(gitlab-ce): serve on the generated domain (remove removed unicorn config, pin omnibus)

The template set unicorn['worker_processes'] / unicorn['worker_timeout'] in
GITLAB_OMNIBUS_CONFIG. Unicorn was removed in GitLab 14.0, so on current
gitlab-ce images `gitlab-ctl reconfigure` aborts with "Removed configurations
found in gitlab.rb" and GitLab never starts serving — the generated domain
returned 502 Bad Gateway (issue #380).

Rewrite the template as the official all-in-one Omnibus setup:
- pin gitlab/gitlab-ce:19.1.2-ce.0 instead of :latest
- external_url http://<domain> with nginx listen_port 80 / listen_https false
  (TLS terminates at Traefik)
- set gitlab_rails['initial_root_password'] from a generated template password
- puma single mode + prometheus monitoring off to keep memory reasonable
- drop the external postgres/redis containers (Omnibus bundles and manages
  its own) and the broken ports entries ("2224" published a random host port
  while sshd listens on 22)

Verified on a live Dokploy instance: domain serves the GitLab sign-in page
and root login with the generated password works.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(zitadel): wire EXTERNALDOMAIN/PORT/SECURE to the generated domain

Zitadel resolves its instance from the external domain/port/scheme, so the
template's ZITADEL_EXTERNALPORT=8080 made every generated URL (OIDC issuer,
login redirects) point at http://<domain>:8080 instead of the domain served
by Traefik, ending in {"code":5,"message":"Not Found"} (#516).

- Expose ZITADEL_EXTERNALDOMAIN / ZITADEL_EXTERNALPORT / ZITADEL_EXTERNALSECURE
  as template env vars, defaulting to the generated domain over HTTP
  (port 80, secure=false) so the routed domain and Zitadel's external config
  always match; HTTPS users flip them to 443/true in the Env tab.
- Pin image to v4.16.0 (was latest) and keep the built-in login v1 via
  ZITADEL_DEFAULTINSTANCE_FEATURES_LOGINV2_REQUIRED=false so no separate
  login-v2 container is needed.
- Add the official readiness healthcheck, drop the unused /app/data volume,
  bogus SMTP env keys, published port and obsolete compose version key.

Closes #516

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(immich): update to v3.0.2

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(automatisch): switch to official image and wire up DOMAIN to fix Bad Gateway

- Replace unofficial dockeriddonuts/automatisch:2.0 mirror (stale since Nov 2024)
  with the official automatischio/automatisch:0.15.0 image
- Define DOMAIN in template.toml [config.env]: the compose referenced ${DOMAIN}
  but it was never provided, so HOST resolved empty and the app generated
  localhost URLs for the web app and webhooks
- Set API_URL/WEB_APP_URL so generated URLs don't carry the internal :3000 port
  behind Traefik
- Add postgres healthcheck and gate the app on service_healthy to avoid the
  boot-time migration race; worker now starts after main (official compose order)
- Drop unnecessary published port and no-op REDIS_* env on the redis service
- Bump meta.json version to 0.15.0

Closes #97

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(signoz): fix ClickHouse hostname resolution and IPv6 binding

- Override the ClickHouse image's config.d/docker_related_config.xml,
  which listens on the IPv6 wildcard address ([::]) first and fails to
  bind on hosts without IPv6 support; listen on 0.0.0.0 (IPv4) only and
  disable the internal DNS cache so transient startup DNS failures for
  zookeeper-1/clickhouse are not cached (issue #534).
- Set hostname: clickhouse (instead of container_name) so the server
  identifies itself as the cluster host declared in cluster.xml.
- Remove the explicit signoz-net network: Dokploy attaches its own
  networks automatically and the repo validator rejects explicit
  networks; a fixed-name shared network also breaks service DNS across
  deployments.
- Fix mount mismatch: template.toml created files/signoz/prometheus.xml
  while the compose mounts ../files/signoz/prometheus.yml, so Docker
  silently mounted a directory as the signoz prometheus config.
- Give the otel-collector domain its own generated host: both domains
  previously shared the same host and path "/", creating two conflicting
  Traefik routers where one service randomly won.

Closes #534

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(infisical): update to v0.162.6

- Bump image from v0.135.0-postgres to v0.162.6 (upstream dropped the
  -postgres tag suffix after v0.146.0; plain tags are the postgres build)
- Remove the db-migration service: the standalone image runs database
  migrations automatically on boot (auto-start-migrations), matching the
  official docker-compose.prod.yml which no longer ships that service
- Generate ENCRYPTION_KEY (${hash:32}) and AUTH_SECRET (${base64:32})
  per deployment instead of shipping hardcoded example secrets
- Fix SITE_URL to http://${main_domain} (no :8080; the domain is proxied)
- Refresh SMTP env names (SMTP_FROM_ADDRESS/SMTP_FROM_NAME; SMTP_SECURE
  was removed upstream) and drop unused CLIENT_* env placeholders that
  were never passed to the container

Closes #215

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix: add databasus (postgresus renamed upstream)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(evolutionapi): enable integration flags and update version

Adds the integration enable env flags introduced in Evolution API v2.3.x
(N8N_ENABLED, OPENAI_ENABLED, EVOAI_ENABLED, DIFY_ENABLED, TYPEBOT_ENABLED,
CHATWOOT_ENABLED) so integrations no longer fail with 'N8n is disabled',
and pins the image to v2.3.7 instead of latest.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(rybbit): update to v2.7.0

The template shipped rybbit v1.5.1, which is no longer supported and is
vulnerable to known React2Shell exploits (see #659). Update to the
latest stable release v2.7.0 and align the stack with the upstream
docker-compose:

- Pin ghcr.io/rybbit-io/rybbit-backend and rybbit-client to v2.7.0
- Add the redis service now required by the backend (session tracking
  and BullMQ queues), with password auth, AOF persistence and
  noeviction policy per upstream
- Drop the DOMAIN_NAME env var (only used by the upstream Caddy
  webserver, which Dokploy replaces with Traefik)
- Add DISABLE_TELEMETRY env and generate BETTER_AUTH_SECRET as base64

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(phpmyadmin): raise PHP upload limit so SQL imports over 2MB work

Without UPLOAD_LIMIT the phpMyAdmin image keeps PHP's default 2M
post_max_size/upload_max_filesize, so importing any SQL file larger
than 2MB fails with 'POST Content-Length exceeds the limit of
2097152 bytes' followed by a session_start error page.

- Add UPLOAD_LIMIT (512M) and MAX_EXECUTION_TIME (600) env vars,
  configurable from the template env
- Wire the previously unused MYSQL_DATABASE env var into the compose
  file, replacing the hardcoded 'tu_base_de_datos' placeholder, and
  default it to 'phpmyadmin' instead of the system 'mysql' schema

Closes #236

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(openpanel): pin verified 2.2.1 images and fix ClickHouse interserver host

- Pin lindesvard/openpanel-api|dashboard|worker to 2.2.1 (verified working
  end-to-end on a Dokploy instance) instead of the mutable :2 tag, so a
  future broken 2.x release cannot silently break the template again —
  which is how #615 originated when 2.0.0 shipped.
- Fix interserver_http_host to match the actual service name (op-ch),
  aligning with upstream self-hosting config.
- Set meta.json version to the pinned 2.2.1.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(wordpress): route loopback requests through Traefik to fix cURL error 28

WordPress resolves its own public domain to the server's public IP from
inside the container, so REST API / WP-Cron / Site Health loopback
requests depend on hairpin NAT, which times out (cURL error 28) on many
hosts. Pin the site domain to the dokploy-traefik container IP in
/etc/hosts at startup (with retries, since Traefik joins the compose
network shortly after the container starts) so loopback traffic stays
inside the Docker network for both HTTP and HTTPS. No-op fallback when
dokploy-traefik is not resolvable.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(minio): migrate to pgsty/minio community fork (upstream is source-only and archived)

MinIO Inc. stopped publishing Docker images and pre-built binaries in
October 2025 and archived the minio/minio repository in February 2026.
The official minio/minio image is frozen at RELEASE.2025-09-07T16-13-09Z
and no longer receives security fixes (the fix for CVE-2025-62506 was
never published as an image).

- Switch image to pgsty/minio:RELEASE.2026-06-18T00-00-00Z, the actively
  maintained community fork (drop-in replacement, AGPLv3, same env vars,
  same /data on-disk format, restores the full web console)
- Route the S3 API (port 9000) through its own generated domain instead
  of publishing host port 9000, per repo conventions
- Update meta.json links/description to point at the maintained fork

Closes #469

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(nextcloud-aio): drop AIO branding, keep template id, pin nextcloud 33.0.6

The template ships plain nextcloud + mariadb + redis + cron, not the
nextcloud/all-in-one mastercontainer. Display name and description no
longer claim AIO; folder id is kept as nextcloud-aio to avoid breaking
existing installs. Image pinned to the current stable tag (33.0.6).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* feat: add MailCatcher NG template

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs: add per-template setup instructions (supabase, trigger.dev)

Adds instructions.md files for the Supabase and Trigger.dev templates and
renders them in the template browser as a new Instructions tab in the
template dialog (fetched from blueprints/<id>/instructions.md, rendered
with a small dependency-free markdown component).

Also removes the placeholder blueprints/ackee/instructions.md so it does
not surface as an empty Instructions tab.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* feat: add Weblate template

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* feat: add Synapse (Matrix homeserver) template

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* feat: add Dify template

Dify 1.15.0 (open-source LLM app development platform): api + worker +
worker_beat + web + pgvector PostgreSQL (also used as the vector store) +
redis + sandbox + ssrf_proxy (squid) + plugin_daemon, fronted by an
internal nginx gateway that mirrors the upstream path routing.

Closes #88

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* feat: add Sim Studio template

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* feat: add Steedos template

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* feat: add Silex template

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* feat: add SpacetimeDB template

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* feat: add CertMate template

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* feat: add PostHog template

Based on the official hobby deployment, trimmed to run on a single
server: Django web + Celery worker, Node plugin-server (CDP, ingestion,
session replay, recording API), Rust capture/replay-capture/
feature-flags/hypercache, livestream, Caddy path router, Postgres,
Redis, Redpanda (Kafka), ZooKeeper, ClickHouse and MinIO.

Images are pinned to a tested master commit (PostHog no longer
publishes tagged releases); an init container fetches the matching
ClickHouse configuration, Kafka table schemas, funnel UDF binaries and
the GeoIP database at the same pinned ref.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* feat: add Markup template

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* feat: add Frappe LMS template

Adds a Frappe LMS (Frappe Learning) template based on the erpnext-v16
blueprint pattern (configurator + create-site + workers + scheduler +
websocket + mariadb + 3x redis).

Pins ghcr.io/frappe/lms:v2.52.0, the latest upstream image that ships
the lms app (v2.52.1+ images are currently published without any apps
baked in). The image does not bundle the payments app, so create-site
clears lms's required_apps before install; paid-course checkout is
unavailable, everything else works. The backend is gated on a
create-site completion marker so gunicorn workers never serve (and
cache) a half-installed site during the 3-6 minute first boot.

Closes #517

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* feat: add TREK template

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* feat: add Oryx (SRS) media streaming template

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix: stop plugins service crash loop (logs-redis TLS default)

In production images LOGS_REDIS_TLS/TRACES_REDIS_TLS default to true, so
the logs-ingestion consumer (part of the plugin-server default mode) kept
attempting a TLS handshake against the plaintext Redis, timed out every
~11s and killed the process after 10 errors (restart loop every ~2.5 min).

Constrain the plugins service to the capability groups this template
ships (cdp_workflows, realtime_cohorts, feature_flags) and pin the redis
TLS flags to false as belt-and-braces.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* feat: add n8n queue mode template

n8n running in queue mode (EXECUTIONS_MODE=queue): main instance for the
editor/webhooks, a scalable pool of workers (deploy.replicas driven by the
N8N_WORKER_REPLICAS env var), Redis (Bull) as the queue broker and
PostgreSQL as the database. Pinned to the current stable n8nio/n8n:2.30.4.

Closes #455

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* feat: add bonfire template

Bonfire (social flavour) — federated social networking toolkit.
App + PostGIS + Meilisearch, mirroring upstream's reference deployments.

Closes #125

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* feat: add dagu blueprint

Dagu is a self-contained workflow engine with a Web UI for scheduling and
orchestrating jobs as DAGs defined in declarative YAML.

- Pin ghcr.io/dagucloud/dagu:2.10.7 and expose the Web UI on port 8080
- Set DAGU_HOST=0.0.0.0 so the service is reachable through the proxy
- Enable basic auth with a generated per-deploy admin password
- Persist /var/lib/dagu (DAGs, logs, run history) in a named volume

Claude-Session: https://claude.ai/code/session_01CRNT6sa2q2P9rUTokeoGhQ

* feat: add OneUptime template

Adds OneUptime (open-source observability platform: uptime monitoring,
status pages, incident management, on-call, logs/traces/metrics) as a
template, following upstream's current single-app architecture
(app + nginx ingress + postgres + redis + clickhouse + probe).

Closes #514

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* feat: add Mailu template

Mailu 2024.06 mail server: front (nginx), admin, imap (dovecot),
smtp (postfix), antispam (rspamd), Roundcube webmail and redis.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* feat(templates): add systemprompt (#1032)

* feat(templates): add systemprompt

* fix header comment: accurate in both repos

* chore: normalize template tags to kebab-case (#987)

* feat: adds `check-links.js` to find broken links (#983)

* feat: add struxa template (#1037)

* feat: add struxa template

Adds a Dokploy blueprint for Struxa (github.com/struxadotcloud/struxa),
a self-hosted, open-source server management panel. Deploys the
published GHCR images (dashboard, watchkeeper, migrate) plus MySQL
and MinIO sidecars. The web service generates its RS256 JWT keypair
at startup via Node's built-in crypto module, since no Dokploy
template helper covers RSA key generation.

* fix: pin struxa images to latest floating tag

struxa's release workflow pushes a latest floating tag alongside
version tags on every stable release, matching the convention used
by ~44% of existing blueprints (version: "latest" in meta.json).

* fix: generate a 64-char DATABASE_ENCRYPTION_KEY

Dokploy's runtime \${hash:N} helper produces N hex characters, not N
bytes (the templates repo's local preview helpers.ts models it as
byte count, which is inconsistent with the platform). struxa's env
schema requires DATABASE_ENCRYPTION_KEY to be >=64 chars (it's hex
decoded to a 32-byte AES-256 key), so \${hash:32} only produced half
the required length. Confirmed against other blueprints (sim,
chatwoot, outline) which all use \${hash:64} for 64-char secrets.

* fix: address Copilot review comments

- Add explicit \`version: "3.8"\` to docker-compose.yml, matching the
  documented template format.
- Pin minio/minio to a specific RELEASE tag (used elsewhere in the
  repo: plane, posthog) instead of the floating latest tag.
- Default BETTER_AUTH_URL/APP_URL/CORS_ORIGIN to http://, matching
  repo convention for Dokploy-fronted apps (TLS terminates at the
  proxy).

* fix: rename web service to struxa

AGENTS.md convention: the primary Docker service name should match
the blueprint folder name. Renamed the web/dashboard service from
"web" to "struxa" in docker-compose.yml and updated
template.toml's config.domains.serviceName to match.

* Add PodFetch template (#1035)

* Add PodFetch template

* Use env array syntax in template.toml

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* Address review: match version to image tag, expose admin_username variable, dark-mode friendly logo

---------

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* fix(docker): share plugins and themes volumes across containers (#990)

* feat(directus): upgrade template to Directus 12.1.1 (#986)

* feat(directus): upgrade template to Directus 12.1.1

* feat(directus): add commented S3 env variables to template.toml

---------

Co-authored-by: Zakher Masri <46135573+zaaakher@users.noreply.github.com>
Co-authored-by: zakher <zakhermasri@gmail.com>
Co-authored-by: Jinjinov <dzindzinovic@gmail.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Stephan Fitzpatrick <stephan@knowsuchagency.com>
Co-authored-by: Mauricio Siu <mauricio@dokploy.com>
Co-authored-by: Edward Burton <ejb503@gmail.com>
Co-authored-by: Marko Kostich <markokosticdev@gmail.com>
Co-authored-by: Jakub Krzyżanowski <jakubkrzyz.kontakt@gmail.com>
Co-authored-by: SamTV12345 <40429738+SamTV12345@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Mafly <110502739+Nekoplii@users.noreply.github.com>
2026-07-20 01:20:53 -06:00
Mauricio SiuandGitHub c33d499975 Merge branch 'main' into canary 2026-07-20 00:34:19 -06:00
Marko KostichandGitHub b4542d82f8 feat(directus): upgrade template to Directus 12.1.1 (#986)
* feat(directus): upgrade template to Directus 12.1.1

* feat(directus): add commented S3 env variables to template.toml
2026-07-19 19:25:33 -06:00
MaflyandGitHub ceb65b216f fix(docker): share plugins and themes volumes across containers (#990) 2026-07-19 19:24:15 -06:00
8daff07700 Add PodFetch template (#1035)
* Add PodFetch template

* Use env array syntax in template.toml

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* Address review: match version to image tag, expose admin_username variable, dark-mode friendly logo

---------

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
2026-07-19 19:20:01 -06:00
Jakub KrzyżanowskiandGitHub 08d87d8a90 feat: add struxa template (#1037)
* feat: add struxa template

Adds a Dokploy blueprint for Struxa (github.com/struxadotcloud/struxa),
a self-hosted, open-source server management panel. Deploys the
published GHCR images (dashboard, watchkeeper, migrate) plus MySQL
and MinIO sidecars. The web service generates its RS256 JWT keypair
at startup via Node's built-in crypto module, since no Dokploy
template helper covers RSA key generation.

* fix: pin struxa images to latest floating tag

struxa's release workflow pushes a latest floating tag alongside
version tags on every stable release, matching the convention used
by ~44% of existing blueprints (version: "latest" in meta.json).

* fix: generate a 64-char DATABASE_ENCRYPTION_KEY

Dokploy's runtime \${hash:N} helper produces N hex characters, not N
bytes (the templates repo's local preview helpers.ts models it as
byte count, which is inconsistent with the platform). struxa's env
schema requires DATABASE_ENCRYPTION_KEY to be >=64 chars (it's hex
decoded to a 32-byte AES-256 key), so \${hash:32} only produced half
the required length. Confirmed against other blueprints (sim,
chatwoot, outline) which all use \${hash:64} for 64-char secrets.

* fix: address Copilot review comments

- Add explicit \`version: "3.8"\` to docker-compose.yml, matching the
  documented template format.
- Pin minio/minio to a specific RELEASE tag (used elsewhere in the
  repo: plane, posthog) instead of the floating latest tag.
- Default BETTER_AUTH_URL/APP_URL/CORS_ORIGIN to http://, matching
  repo convention for Dokploy-fronted apps (TLS terminates at the
  proxy).

* fix: rename web service to struxa

AGENTS.md convention: the primary Docker service name should match
the blueprint folder name. Renamed the web/dashboard service from
"web" to "struxa" in docker-compose.yml and updated
template.toml's config.domains.serviceName to match.
2026-07-19 19:19:42 -06:00
Zakher MasriandGitHub 8ca2bf9393 feat: adds check-links.js to find broken links (#983) 2026-07-19 19:11:43 -06:00
Marko KostichandGitHub 7aee585368 chore: normalize template tags to kebab-case (#987) 2026-07-19 19:11:40 -06:00
Edward BurtonandGitHub 34f3577b81 feat(templates): add systemprompt (#1032)
* feat(templates): add systemprompt

* fix header comment: accurate in both repos
2026-07-19 19:09:19 -06:00
Mauricio SiuandGitHub fff1708ebd Merge pull request #1033 from Dokploy/feat/mailu
feat: add Mailu mail server template
2026-07-19 19:06:25 -06:00
Mauricio SiuandGitHub c66a1df3cf Merge pull request #1027 from Dokploy/feat/oryx
feat: add Oryx (SRS) media streaming template
2026-07-19 19:05:32 -06:00
Mauricio SiuandGitHub dd12762085 Merge pull request #994 from Jinjinov/add-openhabittracker
Add openhabittracker template
2026-07-19 19:05:24 -06:00
Mauricio SiuandGitHub d6b842c275 Merge pull request #1034 from Dokploy/feat/oneuptime
feat: add OneUptime template
2026-07-17 13:37:12 -06:00
Mauricio SiuandClaude Fable 5 f6245f84dc feat: add Mailu template
Mailu 2024.06 mail server: front (nginx), admin, imap (dovecot),
smtp (postfix), antispam (rspamd), Roundcube webmail and redis.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 17:50:39 -06:00
Mauricio SiuandClaude Fable 5 6683685dae feat: add OneUptime template
Adds OneUptime (open-source observability platform: uptime monitoring,
status pages, incident management, on-call, logs/traces/metrics) as a
template, following upstream's current single-app architecture
(app + nginx ingress + postgres + redis + clickhouse + probe).

Closes #514

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 17:46:15 -06:00
Mauricio SiuandGitHub a3f2655baa Merge pull request #1028 from Dokploy/feat/posthog
feat: add PostHog template
2026-07-14 23:38:37 -06:00
Mauricio SiuandGitHub 13d03f9a92 Merge pull request #1030 from Dokploy/feat/bonfire
feat: add Bonfire template
2026-07-14 23:38:14 -06:00
Mauricio SiuandGitHub 51922e71b6 Merge pull request #1031 from knowsuchagency/add-dagu-template
Add Dagu template
2026-07-14 23:37:53 -06:00
Mauricio SiuandGitHub 3a6f9d709a Merge pull request #1029 from Dokploy/feat/n8n-queue
feat: add n8n queue mode template (scalable workers)
2026-07-14 23:36:47 -06:00
Stephan Fitzpatrick 0beb68a228 feat: add dagu blueprint
Dagu is a self-contained workflow engine with a Web UI for scheduling and
orchestrating jobs as DAGs defined in declarative YAML.

- Pin ghcr.io/dagucloud/dagu:2.10.7 and expose the Web UI on port 8080
- Set DAGU_HOST=0.0.0.0 so the service is reachable through the proxy
- Enable basic auth with a generated per-deploy admin password
- Persist /var/lib/dagu (DAGs, logs, run history) in a named volume

Claude-Session: https://claude.ai/code/session_01CRNT6sa2q2P9rUTokeoGhQ
2026-07-14 16:41:48 -07:00
Mauricio SiuandClaude Fable 5 7d252ead5c feat: add bonfire template
Bonfire (social flavour) — federated social networking toolkit.
App + PostGIS + Meilisearch, mirroring upstream's reference deployments.

Closes #125

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 16:24:32 -06:00
Mauricio SiuandClaude Fable 5 fe94f4ce0b feat: add n8n queue mode template
n8n running in queue mode (EXECUTIONS_MODE=queue): main instance for the
editor/webhooks, a scalable pool of workers (deploy.replicas driven by the
N8N_WORKER_REPLICAS env var), Redis (Bull) as the queue broker and
PostgreSQL as the database. Pinned to the current stable n8nio/n8n:2.30.4.

Closes #455

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 16:15:50 -06:00
Mauricio SiuandClaude Fable 5 3eb1d3b7bd fix: stop plugins service crash loop (logs-redis TLS default)
In production images LOGS_REDIS_TLS/TRACES_REDIS_TLS default to true, so
the logs-ingestion consumer (part of the plugin-server default mode) kept
attempting a TLS handshake against the plaintext Redis, timed out every
~11s and killed the process after 10 errors (restart loop every ~2.5 min).

Constrain the plugins service to the capability groups this template
ships (cdp_workflows, realtime_cohorts, feature_flags) and pin the redis
TLS flags to false as belt-and-braces.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 15:50:16 -06:00
Mauricio SiuandClaude Fable 5 af8b535d34 feat: add Oryx (SRS) media streaming template
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 14:06:04 -06:00
Mauricio SiuandGitHub 15db93df3b Merge pull request #1026 from Dokploy/feat/trek
feat: add TREK template
2026-07-14 14:00:35 -06:00
Mauricio SiuandGitHub cc3b93518b Merge pull request #1025 from Dokploy/feat/frappe-lms
feat: add Frappe LMS template
2026-07-14 14:00:26 -06:00
Mauricio SiuandGitHub e7285cea05 Merge pull request #1023 from Dokploy/feat/certmate
feat: add CertMate template
2026-07-14 14:00:22 -06:00
Mauricio SiuandGitHub a80a073389 Merge pull request #1020 from Dokploy/feat/steedos
feat: add Steedos template
2026-07-14 14:00:01 -06:00
Mauricio SiuandGitHub 77b078faf3 Merge pull request #1019 from Dokploy/feat/sim
feat: add Sim Studio template
2026-07-14 13:59:56 -06:00
Mauricio SiuandGitHub 31f95474d6 Merge pull request #1018 from Dokploy/feat/dify
feat: add Dify template
2026-07-14 13:59:47 -06:00
Mauricio SiuandGitHub fabecbe728 Merge pull request #1017 from Dokploy/feat/synapse
feat: add Synapse (Matrix homeserver) template
2026-07-14 13:59:37 -06:00
Mauricio SiuandGitHub 4159d3a9f0 Merge pull request #1016 from Dokploy/feat/weblate
feat: add Weblate template
2026-07-14 13:59:29 -06:00
Mauricio SiuandGitHub abe36ad330 Merge pull request #1015 from Dokploy/docs/template-instructions
docs: per-template setup instructions for Supabase and Trigger.dev
2026-07-14 13:59:20 -06:00
Mauricio SiuandGitHub 89505f0b54 Merge pull request #1014 from Dokploy/feat/mailcatcher-ng
feat: add MailCatcher NG template
2026-07-14 13:59:11 -06:00
Mauricio SiuandGitHub 981811f55f Merge pull request #1013 from Dokploy/fix/nextcloud-naming
fix(nextcloud-aio): drop AIO branding, pin nextcloud 33.0.6
2026-07-14 13:59:03 -06:00
Mauricio SiuandGitHub ffeaca14af Merge pull request #1012 from Dokploy/fix/minio-source-only
fix(minio): migrate to pgsty/minio community fork (upstream is source-only and archived)
2026-07-14 13:58:55 -06:00
Mauricio SiuandGitHub 77145ad581 Merge pull request #1011 from Dokploy/fix/wordpress-loopback
fix(wordpress): route loopback requests through Traefik to fix cURL error 28 timeouts
2026-07-14 13:58:48 -06:00
Mauricio SiuandGitHub c60bfa8c72 Merge pull request #1010 from Dokploy/fix/openpanel
fix(openpanel): pin verified 2.2.1 images to prevent broken-release breakage
2026-07-14 13:58:40 -06:00
Mauricio SiuandGitHub dd986039a7 Merge pull request #1009 from Dokploy/fix/phpmyadmin
fix(phpmyadmin): raise PHP upload limit so SQL imports over 2MB work
2026-07-14 13:58:32 -06:00
Mauricio SiuandGitHub 0633b987d5 Merge pull request #1008 from Dokploy/fix/rybbit-update
fix(rybbit): update to current version (v2.7.0)
2026-07-14 13:58:05 -06:00
Mauricio SiuandGitHub 5d6afe20a6 Merge pull request #1007 from Dokploy/fix/evolutionapi
fix(evolutionapi): enable integration env flags (n8n/openai/evoai) and update
2026-07-14 13:57:56 -06:00
Mauricio SiuandGitHub 618cda2366 Merge pull request #1006 from Dokploy/fix/databasus-rename
fix: add Databasus template (Postgresus was renamed upstream)
2026-07-14 13:57:48 -06:00
Mauricio SiuandGitHub 74cec8f74f Merge pull request #1004 from Dokploy/fix/signoz-clickhouse
fix(signoz): fix ClickHouse hostname resolution and IPv6 binding
2026-07-14 13:57:40 -06:00
Mauricio SiuandGitHub 64fb0f6573 Merge pull request #1003 from Dokploy/fix/automatisch
fix(automatisch): switch to official image and wire up DOMAIN to fix Bad Gateway
2026-07-14 13:57:31 -06:00
Mauricio SiuandGitHub 9e02e96e3a Merge pull request #1002 from Dokploy/fix/immich-update
fix(immich): update to v3.0.2
2026-07-14 13:57:22 -06:00
Mauricio SiuandClaude Fable 5 59e323483c feat: add TREK template
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 13:57:21 -06:00
Mauricio SiuandGitHub 33c3fcdadb Merge pull request #998 from Dokploy/fix/homarr-volumes
fix(homarr): use named volume for /appdata and 64-char hex encryption key
2026-07-14 13:57:07 -06:00
Mauricio SiuandGitHub 493e824f70 Merge pull request #996 from Dokploy/fix/cockpit-volumes
fix(cockpit): persist config and storage volumes per upstream docs
2026-07-14 13:56:58 -06:00
Mauricio SiuandGitHub 6f27a9427c Merge pull request #995 from Dokploy/fix/affinepro-update
fix(affinepro): update to current AFFiNE images
2026-07-14 13:56:48 -06:00
Mauricio SiuandGitHub f76c31ef89 Merge pull request #1024 from Dokploy/feat/markup
feat: add Markup template
2026-07-14 13:56:16 -06:00
Mauricio SiuandGitHub 478c5197b2 Merge pull request #1021 from Dokploy/feat/silex
feat: add Silex template
2026-07-14 13:53:56 -06:00
Mauricio SiuandClaude Fable 5 8c15db8a2c feat: add Frappe LMS template
Adds a Frappe LMS (Frappe Learning) template based on the erpnext-v16
blueprint pattern (configurator + create-site + workers + scheduler +
websocket + mariadb + 3x redis).

Pins ghcr.io/frappe/lms:v2.52.0, the latest upstream image that ships
the lms app (v2.52.1+ images are currently published without any apps
baked in). The image does not bundle the payments app, so create-site
clears lms's required_apps before install; paid-course checkout is
unavailable, everything else works. The backend is gated on a
create-site completion marker so gunicorn workers never serve (and
cache) a half-installed site during the 3-6 minute first boot.

Closes #517

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 13:53:41 -06:00
Mauricio SiuandGitHub a837539398 Merge pull request #999 from Dokploy/fix/logto-update
fix(logto): fix postgres role error and update to current version
2026-07-14 13:53:28 -06:00
Mauricio SiuandGitHub c33f72b32a Merge pull request #997 from Dokploy/fix/kener-issues
fix(kener): define REDIS_URL and drop unused databases
2026-07-14 13:53:19 -06:00
Mauricio SiuandGitHub 1c2921417d Merge pull request #1001 from Dokploy/fix/zitadel-domain
fix(zitadel): wire EXTERNALDOMAIN to the generated domain
2026-07-14 13:53:00 -06:00
Mauricio SiuandGitHub 6f1b083c57 Merge pull request #1005 from Dokploy/fix/infisical-update
fix(infisical): update to v0.162.6
2026-07-14 13:52:47 -06:00
Mauricio SiuandGitHub bd457e0310 Merge pull request #1022 from Dokploy/feat/spacetimedb
feat: add SpacetimeDB template
2026-07-14 13:52:36 -06:00
Mauricio SiuandGitHub 311faa1ea9 Merge pull request #1000 from Dokploy/fix/gitlab-ce
fix(gitlab-ce): serve on the generated domain (external_url/nginx config)
2026-07-14 13:51:56 -06:00
Mauricio SiuandClaude Fable 5 ee35ed1a42 feat: add Markup template
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 13:47:42 -06:00
Mauricio SiuandClaude Fable 5 7f3a08eb00 feat: add PostHog template
Based on the official hobby deployment, trimmed to run on a single
server: Django web + Celery worker, Node plugin-server (CDP, ingestion,
session replay, recording API), Rust capture/replay-capture/
feature-flags/hypercache, livestream, Caddy path router, Postgres,
Redis, Redpanda (Kafka), ZooKeeper, ClickHouse and MinIO.

Images are pinned to a tested master commit (PostHog no longer
publishes tagged releases); an init container fetches the matching
ClickHouse configuration, Kafka table schemas, funnel UDF binaries and
the GeoIP database at the same pinned ref.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 13:43:38 -06:00
Mauricio SiuandClaude Fable 5 a266e36a4d feat: add CertMate template
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 13:37:16 -06:00
Mauricio SiuandClaude Fable 5 3ddbdde081 feat: add SpacetimeDB template
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 13:30:17 -06:00
Mauricio SiuandClaude Fable 5 0bfb50d62f feat: add Silex template
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 13:19:16 -06:00
Mauricio SiuandClaude Fable 5 62850c3696 feat: add Steedos template
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 13:10:56 -06:00
Mauricio SiuandClaude Fable 5 d1ef9333a3 feat: add Sim Studio template
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 12:41:18 -06:00
Mauricio SiuandClaude Fable 5 1c2dea39c3 feat: add Dify template
Dify 1.15.0 (open-source LLM app development platform): api + worker +
worker_beat + web + pgvector PostgreSQL (also used as the vector store) +
redis + sandbox + ssrf_proxy (squid) + plugin_daemon, fronted by an
internal nginx gateway that mirrors the upstream path routing.

Closes #88

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 12:29:15 -06:00
Mauricio SiuandClaude Fable 5 b23ddd0b98 feat: add Synapse (Matrix homeserver) template
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 12:12:24 -06:00
Mauricio SiuandClaude Fable 5 7683947842 feat: add Weblate template
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 12:07:41 -06:00
Mauricio SiuandClaude Fable 5 03a60bb417 docs: add per-template setup instructions (supabase, trigger.dev)
Adds instructions.md files for the Supabase and Trigger.dev templates and
renders them in the template browser as a new Instructions tab in the
template dialog (fetched from blueprints/<id>/instructions.md, rendered
with a small dependency-free markdown component).

Also removes the placeholder blueprints/ackee/instructions.md so it does
not surface as an empty Instructions tab.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 12:04:30 -06:00
Mauricio SiuandClaude Fable 5 b7c2d6c35d feat: add MailCatcher NG template
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 12:03:04 -06:00
Mauricio SiuandClaude Fable 5 f036ddae92 fix(nextcloud-aio): drop AIO branding, keep template id, pin nextcloud 33.0.6
The template ships plain nextcloud + mariadb + redis + cron, not the
nextcloud/all-in-one mastercontainer. Display name and description no
longer claim AIO; folder id is kept as nextcloud-aio to avoid breaking
existing installs. Image pinned to the current stable tag (33.0.6).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 11:58:34 -06:00
Mauricio SiuandClaude Fable 5 030d9d1089 fix(minio): migrate to pgsty/minio community fork (upstream is source-only and archived)
MinIO Inc. stopped publishing Docker images and pre-built binaries in
October 2025 and archived the minio/minio repository in February 2026.
The official minio/minio image is frozen at RELEASE.2025-09-07T16-13-09Z
and no longer receives security fixes (the fix for CVE-2025-62506 was
never published as an image).

- Switch image to pgsty/minio:RELEASE.2026-06-18T00-00-00Z, the actively
  maintained community fork (drop-in replacement, AGPLv3, same env vars,
  same /data on-disk format, restores the full web console)
- Route the S3 API (port 9000) through its own generated domain instead
  of publishing host port 9000, per repo conventions
- Update meta.json links/description to point at the maintained fork

Closes #469

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 11:55:53 -06:00
Mauricio SiuandClaude Fable 5 af16250561 fix(wordpress): route loopback requests through Traefik to fix cURL error 28
WordPress resolves its own public domain to the server's public IP from
inside the container, so REST API / WP-Cron / Site Health loopback
requests depend on hairpin NAT, which times out (cURL error 28) on many
hosts. Pin the site domain to the dokploy-traefik container IP in
/etc/hosts at startup (with retries, since Traefik joins the compose
network shortly after the container starts) so loopback traffic stays
inside the Docker network for both HTTP and HTTPS. No-op fallback when
dokploy-traefik is not resolvable.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 11:55:19 -06:00
Mauricio SiuandClaude Fable 5 f946051a6c fix(openpanel): pin verified 2.2.1 images and fix ClickHouse interserver host
- Pin lindesvard/openpanel-api|dashboard|worker to 2.2.1 (verified working
  end-to-end on a Dokploy instance) instead of the mutable :2 tag, so a
  future broken 2.x release cannot silently break the template again —
  which is how #615 originated when 2.0.0 shipped.
- Fix interserver_http_host to match the actual service name (op-ch),
  aligning with upstream self-hosting config.
- Set meta.json version to the pinned 2.2.1.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 11:53:37 -06:00
Mauricio SiuandClaude Fable 5 9bdbe266e5 fix(phpmyadmin): raise PHP upload limit so SQL imports over 2MB work
Without UPLOAD_LIMIT the phpMyAdmin image keeps PHP's default 2M
post_max_size/upload_max_filesize, so importing any SQL file larger
than 2MB fails with 'POST Content-Length exceeds the limit of
2097152 bytes' followed by a session_start error page.

- Add UPLOAD_LIMIT (512M) and MAX_EXECUTION_TIME (600) env vars,
  configurable from the template env
- Wire the previously unused MYSQL_DATABASE env var into the compose
  file, replacing the hardcoded 'tu_base_de_datos' placeholder, and
  default it to 'phpmyadmin' instead of the system 'mysql' schema

Closes #236

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 11:47:20 -06:00
Mauricio SiuandClaude Fable 5 25563213f2 fix(rybbit): update to v2.7.0
The template shipped rybbit v1.5.1, which is no longer supported and is
vulnerable to known React2Shell exploits (see #659). Update to the
latest stable release v2.7.0 and align the stack with the upstream
docker-compose:

- Pin ghcr.io/rybbit-io/rybbit-backend and rybbit-client to v2.7.0
- Add the redis service now required by the backend (session tracking
  and BullMQ queues), with password auth, AOF persistence and
  noeviction policy per upstream
- Drop the DOMAIN_NAME env var (only used by the upstream Caddy
  webserver, which Dokploy replaces with Traefik)
- Add DISABLE_TELEMETRY env and generate BETTER_AUTH_SECRET as base64

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 11:39:58 -06:00
Mauricio SiuandClaude Fable 5 fb64197738 fix(evolutionapi): enable integration flags and update version
Adds the integration enable env flags introduced in Evolution API v2.3.x
(N8N_ENABLED, OPENAI_ENABLED, EVOAI_ENABLED, DIFY_ENABLED, TYPEBOT_ENABLED,
CHATWOOT_ENABLED) so integrations no longer fail with 'N8n is disabled',
and pins the image to v2.3.7 instead of latest.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 11:38:27 -06:00
Mauricio SiuandClaude Fable 5 cd16441901 fix: add databasus (postgresus renamed upstream)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 11:36:03 -06:00
Mauricio SiuandClaude Fable 5 29a7970397 fix(infisical): update to v0.162.6
- Bump image from v0.135.0-postgres to v0.162.6 (upstream dropped the
  -postgres tag suffix after v0.146.0; plain tags are the postgres build)
- Remove the db-migration service: the standalone image runs database
  migrations automatically on boot (auto-start-migrations), matching the
  official docker-compose.prod.yml which no longer ships that service
- Generate ENCRYPTION_KEY (${hash:32}) and AUTH_SECRET (${base64:32})
  per deployment instead of shipping hardcoded example secrets
- Fix SITE_URL to http://${main_domain} (no :8080; the domain is proxied)
- Refresh SMTP env names (SMTP_FROM_ADDRESS/SMTP_FROM_NAME; SMTP_SECURE
  was removed upstream) and drop unused CLIENT_* env placeholders that
  were never passed to the container

Closes #215

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 11:30:46 -06:00
Mauricio SiuandClaude Fable 5 1e486813b4 fix(signoz): fix ClickHouse hostname resolution and IPv6 binding
- Override the ClickHouse image's config.d/docker_related_config.xml,
  which listens on the IPv6 wildcard address ([::]) first and fails to
  bind on hosts without IPv6 support; listen on 0.0.0.0 (IPv4) only and
  disable the internal DNS cache so transient startup DNS failures for
  zookeeper-1/clickhouse are not cached (issue #534).
- Set hostname: clickhouse (instead of container_name) so the server
  identifies itself as the cluster host declared in cluster.xml.
- Remove the explicit signoz-net network: Dokploy attaches its own
  networks automatically and the repo validator rejects explicit
  networks; a fixed-name shared network also breaks service DNS across
  deployments.
- Fix mount mismatch: template.toml created files/signoz/prometheus.xml
  while the compose mounts ../files/signoz/prometheus.yml, so Docker
  silently mounted a directory as the signoz prometheus config.
- Give the otel-collector domain its own generated host: both domains
  previously shared the same host and path "/", creating two conflicting
  Traefik routers where one service randomly won.

Closes #534

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 11:30:07 -06:00
Mauricio SiuandClaude Fable 5 3c416eaba3 fix(automatisch): switch to official image and wire up DOMAIN to fix Bad Gateway
- Replace unofficial dockeriddonuts/automatisch:2.0 mirror (stale since Nov 2024)
  with the official automatischio/automatisch:0.15.0 image
- Define DOMAIN in template.toml [config.env]: the compose referenced ${DOMAIN}
  but it was never provided, so HOST resolved empty and the app generated
  localhost URLs for the web app and webhooks
- Set API_URL/WEB_APP_URL so generated URLs don't carry the internal :3000 port
  behind Traefik
- Add postgres healthcheck and gate the app on service_healthy to avoid the
  boot-time migration race; worker now starts after main (official compose order)
- Drop unnecessary published port and no-op REDIS_* env on the redis service
- Bump meta.json version to 0.15.0

Closes #97

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 11:28:22 -06:00
Mauricio SiuandClaude Fable 5 31158e2340 fix(immich): update to v3.0.2
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 11:19:38 -06:00
Mauricio SiuandClaude Fable 5 6786237720 fix(zitadel): wire EXTERNALDOMAIN/PORT/SECURE to the generated domain
Zitadel resolves its instance from the external domain/port/scheme, so the
template's ZITADEL_EXTERNALPORT=8080 made every generated URL (OIDC issuer,
login redirects) point at http://<domain>:8080 instead of the domain served
by Traefik, ending in {"code":5,"message":"Not Found"} (#516).

- Expose ZITADEL_EXTERNALDOMAIN / ZITADEL_EXTERNALPORT / ZITADEL_EXTERNALSECURE
  as template env vars, defaulting to the generated domain over HTTP
  (port 80, secure=false) so the routed domain and Zitadel's external config
  always match; HTTPS users flip them to 443/true in the Env tab.
- Pin image to v4.16.0 (was latest) and keep the built-in login v1 via
  ZITADEL_DEFAULTINSTANCE_FEATURES_LOGINV2_REQUIRED=false so no separate
  login-v2 container is needed.
- Add the official readiness healthcheck, drop the unused /app/data volume,
  bogus SMTP env keys, published port and obsolete compose version key.

Closes #516

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 11:12:30 -06:00
Mauricio SiuandClaude Fable 5 8f84a52855 fix(gitlab-ce): serve on the generated domain (remove removed unicorn config, pin omnibus)
The template set unicorn['worker_processes'] / unicorn['worker_timeout'] in
GITLAB_OMNIBUS_CONFIG. Unicorn was removed in GitLab 14.0, so on current
gitlab-ce images `gitlab-ctl reconfigure` aborts with "Removed configurations
found in gitlab.rb" and GitLab never starts serving — the generated domain
returned 502 Bad Gateway (issue #380).

Rewrite the template as the official all-in-one Omnibus setup:
- pin gitlab/gitlab-ce:19.1.2-ce.0 instead of :latest
- external_url http://<domain> with nginx listen_port 80 / listen_https false
  (TLS terminates at Traefik)
- set gitlab_rails['initial_root_password'] from a generated template password
- puma single mode + prometheus monitoring off to keep memory reasonable
- drop the external postgres/redis containers (Omnibus bundles and manages
  its own) and the broken ports entries ("2224" published a random host port
  while sshd listens on 22)

Verified on a live Dokploy instance: domain serves the GitLab sign-in page
and root login with the generated password works.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 11:11:25 -06:00
Mauricio SiuandClaude Fable 5 7ed8450cf8 fix(logto): fix postgres role error and update to 1.41.0
The postgres healthcheck ran pg_isready without -U while POSTGRES_USER
was set to logto, so every probe attempted to connect as role
"postgres" and spammed FATAL: role "postgres" does not exist.
Pass -U logto -d logto explicitly and set POSTGRES_DB.

Also fix LOGTO_ENDPOINT pointing at the admin domain instead of the
main domain, update Logto 1.27.0 -> 1.41.0, use ${password:32} for the
generated password, drop the ephemeral host port publishing and add
restart policies.

Closes #130

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 11:04:17 -06:00
Mauricio SiuandClaude Fable 5 c6a0b1b1b5 fix(homarr): use named volume for /appdata and hex encryption key
- Replace the relative bind mount `../homarr/appdata:/appdata` with a
  named volume `homarr_appdata:/appdata` so the data survives cleanups
  and can be backed up through Dokploy volume backups.
- Generate SECRET_ENCRYPTION_KEY with `${hash:64}` instead of
  `${password:64}`: homarr requires a 64-character hex string
  (`openssl rand -hex 32`) and the password helper emits non-hex
  characters (g-z).

Closes #738

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 10:58:33 -06:00
Mauricio SiuandClaude Fable 5 55aa82489d fix(cockpit): persist config and storage volumes per upstream docs
The template mounted `html:/var/www/html` (freezing the app code from the
first deploy) and `data:/var/www/html/storage/data`, which misses uploaded
assets (stored under `storage/uploads`) and cache. Per the official Cockpit
persistent-storage docs, mount `config:/var/www/html/config` and
`storage:/var/www/html/storage` instead.

Closes #549

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 10:55:57 -06:00
Mauricio SiuandClaude Fable 5 59770d4ae8 fix(affinepro): update to current AFFiNE images
The template pinned ghcr.io/toeverything/affine-graphql:stable-780dd83,
an ephemeral per-commit tag on the old image name that has since been
removed from GHCR, so the template could no longer pull and deploy.

- Switch both app and migration services to ghcr.io/toeverything/affine:stable,
  the rolling stable tag recommended by the official self-host compose,
  so the template no longer rots when per-commit tags are garbage-collected
- Move postgres to pgvector/pgvector:pg16 and set AFFINE_INDEXER_ENABLED=false,
  matching the current upstream self-host compose requirements
- Add postgres/redis healthchecks and proper depends_on conditions so the
  self-host-predeploy migration job runs only once the database is ready,
  and the server starts only after migrations complete successfully

Closes #777

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 10:55:42 -06:00
Jinjinov 6d56faf0ed Add openhabittracker blueprint 2026-07-13 23:25:21 +02:00
Mauricio SiuandGitHub a34def7060 Merge pull request #985 from H3xKatana/fix/kener-add-redis
fix(kener): add required Redis service to fix REDIS_URL crash
2026-07-08 14:12:11 -06:00
0xkatana c345475d68 fix: add required Redis service to Kener template
Kener v4 requires Redis for BullMQ background queues. Without it, the
application crashes on startup with 'REDIS_URL is not defined' error.

Changes:
- Add Redis 7 Alpine service with healthcheck
- Pin Kener image to v4.1.1 (was 'latest')
- Add REDIS_URL env var pointing to redis://redis:6379
- Remove unused postgres and mysql services (SQLite is the default)
- Remove unused env vars for removed DB services
- Use expose instead of ports (Dokploy convention)
- Add depends_on with service_healthy condition for Redis

Fixes https://github.com/Dokploy/templates/issues/976
2026-07-08 20:07:23 +01:00
Mauricio SiuandGitHub decfac62c9 Merge pull request #980 from Dokploy/canary
New 85 Templates
2026-07-08 11:04:02 -06:00
1265 changed files with 36244 additions and 4592 deletions
+163
View File
@@ -0,0 +1,163 @@
name: Audit All Blueprints
# The per-PR validators only look at blueprints a PR touches, which is the right
# call for CI cost but means a template is checked when it lands and then never
# again. When a rule is added or tightened, every existing blueprint that breaks
# it stays broken with nothing surfacing it (see #1047).
#
# This job runs the same validators over ALL blueprints on a schedule, so drift
# is reported instead of accumulating. It never runs on pull_request, so it
# cannot block a contributor for a pre-existing problem they did not introduce.
on:
schedule:
# Mondays, 04:00 UTC
- cron: "0 4 * * 1"
workflow_dispatch:
inputs:
fail_on_findings:
description: "Exit non-zero when findings exist (default: report only)"
type: boolean
default: false
permissions:
contents: read
jobs:
audit:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: 20.16.0
- name: Set up pnpm
uses: pnpm/action-setup@v4
with:
version: 8
- name: Install dependencies
run: cd build-scripts && pnpm install
- name: Validate per-template metadata
run: node build-scripts/generate-meta.js --check
- name: Audit every blueprint
id: audit
run: |
# $RUNNER_TEMP is per-job; also cleared explicitly so a re-run or a
# partially-executed earlier step can never leak into the summary.
WORK="${RUNNER_TEMP:-/tmp}"
OUT="$WORK/validator-out.txt"
REPORT="$WORK/audit-report.md"
SUMMARY="$WORK/audit-summary.md"
rm -f "$OUT" "$REPORT" "$SUMMARY"
COMPOSE_FAILED=""
TOML_FAILED=""
for dir in blueprints/*/; do
id="$(basename "$dir")"
# Run unconditionally: a blueprint with no docker-compose.yml or no
# template.toml is itself a finding, and the validators already
# report a missing file clearly. Skipping them would hide exactly
# the blueprints most likely to be broken.
if ! (cd build-scripts && pnpm exec tsx validate-docker-compose.ts \
--file "../$dir/docker-compose.yml") > "$OUT" 2>&1; then
COMPOSE_FAILED="$COMPOSE_FAILED $id"
{
echo "### \`$id\` — docker-compose.yml"
echo '```'
grep '❌' "$OUT" || cat "$OUT"
echo '```'
} >> "$REPORT"
fi
if ! (cd build-scripts && pnpm exec tsx validate-template.ts \
--dir "../$dir") > "$OUT" 2>&1; then
TOML_FAILED="$TOML_FAILED $id"
{
echo "### \`$id\` — template.toml"
echo '```'
grep '❌' "$OUT" || cat "$OUT"
echo '```'
} >> "$REPORT"
fi
done
COMPOSE_COUNT=$(echo $COMPOSE_FAILED | wc -w | tr -d ' ')
TOML_COUNT=$(echo $TOML_FAILED | wc -w | tr -d ' ')
TOTAL=$(ls -d blueprints/*/ | wc -l | tr -d ' ')
{
echo "## Blueprint audit"
echo ""
echo "| check | failing | of |"
echo "| --- | --- | --- |"
echo "| \`validate-docker-compose.ts\` | $COMPOSE_COUNT | $TOTAL |"
echo "| \`validate-template.ts\` | $TOML_COUNT | $TOTAL |"
echo ""
} > "$SUMMARY"
if [ -f "$REPORT" ]; then
cat "$REPORT" >> "$SUMMARY"
else
echo "No findings." >> "$SUMMARY"
fi
# The step summary caps at ~1MB and truncates silently past it, which
# would hide findings exactly as the backlog grows. Bound what we
# append and point at the artifact for the rest.
SUMMARY_LIMIT=$((512 * 1024))
SUMMARY_BYTES=$(wc -c < "$SUMMARY" | tr -d ' ')
if [ "$SUMMARY_BYTES" -gt "$SUMMARY_LIMIT" ]; then
# Emit the header table only, never a byte-sliced prefix: cutting
# mid-``` leaves an unclosed code fence, which swallows the notice
# below it and makes the truncation invisible in the rendered summary.
{
head -n 7 "$SUMMARY"
echo ""
echo "_Report omitted: $SUMMARY_BYTES bytes exceeds the $SUMMARY_LIMIT byte budget for a job summary._"
echo "_Download the \`blueprint-audit\` artifact for the complete output._"
} >> "$GITHUB_STEP_SUMMARY"
else
cat "$SUMMARY" >> "$GITHUB_STEP_SUMMARY"
fi
# Always published, so the full report survives regardless of size.
cp "$SUMMARY" "$WORK/blueprint-audit.md"
echo "report_path=$WORK/blueprint-audit.md" >> "$GITHUB_OUTPUT"
echo "compose_failed=$COMPOSE_COUNT" >> "$GITHUB_OUTPUT"
echo "toml_failed=$TOML_COUNT" >> "$GITHUB_OUTPUT"
if [ "$COMPOSE_COUNT" != "0" ] || [ "$TOML_COUNT" != "0" ]; then
echo "::warning::$COMPOSE_COUNT compose and $TOML_COUNT template.toml findings across $TOTAL blueprints"
fi
- name: Upload the full report
if: always() && steps.audit.outputs.report_path != ''
uses: actions/upload-artifact@v4
with:
name: blueprint-audit
path: ${{ steps.audit.outputs.report_path }}
retention-days: 30
- name: Fail if requested
# `inputs` is only populated for workflow_dispatch; on a schedule run it
# is not available, so gate on the event first and read the value through
# github.event.inputs, which is an empty string when absent.
if: >-
github.event_name == 'workflow_dispatch' &&
github.event.inputs.fail_on_findings == 'true' &&
(steps.audit.outputs.compose_failed != '0' || steps.audit.outputs.toml_failed != '0')
run: |
echo "❌ Findings present and fail_on_findings was requested."
exit 1
+5 -6
View File
@@ -123,13 +123,12 @@ This document provides essential context for AI models interacting with this pro
- Ensure the `id` in `blueprints/<id>/meta.json` exactly matches the blueprint folder name (lowercase kebab-case).
- **Docker Compose Conventions (CRITICAL):**
- **Version:** MUST be `3.8`
- **NEVER include:** `ports` (use `expose` only), `container_name`, `networks` (Dokploy handles isolation)
- **ALWAYS include:** `restart: unless-stopped` or `restart: always`, persistent volumes
- **Service naming:** MUST match blueprint folder name exactly
- **Example:**
- **Image source:** Prefer pinned Docker images from registries (`image: ghost:6-alpine`). When no official published images are available, use Docker Compose `build` with a Git context (e.g., `context: "https://github.com/..."#main`, see `blueprints/opendots` for an example building both `app` and `browser` targets from the upstream repository).
- **Example (with pinned image):**
```yaml
version: "3.8"
services:
ghost:
image: ghost:6-alpine
@@ -162,7 +161,7 @@ This document provides essential context for AI models interacting with this pro
- **Required fields:** `id`, `name`, `version`, `description`, `links` (with `github`), `logo`, `tags` (array)
- **Tags:** Lowercase strings (e.g., `["monitoring", "database"]`)
- **Version:** MUST match Docker image version in docker-compose.yml
- **Version:** MUST match Docker image version in docker-compose.yml when using `image:`. When building from source (using `build:` with a Git context), the version should reflect the template's own version or the upstream project's version (e.g., `"latest"` for tracking `main` branch).
- **Logo:** Filename only (e.g., `"ghost.jpeg"`), file must exist in blueprint folder
- **Frontend Development:**
@@ -183,8 +182,8 @@ This document provides essential context for AI models interacting with this pro
- **Dependencies:**
- When adding new templates, ensure Docker images are pinned to specific versions
- Update meta.json with exact version matching Docker Compose image version
- When adding new templates, prefer pinned Docker images to specific versions when available
- Update meta.json with exact version matching Docker Compose image version (for `image:`), or the template/upstream version (for `build:` from source)
- For frontend dependencies: Use `pnpm add <package>` in `app/` directory
- For root dependencies: Use `npm install <package>` in root directory
-2
View File
@@ -32,13 +32,11 @@ To add a new template, follow these steps:
1. **Create a Folder in `blueprints/`**: Name it after the template (e.g., `grafana`). Use lowercase with hyphens for multi-word names.
2. **Add `docker-compose.yml`**: Define the services, volumes, and other Compose configurations. Key guidelines:
- Use `version: "3.8"` or later.
- Avoid exposing ports explicitly (e.g., no `ports: - "3000:3000"`; just `- 3000` if needed for internal reference).
- Do not use `container_name`.
- Avoid custom networks like `dokploy-network`; Dokploy handles isolation automatically.
- Example for Grafana:
```yaml
version: "3.8"
services:
grafana:
image: grafana/grafana-enterprise:9.5.20
+1 -2
View File
@@ -35,7 +35,6 @@ Let's suppose you want to add the [Grafana](https://grafana.com/) template to th
2. Add the `docker-compose.yml` file to the folder
```yaml
version: "3.8"
services:
grafana:
image: grafana/grafana-enterprise:9.5.20
@@ -183,7 +182,7 @@ services:
- 3000:3000
# Instead use this way:
ports:
expose:
- 3000
```
+10 -1
View File
@@ -4,7 +4,16 @@
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/logo.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Dokploy Blueprints</title>
<link rel="canonical" href="https://dokploy.com/templates" />
<meta name="description" content="Browse 500+ open source Docker templates and one-click self-hosted apps to deploy with Dokploy – databases, CMS, analytics, AI tools and more." />
<meta property="og:title" content="Dokploy Templates: 500+ Open Source Apps" />
<meta property="og:description" content="Browse 500+ open source Docker templates and one-click self-hosted apps to deploy with Dokploy – databases, CMS, analytics, AI tools and more." />
<meta property="og:type" content="website" />
<meta property="og:url" content="https://templates.dokploy.com" />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content="Dokploy Templates: 500+ Open Source Apps" />
<meta name="twitter:description" content="Browse 500+ open source Docker templates and one-click self-hosted apps to deploy with Dokploy – databases, CMS, analytics, AI tools and more." />
<title>Dokploy Templates: 500+ Open Source Apps</title>
</head>
<body>
<div id="root"></div>
+3 -3
View File
@@ -35,13 +35,13 @@
"next-themes": "^0.4.6",
"react": "^19.2.0",
"react-dom": "^19.2.0",
"react-router-dom": "^7.9.4",
"react-router-dom": "^7.18.0",
"sonner": "^2.0.7",
"tailwind-merge": "^3.3.1",
"tailwindcss": "^4.1.16",
"tailwindcss-animate": "^1.0.7",
"vite-plugin-static-copy": "^2.3.2",
"yaml": "2.7.1",
"yaml": "2.8.3",
"zustand": "^5.0.8"
},
"devDependencies": {
@@ -51,6 +51,6 @@
"@vitejs/plugin-react": "^4.7.0",
"globals": "^15.15.0",
"typescript": "~5.7.3",
"vite": "^6.4.1"
"vite": "^6.4.3"
}
}
+349 -283
View File
File diff suppressed because it is too large Load Diff
+17 -15
View File
@@ -109,20 +109,22 @@ const Search = () => {
</div>
</div>
<Input
type="text"
placeholder="Search templates..."
value={searchQuery}
onChange={handleSearchChange}
className="w-full p-6"
/>
{searchQuery.length > 0 ? (
<div className="cursor-pointer" onClick={handleClearSearch}>
<XIcon className="absolute end-3 translate-y-3.5 top-1/2 h-5 w-5 text-gray-400" />
</div>
) : (
<SearchIcon className="absolute end-3 translate-y-2 top-1/2 lg:size-5 size-4 text-gray-400" />
)}
<div className="relative">
<Input
type="text"
placeholder="Search templates..."
value={searchQuery}
onChange={handleSearchChange}
className="w-full"
/>
{searchQuery.length > 0 ? (
<div className="cursor-pointer" onClick={handleClearSearch}>
<XIcon className="absolute end-3 top-1/2 -translate-y-1/2 h-5 w-5 text-gray-400" />
</div>
) : (
<SearchIcon className="absolute end-3 top-1/2 -translate-y-1/2 lg:size-5 size-4 text-gray-400" />
)}
</div>
</div>
<div className="flex flex-row gap-2 justify-between">
@@ -154,7 +156,7 @@ const Search = () => {
<ChevronsUpDown className="ml-2 h-4 w-4 shrink-0 opacity-50" />
</Button>
</PopoverTrigger>
<PopoverContent className="w-[200px] p-0">
<PopoverContent className="w-50 p-0">
<Command shouldFilter={false}>
<CommandInput
placeholder="Search tags...."
+36 -1
View File
@@ -14,6 +14,7 @@ import { Tabs, TabsContent, TabsList, TabsTrigger } from "./ui/tabs";
import { Label } from "./ui/label";
import { Clipboard } from "lucide-react";
import { Input } from "./ui/input";
import Markdown from "./ui/markdown";
interface Template {
id: string;
@@ -32,6 +33,7 @@ interface Template {
interface TemplateFiles {
dockerCompose: string | null;
config: string | null;
instructions: string | null;
}
interface TemplateDialogProps {
@@ -169,8 +171,23 @@ const TemplateDialog: React.FC<TemplateDialogProps> = ({
</div>
</div>
)}
<Tabs defaultValue="docker-compose" className="w-full">
<Tabs
defaultValue={
templateFiles?.instructions
? "instructions"
: "docker-compose"
}
className="w-full"
>
<TabsList className="w-full justify-start">
{templateFiles?.instructions && (
<TabsTrigger
value="instructions"
className="data-[state=active]:font-bold"
>
Instructions
</TabsTrigger>
)}
<TabsTrigger
value="docker-compose"
className="data-[state=active]:font-bold"
@@ -184,6 +201,24 @@ const TemplateDialog: React.FC<TemplateDialogProps> = ({
Configuration
</TabsTrigger>
</TabsList>
{templateFiles?.instructions && (
<TabsContent value="instructions" className="mt-4">
<div className="space-y-2">
<Label className="flex flex-col items-start w-fit justify-start gap-1">
<span className="leading-tight text-xl font-semibold">
Setup Instructions
</span>
<span className="leading-tight text-sm text-gray-500">
instructions.md
</span>
</Label>
<div className="rounded-md border p-4">
<Markdown content={templateFiles.instructions} />
</div>
</div>
</TabsContent>
)}
<TabsContent value="docker-compose" className="mt-4">
{templateFiles?.dockerCompose && (
<div className="space-y-2">
+21 -6
View File
@@ -28,6 +28,7 @@ interface Template {
interface TemplateFiles {
dockerCompose: string | null;
config: string | null;
instructions: string | null;
}
interface TemplateGridProps {
@@ -80,20 +81,34 @@ const TemplateGrid: React.FC<TemplateGridProps> = ({ view }) => {
const fetchTemplateFiles = async (templateId: string) => {
setModalLoading(true);
try {
const [dockerComposeRes, configRes] = await Promise.all([
fetch(`/blueprints/${templateId}/docker-compose.yml`),
fetch(`/blueprints/${templateId}/template.toml`),
]);
const [dockerComposeRes, configRes, instructionsRes] = await Promise.all(
[
fetch(`/blueprints/${templateId}/docker-compose.yml`),
fetch(`/blueprints/${templateId}/template.toml`),
fetch(`/blueprints/${templateId}/instructions.md`),
]
);
const dockerCompose = dockerComposeRes.ok
? await dockerComposeRes.text()
: null;
const config = configRes.ok ? await configRes.text() : null;
setTemplateFiles({ dockerCompose, config });
// Guard against SPA fallbacks that return index.html with a 200 status
// for templates that don't have an instructions.md file.
const instructionsIsMarkdown =
instructionsRes.ok &&
!(instructionsRes.headers.get("content-type") || "").includes(
"text/html"
);
const instructions = instructionsIsMarkdown
? await instructionsRes.text()
: null;
setTemplateFiles({ dockerCompose, config, instructions });
} catch (err) {
console.error("Error fetching template files:", err);
setTemplateFiles({ dockerCompose: null, config: null });
setTemplateFiles({ dockerCompose: null, config: null, instructions: null });
} finally {
setModalLoading(false);
}
+177
View File
@@ -0,0 +1,177 @@
import React from "react";
// Minimal markdown renderer (no external dependencies) for the per-template
// instructions.md files. Supports headings, paragraphs, fenced code blocks,
// ordered/unordered lists, and inline code / bold / links.
const INLINE_PATTERN =
/(`[^`]+`)|(\*\*[^*]+\*\*)|(\[[^\]]+\]\([^)\s]+\))/g;
const renderInline = (text: string): React.ReactNode[] => {
const nodes: React.ReactNode[] = [];
let lastIndex = 0;
let key = 0;
let match: RegExpExecArray | null;
INLINE_PATTERN.lastIndex = 0;
while ((match = INLINE_PATTERN.exec(text)) !== null) {
if (match.index > lastIndex) {
nodes.push(text.slice(lastIndex, match.index));
}
const token = match[0];
if (token.startsWith("`")) {
nodes.push(
<code
key={key++}
className="px-1.5 py-0.5 rounded bg-muted font-mono text-[0.85em]"
>
{token.slice(1, -1)}
</code>
);
} else if (token.startsWith("**")) {
nodes.push(<strong key={key++}>{token.slice(2, -2)}</strong>);
} else {
const link = /^\[([^\]]+)\]\(([^)\s]+)\)$/.exec(token);
if (link) {
nodes.push(
<a
key={key++}
href={link[2]}
target="_blank"
rel="noopener noreferrer"
className="text-blue-600 dark:text-blue-400 underline underline-offset-2"
>
{link[1]}
</a>
);
} else {
nodes.push(token);
}
}
lastIndex = match.index + token.length;
}
if (lastIndex < text.length) {
nodes.push(text.slice(lastIndex));
}
return nodes;
};
const HEADING_CLASSES: Record<number, string> = {
1: "text-2xl font-bold mt-2",
2: "text-xl font-semibold mt-6 border-b pb-1",
3: "text-lg font-semibold mt-4",
4: "text-base font-semibold mt-3",
};
interface MarkdownProps {
content: string;
}
const Markdown: React.FC<MarkdownProps> = ({ content }) => {
const lines = content.replace(/\r\n/g, "\n").split("\n");
const blocks: React.ReactNode[] = [];
let key = 0;
let i = 0;
while (i < lines.length) {
const line = lines[i];
// Blank line
if (line.trim() === "") {
i++;
continue;
}
// Fenced code block
if (line.trim().startsWith("```")) {
const code: string[] = [];
i++;
while (i < lines.length && !lines[i].trim().startsWith("```")) {
code.push(lines[i]);
i++;
}
i++; // skip closing fence
blocks.push(
<pre
key={key++}
className="bg-muted rounded-md p-4 overflow-x-auto text-sm font-mono whitespace-pre"
>
<code>{code.join("\n")}</code>
</pre>
);
continue;
}
// Heading
const heading = /^(#{1,4})\s+(.*)$/.exec(line);
if (heading) {
const level = heading[1].length;
const Tag = `h${Math.min(level + 1, 6)}` as keyof React.JSX.IntrinsicElements;
blocks.push(
<Tag key={key++} className={HEADING_CLASSES[level]}>
{renderInline(heading[2])}
</Tag>
);
i++;
continue;
}
// Unordered list
if (/^[-*]\s+/.test(line)) {
const items: string[] = [];
while (i < lines.length && /^[-*]\s+/.test(lines[i])) {
items.push(lines[i].replace(/^[-*]\s+/, ""));
i++;
}
blocks.push(
<ul key={key++} className="list-disc pl-6 space-y-1">
{items.map((item, idx) => (
<li key={idx}>{renderInline(item)}</li>
))}
</ul>
);
continue;
}
// Ordered list
if (/^\d+\.\s+/.test(line)) {
const items: string[] = [];
while (i < lines.length && /^\d+\.\s+/.test(lines[i])) {
items.push(lines[i].replace(/^\d+\.\s+/, ""));
i++;
}
blocks.push(
<ol key={key++} className="list-decimal pl-6 space-y-1">
{items.map((item, idx) => (
<li key={idx}>{renderInline(item)}</li>
))}
</ol>
);
continue;
}
// Paragraph: consume consecutive plain lines
const paragraph: string[] = [line];
i++;
while (
i < lines.length &&
lines[i].trim() !== "" &&
!/^(#{1,4})\s+/.test(lines[i]) &&
!/^[-*]\s+/.test(lines[i]) &&
!/^\d+\.\s+/.test(lines[i]) &&
!lines[i].trim().startsWith("```")
) {
paragraph.push(lines[i]);
i++;
}
blocks.push(
<p key={key++} className="leading-relaxed">
{renderInline(paragraph.join(" "))}
</p>
);
}
return <div className="space-y-3 text-sm">{blocks}</div>;
};
export default Markdown;
+2 -2
View File
@@ -5,7 +5,7 @@ import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuTrigger,
DropdownMenuTrigger,
} from "./components/ui/dropdown-menu"
import { useTheme } from "./theme-provider"
@@ -13,7 +13,7 @@ export function ModeToggle() {
const { setTheme } = useTheme()
return (
<DropdownMenu>
<DropdownMenu modal={false}>
<DropdownMenuTrigger asChild>
<Button variant="outline" size="icon">
<Sun className="h-[1.2rem] w-[1.2rem] rotate-0 scale-100 transition-all dark:-rotate-90 dark:scale-0" />
+22
View File
@@ -0,0 +1,22 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
<defs>
<linearGradient id="bg" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#101a3a"/><stop offset="1" stop-color="#050913"/></linearGradient>
<linearGradient id="rim" x1="0" y1="0" x2="1" y2="1"><stop offset="0" stop-color="#7c6cff"/><stop offset="1" stop-color="#2de2ff"/></linearGradient>
</defs>
<rect x="6" y="6" width="500" height="500" rx="116" fill="url(#bg)" stroke="url(#rim)" stroke-width="12"/>
<polygon points="256.0,181.5 442.0,288.8 256.0,396.2 70.0,288.8" fill="#2de2ff" fill-opacity="0.12" stroke="#2de2ff" stroke-width="9" stroke-linejoin="round"/>
<polygon points="195.5,237.8 256.0,272.7 256.0,197.6 195.5,162.7" fill="#4f3fd0"/>
<polygon points="316.5,237.8 256.0,272.7 256.0,197.6 316.5,162.7" fill="#7c6cff"/>
<polygon points="256.0,127.8 316.5,162.7 256.0,197.6 195.5,162.7" fill="#b3abff"/>
<line x1="208.8" y1="219.2" x2="242.7" y2="238.8" stroke="#2bff9a" stroke-width="11" stroke-linecap="round"/>
<line x1="208.8" y1="194.4" x2="242.7" y2="213.9" stroke="#2bff9a" stroke-width="11" stroke-linecap="round"/>
<polygon points="283.9,288.8 344.3,323.7 344.3,211.0 283.9,176.1" fill="#0f9cbb"/>
<polygon points="404.8,288.8 344.3,323.7 344.3,211.0 404.8,176.1" fill="#2de2ff"/>
<polygon points="344.4,141.2 404.8,176.1 344.3,211.0 283.9,176.1" fill="#b3f6ff"/>
<line x1="297.2" y1="257.1" x2="331.1" y2="276.6" stroke="#2bff9a" stroke-width="11" stroke-linecap="round"/>
<line x1="297.2" y1="219.9" x2="331.1" y2="239.4" stroke="#2bff9a" stroke-width="11" stroke-linecap="round"/>
<polygon points="195.6,339.9 256.0,374.8 256.0,315.7 195.6,280.8" fill="#2856c8"/>
<polygon points="316.4,339.9 256.0,374.8 256.0,315.7 316.4,280.8" fill="#4f8bff"/>
<polygon points="256.0,245.9 316.4,280.8 256.0,315.7 195.6,280.8" fill="#a8c8ff"/>
<line x1="208.8" y1="318.0" x2="242.7" y2="337.5" stroke="#2bff9a" stroke-width="11" stroke-linecap="round"/>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

+10
View File
@@ -0,0 +1,10 @@
services:
3dokploy:
image: ghcr.io/suleyman/3dokploy:0.1.1
restart: unless-stopped
environment:
- DOKPLOY_URL=${DOKPLOY_URL}
- DOKPLOY_API_KEY=${DOKPLOY_API_KEY}
- BASIC_AUTH=${BASIC_AUTH}
extra_hosts:
- host.docker.internal:host-gateway
+13
View File
@@ -0,0 +1,13 @@
{
"id": "3dokploy",
"name": "3Dokploy",
"version": "0.1.1",
"description": "A live, isometric 3D view of your Dokploy: projects as buildings, services as racks, deploys rolling in on carts, network traffic as packets. Read-only.",
"logo": "3dokploy.svg",
"links": {
"github": "https://github.com/suleyman/3dokploy",
"website": "",
"docs": "https://github.com/suleyman/3dokploy#readme"
},
"tags": ["monitoring", "dashboard", "devops"]
}
+19
View File
@@ -0,0 +1,19 @@
[variables]
main_domain = "${domain}"
auth_password = "${password:24}"
[config]
mounts = []
[[config.domains]]
serviceName = "3dokploy"
port = 3_000
host = "${main_domain}"
[config.env]
# The Dokploy on this same server. If its port 3000 is closed, use its public URL instead.
DOKPLOY_URL = "http://host.docker.internal:3000"
# Required: an API key from Settings → Profile → API/CLI. It stays on the server.
DOKPLOY_API_KEY = ""
# Site login (user admin).
BASIC_AUTH = "admin:${auth_password}"
Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

+44
View File
@@ -0,0 +1,44 @@
services:
9router:
image: decolua/9router:0.5.59
restart: unless-stopped
environment:
DATA_DIR: /app/data
PORT: "20128"
HOSTNAME: "0.0.0.0"
NODE_ENV: production
JWT_SECRET: ${JWT_SECRET}
INITIAL_PASSWORD: ${INITIAL_PASSWORD}
API_KEY_SECRET: ${API_KEY_SECRET}
MACHINE_ID_SALT: ${MACHINE_ID_SALT}
BASE_URL: https://${ROUTER_HOST}
NEXT_PUBLIC_BASE_URL: https://${ROUTER_HOST}
HEADROOM_URL: http://headroom:8787
AUTH_COOKIE_SECURE: "true"
REQUIRE_API_KEY: "true"
volumes:
- 9router-data:/app/data
depends_on:
headroom:
condition: service_healthy
healthcheck:
test: ["CMD", "wget", "--spider", "-q", "http://127.0.0.1:20128/api/health"]
interval: 30s
timeout: 5s
retries: 3
start_period: 30s
# Optional token-reduction proxy that 9Router calls through HEADROOM_URL.
# Shipped as a sidecar because the 9Router image does not bundle it.
headroom:
image: ghcr.io/chopratejas/headroom:0.6.7
restart: unless-stopped
healthcheck:
test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8787/health')"]
interval: 30s
timeout: 5s
retries: 3
start_period: 10s
volumes:
9router-data:
+17
View File
@@ -0,0 +1,17 @@
{
"id": "9router",
"name": "9Router",
"version": "0.5.59",
"description": "Self-hosted AI model router that rotates requests across 40+ providers with automatic fallback, exposing an OpenAI-compatible endpoint for coding agents.",
"logo": "9router.png",
"links": {
"github": "https://github.com/decolua/9router",
"website": "https://9router.com",
"docs": "https://github.com/decolua/9router/blob/master/DOCKER.md"
},
"tags": [
"ai",
"proxy",
"developer-tools"
]
}
+21
View File
@@ -0,0 +1,21 @@
[variables]
main_domain = "${domain}"
jwt_secret = "${password:64}"
initial_password = "${password:32}"
api_key_secret = "${password:64}"
machine_id_salt = "${password:32}"
[config]
env = [
"ROUTER_HOST=${main_domain}",
"JWT_SECRET=${jwt_secret}",
"INITIAL_PASSWORD=${initial_password}",
"API_KEY_SECRET=${api_key_secret}",
"MACHINE_ID_SALT=${machine_id_salt}",
]
mounts = []
[[config.domains]]
serviceName = "9router"
port = 20128
host = "${main_domain}"
+1 -3
View File
@@ -1,9 +1,7 @@
version: "3"
services:
ackee:
image: electerious/ackee:3.4.2
ports:
expose:
- "3000"
environment:
- ACKEE_USERNAME=${ACKEE_USERNAME}
-4
View File
@@ -1,4 +0,0 @@
## Instructions
We don't have nothing to show here....
+3 -5
View File
@@ -1,8 +1,6 @@
version: "3.8"
services:
activepieces:
image: activepieces/activepieces:0.35.0
image: activepieces/activepieces:0.91.2
restart: unless-stopped
depends_on:
@@ -32,7 +30,7 @@ services:
AP_TEMPLATES_SOURCE_URL: https://cloud.activepieces.com/api/v1/flow-templates
postgres:
image: postgres:14
image: postgres:17
restart: unless-stopped
environment:
@@ -61,4 +59,4 @@ services:
volumes:
postgres_data:
redis_data:
redis_data:
+1 -1
View File
@@ -1,7 +1,7 @@
{
"id": "activepieces",
"name": "Activepieces",
"version": "0.35.0",
"version": "0.91.2",
"description": "Open-source no-code business automation tool. An alternative to Zapier, Make.com, and Tray.",
"logo": "activepieces.svg",
"links": {
+4 -3
View File
@@ -1,4 +1,4 @@
version: "3.8"
# dokploy: allow-host-ports — DNS (53/tcp+udp), DHCP (67/68) and DNS-over-TLS/QUIC (853) are not HTTP protocols; clients must reach them directly on the host, Traefik cannot route them.
services:
adguardhome:
image: adguard/adguardhome:latest
@@ -10,11 +10,12 @@ services:
- "68:68/tcp" # DHCP Client
- "853:853/tcp" # DNS over TLS, DNS-over-QUIC
- "853:853/udp" # DNS over TLS, DNS-over-QUIC
- "6060:6060/tcp" # HTTP (pprof)
expose:
- 6060 # HTTP (pprof) — debug endpoint, no need to publish it on the host
volumes:
- adguardhome-work:/opt/adguardhome/work
- adguardhome-conf:/opt/adguardhome/conf
volumes:
adguardhome-work: {}
adguardhome-conf: {}
adguardhome-conf: {}
+5 -2
View File
@@ -2,7 +2,7 @@
"id": "adguardhome",
"name": "AdGuard Home",
"version": "latest",
"description": "AdGuard Home is a comprehensive solution designed to enhance your online browsing experience by eliminating all kinds of ads, from annoying banners and pop-ups to intrusive video ads. It provides privacy protection, browsing security, and parental control features while maintaining website functionality.",
"description": "AdGuard Home is a network-wide ad and tracker blocker. Self-host it on your own server with Dokploy, which deploys AdGuard Home as a Docker Compose service in a few clicks.",
"logo": "logo.svg",
"links": {
"github": "https://github.com/AdguardTeam/AdGuardHome",
@@ -14,5 +14,8 @@
"security",
"dns",
"ad-blocking"
]
],
"seoTitle": "AdGuard Home Docker Compose Setup",
"seoDescription": "Network-wide ad and tracker blocker. Deploy AdGuard Home with Docker Compose on Dokploy in minutes – free, open source, self-hosted.",
"newConfig": true
}
+2 -3
View File
@@ -1,7 +1,6 @@
version: "3.8"
services:
adminer:
image: adminer:4.8.1
restart: unless-stopped
ports:
- 8080
expose:
- 8080
+5 -2
View File
@@ -2,7 +2,7 @@
"id": "adminer",
"name": "Adminer",
"version": "4.8.1",
"description": "Adminer is a comprehensive database management tool that supports MySQL, MariaDB, PostgreSQL, SQLite, MS SQL, Oracle, Elasticsearch, MongoDB and others. It provides a clean interface for efficient database operations, with strong security features and extensive customization options.",
"description": "Adminer is a lightweight, web-based database management tool. Self-host it on your own server with Dokploy, which deploys Adminer as a Docker Compose service in a few clicks.",
"logo": "logo.svg",
"links": {
"github": "https://github.com/vrana/adminer",
@@ -14,5 +14,8 @@
"developer-tools",
"mysql",
"postgresql"
]
],
"seoTitle": "Adminer Docker Compose Setup",
"seoDescription": "Lightweight database management tool. Deploy Adminer with Docker Compose on Dokploy in minutes – free, open source, self-hosted.",
"newConfig": true
}
@@ -1,5 +1,3 @@
version: "3.8"
services:
web:
image: ghcr.io/seanmorley15/adventurelog-frontend:latest
+29 -11
View File
@@ -1,9 +1,8 @@
version: "3.8"
services:
affinepro:
image: ghcr.io/toeverything/affine-graphql:stable-780dd83
image: ghcr.io/toeverything/affine:stable
restart: unless-stopped
ports:
expose:
- 3010
volumes:
- affine-storage:/root/.affine/storage
@@ -12,6 +11,7 @@ services:
- REDIS_SERVER_HOST=redis
- REDIS_SERVER_PASSWORD=${REDIS_PASSWORD}
- DATABASE_URL=postgresql://postgres:${POSTGRES_PASSWORD}@db:5432/affinepro
- AFFINE_INDEXER_ENABLED=false
- AFFINE_SERVER_HOST=${DOMAIN}
- MAILER_HOST=${MAILER_HOST}
- MAILER_PORT=${MAILER_PORT}
@@ -19,16 +19,21 @@ services:
- MAILER_PASSWORD=${MAILER_PASSWORD}
- MAILER_SENDER=${MAILER_SENDER}
depends_on:
- db
- redis
db:
condition: service_healthy
redis:
condition: service_healthy
migration:
condition: service_completed_successfully
migration:
image: ghcr.io/toeverything/affine-graphql:stable-780dd83
command: node ./scripts/self-host-predeploy.js
image: ghcr.io/toeverything/affine:stable
command: ["sh", "-c", "node ./scripts/self-host-predeploy.js"]
environment:
- REDIS_SERVER_HOST=redis
- REDIS_SERVER_PASSWORD=${REDIS_PASSWORD}
- DATABASE_URL=postgresql://postgres:${POSTGRES_PASSWORD}@db:5432/affinepro
- AFFINE_INDEXER_ENABLED=false
- AFFINE_SERVER_HOST=${DOMAIN}
- MAILER_HOST=${MAILER_HOST}
- MAILER_PORT=${MAILER_PORT}
@@ -39,17 +44,25 @@ services:
- affine-storage:/root/.affine/storage
- affine-config:/root/.affine/config
depends_on:
- db
- redis
db:
condition: service_healthy
redis:
condition: service_healthy
db:
image: postgres:15-alpine
image: pgvector/pgvector:pg16
restart: unless-stopped
environment:
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
- POSTGRES_DB=affinepro
- POSTGRES_INITDB_ARGS=--data-checksums
volumes:
- postgres-data:/var/lib/postgresql/data
healthcheck:
test: ["CMD", "pg_isready", "-U", "postgres", "-d", "affinepro"]
interval: 10s
timeout: 5s
retries: 5
redis:
image: redis:7-alpine
@@ -57,9 +70,14 @@ services:
command: redis-server --requirepass ${REDIS_PASSWORD}
volumes:
- redis-data:/data
healthcheck:
test: ["CMD-SHELL", "redis-cli -a '${REDIS_PASSWORD}' ping | grep PONG"]
interval: 10s
timeout: 5s
retries: 5
volumes:
affine-storage: {}
affine-config: {}
postgres-data: {}
redis-data: {}
redis-data: {}
+5 -3
View File
@@ -1,8 +1,8 @@
{
"id": "affinepro",
"name": "Affine Pro",
"version": "stable-780dd83",
"description": "Affine Pro is a modern, self-hosted platform designed for collaborative content creation and project management. It offers an intuitive interface, seamless real-time collaboration, and powerful tools for organizing tasks, notes, and ideas.",
"version": "stable",
"description": "AFFiNE is a workspace for notes, docs, and whiteboards, and an alternative to Notion. Self-host it on your own server with Dokploy, which deploys AFFiNE as a Docker Compose service in a few clicks.",
"logo": "logo.png",
"links": {
"github": "https://github.com/toeverything/Affine",
@@ -14,5 +14,7 @@
"self-hosted",
"productivity",
"project-management"
]
],
"seoTitle": "Self-Host Affine in minutes",
"seoDescription": "Workspace for notes and docs, an alternative to Notion. Self-host Affine on Dokploy in minutes – no manual setup needed."
}
+1 -2
View File
@@ -1,4 +1,3 @@
version: "3.8"
services:
agent-zero:
image: agent0ai/agent-zero:v1.9
@@ -11,4 +10,4 @@ services:
volumes:
- agent-zero-data:/a0/usr
volumes:
agent-zero-data:
agent-zero-data:
+2 -3
View File
@@ -11,12 +11,11 @@ services:
- agentdvr-config:/AgentDVR/Media/XML/
- agentdvr-media:/AgentDVR/Media/WebServerRoot/Media/
- agentdvr-commands:/AgentDVR/Commands/
ports:
expose:
- 8090
- 3478/udp
- 50000-50100/udp
volumes:
agentdvr-config: {}
agentdvr-media: {}
agentdvr-commands: {}
agentdvr-commands: {}
+1 -2
View File
@@ -3,6 +3,7 @@ main_domain = "${domain}"
timezone = "America/New_York"
[config]
mounts = []
[[config.domains]]
serviceName = "agentdvr"
port = 8090
@@ -10,5 +11,3 @@ host = "${main_domain}"
[config.env]
TIMEZONE = "${timezone}"
[[config.mounts]]
+29
View File
@@ -0,0 +1,29 @@
<svg version="1.1" id="Layer_1" xmlns:x="ns_extend;" xmlns:i="ns_ai;" xmlns:graph="ns_graphs;"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 95.7 99" style="enable-background:new 0 0 95.7 99;" xml:space="preserve">
<title>Airbyte</title>
<style type="text/css">
.st0{fill-rule:evenodd;clip-rule:evenodd;fill:#615EFF;}
</style>
<metadata>
<sfw xmlns="ns_sfw;">
<slices>
</slices>
<sliceSourceBounds bottomLeftOrigin="true" height="99" width="95.7" x="77.2" y="75">
</sliceSourceBounds>
</sfw>
</metadata>
<g>
<path class="st0" d="M32.6,12C43.2,0.1,60.8-3.4,75.2,3.5c19.2,9.1,26.1,32.4,15.7,50.3L67.4,94.1c-1.3,2.3-3.5,3.9-6,4.6
c-2.5,0.7-5.2,0.3-7.5-1l28.4-48.8c7.6-13,2.5-29.9-11.4-36.5c-10.4-5-23.2-2.5-30.9,6.1c-4.2,4.7-6.6,10.8-6.7,17.1
c-0.1,6.3,2.2,12.5,6.3,17.3c0.7,0.9,1.5,1.7,2.4,2.4L25.5,83.8c-0.6,1.1-1.5,2.1-2.5,2.9c-1,0.8-2.2,1.4-3.5,1.7
c-1.3,0.3-2.6,0.4-3.8,0.3c-1.3-0.2-2.5-0.6-3.6-1.2l18-31c-2.6-3.7-4.4-7.9-5.5-12.2l-11,19c-1.3,2.3-3.5,3.9-6,4.6S2.3,68,0,66.7
l28.5-49.1C29.7,15.7,31.1,13.8,32.6,12z M65.6,27.6c6.9,3.9,9.2,12.7,5.3,19.5L43.5,94.1c-1.3,2.3-3.5,3.9-6,4.6
c-2.5,0.7-5.2,0.3-7.5-1L55.4,54c-2-0.4-4-1.3-5.6-2.5c-1.7-1.2-3.1-2.8-4-4.6c-1-1.8-1.6-3.8-1.7-5.9c-0.1-2.1,0.2-4.1,0.9-6.1
c0.7-1.9,1.9-3.7,3.4-5.1c1.5-1.4,3.3-2.5,5.2-3.2c2-0.7,4.1-0.9,6.1-0.8C61.8,26,63.8,26.6,65.6,27.6z M55.6,36.5
c-0.5,0.4-0.9,0.8-1.2,1.3h0c-0.4,0.8-0.7,1.7-0.6,2.5c0.1,0.9,0.4,1.7,0.9,2.4c0.5,0.7,1.3,1.2,2.1,1.5c0.8,0.3,1.8,0.3,2.6,0.1
c0.9-0.2,1.6-0.7,2.2-1.4c0.6-0.7,1-1.5,1.1-2.4c0.1-0.9,0-1.8-0.4-2.6c-0.4-0.8-1-1.5-1.8-1.9c-0.5-0.3-1.1-0.5-1.7-0.6
s-1.2,0-1.8,0.1C56.6,35.8,56.1,36.1,55.6,36.5z">
</path>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

+428
View File
@@ -0,0 +1,428 @@
# The following template is not officially supported by the Airbyte team, as
# docker compose deployment has been superseded by abctl. It was made based
# on the community-maintained example below:
#
# - https://github.com/nktnet1/airbyte-compose
#
# NOTE: make sure to change the AIRBYTE_URL and AIRBYTE_API_HOST environment
# variables to match that of your public domain. The URL must be publicly
# accessible (for example, it cannot be auth-protected by Cloudflare).
#
# Once you've completed the setup via the web UI, you can log in using the
# password defined in the AIRBYTE_ADMIN_PASSWORD environment variable.
#
# To connect internal databases, ensure that they are on the same network as
# the k3s container. This is available in Dokploy's UI starting from v0.30.0.
name: airbyte
x-airbyte-environment: &airbyte-environment
AIRBYTE_VERSION: ${AIRBYTE_VERSION:?Set AIRBYTE_VERSION in .env}
AIRBYTE_URL: ${AIRBYTE_URL:?Set AIRBYTE_URL in .env}
AIRBYTE_API_HOST: ${AIRBYTE_API_HOST:?Set AIRBYTE_API_HOST in .env}
AIRBYTE_SERVER_HOST: server:8001
INTERNAL_API_HOST: http://server:8001
MANIFEST_SERVER_API_HOST: http://manifest-server:8080
CONTROL_PLANE_TOKEN_ENDPOINT: http://server:8001/api/v1/dataplanes/token
WORKLOAD_API_HOST: http://workload-api-server:8007
TEMPORAL_HOST: temporal:7233
MINIO_ENDPOINT: http://minio:9000
DATABASE_HOST: db
DATABASE_DB: ${DATABASE_DB:?Set DATABASE_DB in .env}
DATABASE_USER: ${DATABASE_USER:?Set DATABASE_USER in .env}
DATABASE_PASSWORD: ${DATABASE_PASSWORD:?Set DATABASE_PASSWORD in .env}
DATABASE_URL: jdbc:postgresql://db:5432/${DATABASE_DB}
CONFIG_DATABASE_REPLICA_URL: jdbc:postgresql://db:5432/${DATABASE_DB}
CONFIG_DATABASE_REPLICA_USER: ${DATABASE_USER}
CONFIG_DATABASE_REPLICA_PASSWORD: ${DATABASE_PASSWORD}
AWS_ACCESS_KEY_ID: ${MINIO_ROOT_USER:?Set MINIO_ROOT_USER in .env}
AWS_SECRET_ACCESS_KEY: ${MINIO_ROOT_PASSWORD:?Set MINIO_ROOT_PASSWORD in .env}
AB_INSTANCE_ADMIN_PASSWORD: ${AIRBYTE_ADMIN_PASSWORD:?Set AIRBYTE_ADMIN_PASSWORD in .env}
AB_INSTANCE_ADMIN_CLIENT_ID: ${AIRBYTE_ADMIN_CLIENT_ID:?Set AIRBYTE_ADMIN_CLIENT_ID in .env}
AB_INSTANCE_ADMIN_CLIENT_SECRET: ${AIRBYTE_ADMIN_CLIENT_SECRET:?Set AIRBYTE_ADMIN_CLIENT_SECRET in .env}
AB_JWT_SIGNATURE_SECRET: ${AIRBYTE_JWT_SIGNATURE_SECRET:?Set AIRBYTE_JWT_SIGNATURE_SECRET in .env}
CONNECTOR_PROFILER_IMAGE: airbyte/async-profiler:${AIRBYTE_VERSION}
CONNECTOR_SIDECAR_IMAGE: airbyte/connector-sidecar:${AIRBYTE_VERSION}
CONTAINER_ORCHESTRATOR_IMAGE: airbyte/container-orchestrator:${AIRBYTE_VERSION}
WORKLOAD_INIT_IMAGE: airbyte/workload-init-container:${AIRBYTE_VERSION}
JAVA_OPTS: -XX:+ExitOnOutOfMemoryError -XX:MaxRAMPercentage=75.0 -XX:FlightRecorderOptions=stackdepth=256
x-airbyte-service: &airbyte-service
env_file:
- ../files/config/airbyte.env
environment: *airbyte-environment
restart: unless-stopped
services:
db:
image: airbyte/db:${AIRBYTE_VERSION}
environment:
POSTGRES_DB: ${DATABASE_DB}
POSTGRES_USER: ${DATABASE_USER}
POSTGRES_PASSWORD: ${DATABASE_PASSWORD}
PGDATA: /var/lib/postgresql/data/pgdata
healthcheck:
test: [CMD-SHELL, 'pg_isready -U "$${POSTGRES_USER}" -d "$${POSTGRES_DB}"']
interval: 5s
timeout: 5s
retries: 30
start_period: 10s
volumes:
- db-data:/var/lib/postgresql/data
restart: unless-stopped
minio:
# S3-compatible storage (SeaweedFS). The service keeps the "minio" name so
# Airbyte's MINIO_ENDPOINT (http://minio:9000) and the k3s ExternalName
# service keep working unchanged.
image: chrislusf/seaweedfs:${SEAWEEDFS_VERSION}
entrypoint: [/bin/sh, -ec]
command:
- |
mkdir -p /etc/seaweedfs
printf '{"identities":[{"name":"airbyte","credentials":[{"accessKey":"%s","secretKey":"%s"}],"actions":["Admin","Read","Write","List","Tagging"]}]}' \
"$${MINIO_ROOT_USER}" "$${MINIO_ROOT_PASSWORD}" > /etc/seaweedfs/s3.json
exec weed server -dir=/storage -ip.bind=0.0.0.0 \
-master.volumeSizeLimitMB=1024 -volume.max=0 \
-s3 -s3.port=9000 -s3.config=/etc/seaweedfs/s3.json
environment:
MINIO_ROOT_USER: ${MINIO_ROOT_USER}
MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD}
volumes:
- minio-data:/storage
restart: unless-stopped
healthcheck:
test: [CMD-SHELL, "wget -q -O /dev/null http://127.0.0.1:9000/healthz"]
interval: 10s
timeout: 5s
retries: 30
start_period: 20s
minio-init:
image: chrislusf/seaweedfs:${SEAWEEDFS_VERSION}
entrypoint: [/bin/sh, /scripts/init-minio.sh]
environment:
SEAWEEDFS_MASTER: minio:9333
volumes:
- ../files/scripts/init-minio.sh:/scripts/init-minio.sh:ro
depends_on:
minio:
condition: service_healthy
restart: on-failure
temporal:
image: temporalio/auto-setup:${TEMPORAL_VERSION}
environment:
AUTO_SETUP: "true"
DB: postgres12
DB_PORT: "5432"
POSTGRES_SEEDS: db
POSTGRES_USER: ${DATABASE_USER}
POSTGRES_PWD: ${DATABASE_PASSWORD}
POSTGRES_TLS_ENABLED: "false"
POSTGRES_TLS_DISABLE_HOST_VERIFICATION: "false"
SQL_TLS_ENABLED: "false"
SQL_TLS_DISABLE_HOST_VERIFICATION: "false"
DYNAMIC_CONFIG_FILE_PATH: config/dynamicconfig/development.yaml
PROMETHEUS_ENDPOINT: 0.0.0.0:9090
BIND_ON_IP: 0.0.0.0
TEMPORAL_BROADCAST_ADDRESS: 0.0.0.0
volumes:
- ../files/config/temporal-dynamicconfig.yaml:/etc/temporal/config/dynamicconfig/development.yaml:ro
depends_on:
db:
condition: service_healthy
restart: unless-stopped
healthcheck:
test:
- CMD
- /bin/bash
- -ec
- exec 3<>/dev/tcp/127.0.0.1/7233
interval: 10s
timeout: 5s
retries: 30
start_period: 30s
k3s:
image: rancher/k3s:${K3S_VERSION}
command:
- server
- --node-name=airbyte-k3s
- --disable=traefik
- --disable=servicelb
- --disable=metrics-server
- --disable=coredns
- --tls-san=k3s
privileged: true
environment:
K3S_KUBECONFIG_OUTPUT: /output/kubeconfig.yaml
K3S_KUBECONFIG_MODE: "0644"
tmpfs:
- /run
- /var/run
volumes:
- k3s-data:/var/lib/rancher/k3s
- k3s-kubeconfig:/output
healthcheck:
test: [CMD, /bin/kubectl, get, --raw=/readyz]
interval: 5s
timeout: 5s
retries: 60
start_period: 20s
restart: unless-stopped
docker-dns:
image: rancher/mirrored-coredns-coredns:${COREDNS_VERSION}
command: [-conf, /etc/coredns/Corefile]
volumes:
- ../files/config/docker-dns.Corefile:/etc/coredns/Corefile:ro
network_mode: service:k3s
depends_on:
k3s:
condition: service_started
restart: unless-stopped
healthcheck:
test: [CMD, /coredns, -version]
interval: 10s
timeout: 5s
retries: 3
k3s-bootstrap:
image: rancher/k3s:${K3S_VERSION}
entrypoint: [/bin/sh, /scripts/bootstrap-k3s.sh]
environment:
AIRBYTE_ADMIN_PASSWORD: ${AIRBYTE_ADMIN_PASSWORD}
AIRBYTE_ADMIN_CLIENT_ID: ${AIRBYTE_ADMIN_CLIENT_ID}
AIRBYTE_ADMIN_CLIENT_SECRET: ${AIRBYTE_ADMIN_CLIENT_SECRET}
AIRBYTE_JWT_SIGNATURE_SECRET: ${AIRBYTE_JWT_SIGNATURE_SECRET}
DATABASE_USER: ${DATABASE_USER}
DATABASE_PASSWORD: ${DATABASE_PASSWORD}
MINIO_ROOT_USER: ${MINIO_ROOT_USER}
MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD}
volumes:
- k3s-kubeconfig:/kube
- ../files/config/k3s-resources.yaml:/config/k3s-resources.yaml:ro
- ../files/scripts/bootstrap-k3s.sh:/scripts/bootstrap-k3s.sh:ro
depends_on:
k3s:
condition: service_healthy
docker-dns:
condition: service_started
restart: on-failure
dataplane-credentials:
image: rancher/k3s:${K3S_VERSION}
entrypoint: [/bin/sh, /scripts/export-dataplane-credentials.sh]
volumes:
- k3s-kubeconfig:/kube:ro
- dataplane-credentials:/credentials
- ../files/scripts/export-dataplane-credentials.sh:/scripts/export-dataplane-credentials.sh:ro
depends_on:
bootloader:
condition: service_completed_successfully
restart: on-failure
bootloader:
<<: *airbyte-service
image: airbyte/bootloader:${AIRBYTE_VERSION}
environment:
<<: *airbyte-environment
KUBECONFIG: /kube/config.yaml
MICRONAUT_ENVIRONMENTS: k8s,control-plane,edition-community
JOB_KUBE_NAMESPACE: default
DD_SERVICE: airbyte-bootloader
volumes:
- k3s-kubeconfig:/kube:ro
depends_on:
db:
condition: service_healthy
k3s-bootstrap:
condition: service_completed_successfully
restart: on-failure
server:
<<: *airbyte-service
image: airbyte/server:${AIRBYTE_VERSION}
environment:
<<: *airbyte-environment
DD_SERVICE: airbyte-server
expose:
- 8001
healthcheck:
test:
- CMD
- /bin/bash
- -ec
- |
exec 3<>/dev/tcp/127.0.0.1/8001
printf 'GET /api/v1/health HTTP/1.0\r\nHost: localhost\r\nConnection: close\r\n\r\n' >&3
read -r status <&3
[[ "$$status" == *" 200 "* ]]
interval: 5s
timeout: 10s
retries: 60
start_period: 10s
depends_on:
bootloader:
condition: service_completed_successfully
minio-init:
condition: service_completed_successfully
temporal:
condition: service_started
manifest-server:
<<: *airbyte-service
image: airbyte/manifest-server:${MANIFEST_SERVER_VERSION}
environment:
<<: *airbyte-environment
DD_SERVICE: airbyte-manifest-server
AIRBYTE_ENABLE_UNSAFE_CODE: ${AIRBYTE_ENABLE_UNSAFE_CODE:-false}
depends_on:
bootloader:
condition: service_completed_successfully
minio-init:
condition: service_completed_successfully
healthcheck:
test:
- CMD
- python
- -c
- import urllib.request; response = urllib.request.urlopen("http://127.0.0.1:8080/health/", timeout=5); assert response.status == 200
interval: 10s
timeout: 5s
retries: 10
start_period: 30s
workload-api-server:
<<: *airbyte-service
image: airbyte/workload-api-server:${AIRBYTE_VERSION}
environment:
<<: *airbyte-environment
DD_SERVICE: airbyte-workload-api
depends_on:
bootloader:
condition: service_completed_successfully
minio-init:
condition: service_completed_successfully
temporal:
condition: service_started
healthcheck:
test:
- CMD
- /bin/bash
- -ec
- |
exec 3<>/dev/tcp/127.0.0.1/8085
printf 'GET /health/liveness HTTP/1.0\r\nHost: localhost\r\nConnection: close\r\n\r\n' >&3
read -r status <&3
[[ "$$status" == *" 200 "* ]]
interval: 10s
timeout: 5s
retries: 10
start_period: 30s
worker:
<<: *airbyte-service
image: airbyte/worker:${AIRBYTE_VERSION}
environment:
<<: *airbyte-environment
DD_SERVICE: airbyte-worker
depends_on:
bootloader:
condition: service_completed_successfully
temporal:
condition: service_started
workload-api-server:
condition: service_started
healthcheck:
test:
- CMD
- /bin/bash
- -ec
- |
exec 3<>/dev/tcp/127.0.0.1/9000
printf 'GET / HTTP/1.0\r\nHost: localhost\r\nConnection: close\r\n\r\n' >&3
read -r status <&3
[[ "$$status" == *" 200 "* ]]
interval: 10s
timeout: 5s
retries: 10
start_period: 30s
cron:
<<: *airbyte-service
image: airbyte/cron:${AIRBYTE_VERSION}
environment:
<<: *airbyte-environment
DD_SERVICE: airbyte-cron
depends_on:
bootloader:
condition: service_completed_successfully
temporal:
condition: service_started
workload-api-server:
condition: service_started
healthcheck:
test:
- CMD
- /bin/bash
- -ec
- |
exec 3<>/dev/tcp/127.0.0.1/8085
printf 'GET /health HTTP/1.0\r\nHost: localhost\r\nConnection: close\r\n\r\n' >&3
read -r status <&3
[[ "$$status" == *" 200 "* ]]
interval: 10s
timeout: 5s
retries: 10
start_period: 30s
workload-launcher:
<<: *airbyte-service
image: airbyte/workload-launcher:${AIRBYTE_VERSION}
entrypoint: [/bin/sh, /scripts/start-workload-launcher.sh]
command: [/bin/bash, -c, 'airbyte-app/bin/$${APPLICATION}']
environment:
<<: *airbyte-environment
KUBECONFIG: /kube/config.yaml
MICRONAUT_ENVIRONMENTS: k8s,control-plane,edition-community
JOB_KUBE_NAMESPACE: default
DD_SERVICE: airbyte-workload-launcher
AIRBYTE_ENABLE_UNSAFE_CODE: ${AIRBYTE_ENABLE_UNSAFE_CODE:-false}
volumes:
- k3s-kubeconfig:/kube:ro
- dataplane-credentials:/credentials:ro
- ../files/scripts/start-workload-launcher.sh:/scripts/start-workload-launcher.sh:ro
depends_on:
dataplane-credentials:
condition: service_completed_successfully
k3s-bootstrap:
condition: service_completed_successfully
server:
condition: service_healthy
workload-api-server:
condition: service_started
temporal:
condition: service_started
healthcheck:
test:
- CMD
- /bin/bash
- -ec
- |
exec 3<>/dev/tcp/127.0.0.1/8085
printf 'GET /health/readiness HTTP/1.0\r\nHost: localhost\r\nConnection: close\r\n\r\n' >&3
read -r status <&3
[[ "$$status" == *" 200 "* ]]
interval: 10s
timeout: 5s
retries: 10
start_period: 30s
volumes:
db-data:
minio-data:
k3s-data:
k3s-kubeconfig:
dataplane-credentials:
+18
View File
@@ -0,0 +1,18 @@
{
"id": "airbyte",
"name": "Airbyte",
"version": "2.2.0",
"description": "Open-source data movement for ELT pipelines and AI agents.",
"logo": "airbyte.svg",
"links": {
"github": "https://github.com/airbytehq/airbyte",
"website": "https://airbyte.com",
"docs": "https://docs.airbyte.com"
},
"tags": [
"analytics",
"data",
"elt",
"pipeline"
]
}
+656
View File
@@ -0,0 +1,656 @@
[variables]
main_domain = "${domain}"
database_password = "${password:32}"
minio_root_password = "${password:32}"
airbyte_admin_password = "${password:32}"
airbyte_admin_client_id = "${password:32}"
airbyte_admin_client_secret = "${password:32}"
airbyte_jwt_signature_secret = "${password:32}"
[[config.domains]]
serviceName = "server"
port = 8_001
host = "${main_domain}"
[config.env]
AIRBYTE_URL = "http://${main_domain}"
AIRBYTE_API_HOST = "http://${main_domain}/api/public"
AIRBYTE_VERSION = "2.2.0"
MANIFEST_SERVER_VERSION = "7.23.7"
TEMPORAL_VERSION = "1.27.2"
SEAWEEDFS_VERSION = "4.48"
K3S_VERSION = "v1.36.3-k3s1"
COREDNS_VERSION = "1.14.7"
DATABASE_DB = "db-airbyte"
DATABASE_USER = "airbyte"
DATABASE_PASSWORD = "${database_password}"
MINIO_ROOT_USER = "minio"
MINIO_ROOT_PASSWORD = "${minio_root_password}"
AIRBYTE_ADMIN_PASSWORD = "${airbyte_admin_password}"
AIRBYTE_ADMIN_CLIENT_ID = "${airbyte_admin_client_id}"
AIRBYTE_ADMIN_CLIENT_SECRET = "${airbyte_admin_client_secret}"
AIRBYTE_JWT_SIGNATURE_SECRET = "${airbyte_jwt_signature_secret}"
AIRBYTE_ENABLE_UNSAFE_CODE = "false"
[[config.mounts]]
filePath = "./config/airbyte.env"
content = """
AB_AUTH_SECRET_CREATION_ENABLED=true
AB_KUBERNETES_SECRET_NAME=airbyte-auth-secrets
AB_INSTANCE_ADMIN_PASSWORD_SECRET_KEY=instance-admin-password
AB_INSTANCE_ADMIN_CLIENT_ID_SECRET_KEY=instance-admin-client-id
AB_INSTANCE_ADMIN_CLIENT_SECRET_SECRET_KEY=instance-admin-client-secret
AB_JWT_SIGNATURE_SECRET_KEY=jwt-signature-secret
DATAPLANE_CLIENT_ID_SECRET_NAME=airbyte-auth-secrets
DATAPLANE_CLIENT_ID_SECRET_KEY=dataplane-client-id
DATAPLANE_CLIENT_SECRET_SECRET_NAME=airbyte-auth-secrets
DATAPLANE_CLIENT_SECRET_SECRET_KEY=dataplane-client-secret
IDENTITY_PROVIDER_TYPE=simple
AB_AIRBYTE_AUTH_IDENTITY_PROVIDER_VERIFY_ISSUER=false
AB_AIRBYTE_AUTH_IDENTITY_PROVIDER_VERIFY_AUDIENCE=false
AB_COOKIE_SECURE=false
AB_COOKIE_SAME_SITE=Lax
AIRBYTE_EDITION=community
AIRBYTE_CLUSTER_TYPE=hybrid
CLUSTER_TYPE=hybrid
API_AUTHORIZATION_ENABLED=true
LOCAL=false
DEPLOYMENT_ENV=docker-compose
AIRBYTE_DUMMY_SECRET=dummy
CONNECTOR_REGISTRY_SEED_PROVIDER=remote
ENTERPRISE_SOURCE_STUBS_URL=https://connectors.airbyte.com/files/resources/connector_stubs/v1/connector_stubs.json
UPDATE_DEFINITIONS_CRON_ENABLED=true
RUN_DECLARATIVE_SOURCES_UPDATER=false
CONNECTOR_ROLLOUT_EXPIRATION_SECONDS=604800
CONNECTOR_ROLLOUT_WAIT_BETWEEN_ROLLOUTS_SECONDS=10800
CONNECTOR_ROLLOUT_WAIT_BETWEEN_SYNC_RESULTS_QUERIES_SECONDS=3600
DATABASE_PORT=5432
RUN_DATABASE_MIGRATION_ON_STARTUP=true
CONFIGS_DATABASE_MINIMUM_FLYWAY_MIGRATION_VERSION=0.35.15.001
JOBS_DATABASE_MINIMUM_FLYWAY_MIGRATION_VERSION=0.29.15.001
FEATURE_FLAG_CLIENT=configfile
FEATURE_FLAG_PATH=/etc/launchdarkly/flags.yml
JOB_KUBE_SERVICEACCOUNT=airbyte-admin
JOB_KUBE_NAMESPACE=default
JOB_KUBE_LOCAL_VOLUME_ENABLED=false
JOB_ERROR_REPORTING_STRATEGY=logging
LOG_LEVEL=info
MICROMETER_METRICS_ENABLED=false
MICROMETER_METRICS_STEP=PT1M
MICROMETER_METRICS_STATSD_FLAVOR=datadog
MICROMETER_METRICS_OTLP_ENABLED=false
MICROMETER_METRICS_STATSD_ENABLED=false
PUBLISH_METRICS=true
STATSD_HOST=127.0.0.1
STATSD_PORT=8125
OTEL_SDK_DISABLED=true
DD_ENABLED=false
DD_INTEGRATIONS_ENABLED=false
DD_PROFILING_ENABLED=false
STIGG_ENABLED=false
AUDIT_LOGGING_ENABLED=false
STORAGE_TYPE=minio
STORAGE_BUCKET_ACTIVITY_PAYLOAD=airbyte-bucket
STORAGE_BUCKET_AUDIT_LOGGING=airbyte-bucket
STORAGE_BUCKET_LOG=airbyte-bucket
STORAGE_BUCKET_STATE=airbyte-bucket
STORAGE_BUCKET_WORKLOAD_OUTPUT=airbyte-bucket
S3_PATH_STYLE_ACCESS=true
AUTO_SETUP=true
DYNAMIC_CONFIG_FILE_PATH=config/dynamicconfig/development.yaml
PROMETHEUS_ENDPOINT=0.0.0.0:9090
BIND_ON_IP=0.0.0.0
TEMPORAL_BROADCAST_ADDRESS=0.0.0.0
TEMPORAL_CLOUD_ENABLED=false
TEMPORAL_SDK_RPC_TIMEOUT=120s
TEMPORAL_SDK_RPC_LONG_POLL_TIMEOUT=140s
TEMPORAL_SDK_RPC_QUERY_TIMEOUT=20s
TEMPORAL_WORKER_PORTS=9000 9001 9002 9003 9004 9005 9006 9007 9008 9009 9010 9011 9012 9013 9014 9015 9016 9017 9018 9019 9020 9021 9022 9023 9024 9025 9026 9027 9028 9029 9030 9031 9032 9033 9034 9035 9036 9037 9038 9039 9040
TRACKING_ENABLED=true
TRACKING_STRATEGY=segment
SEGMENT_WRITE_KEY=7UDdp5K55CyiGgsauOr2pNNujGvmhaeu
API_URL=/api/v1
CONFIG_ROOT=/configs
MAX_CHECK_WORKERS=30
MAX_NOTIFY_WORKERS=30
MAX_SYNC_WORKERS=5
SYNC_JOB_MAX_ATTEMPTS=3
SYNC_JOB_MAX_TIMEOUT_DAYS=3
SYNC_JOB_INIT_RETRY_TIMEOUT_MINUTES=5
USE_CUSTOM_NODE_SELECTOR=false
USE_STREAM_CAPABLE_STATE=true
WORKSPACE_DOCKER_MOUNT=airbyte_workspace
WORKSPACE_ROOT=/workspace
WORKER_ENVIRONMENT=kubernetes
WORKLOAD_API_SERVER_ENABLED=true
WORKLOAD_LAUNCHER_ENABLED=true
WORKLOAD_LAUNCHER_PARALLELISM=10
CONTAINER_ORCHESTRATOR_ENABLED=true
KUBERNETES_CLIENT_MAX_IDLE_CONNECTIONS=100
PUB_SUB_ENABLED=false
DATA_CHECK_TASK_QUEUES=CHECK_CONNECTION
DATA_DISCOVER_TASK_QUEUES=DISCOVER_SCHEMA
DATA_SYNC_TASK_QUEUES=SYNC
CONNECTOR_SPECIFIC_RESOURCE_DEFAULTS_ENABLED=true
FILE_TRANSFER_EPHEMERAL_STORAGE_LIMIT=5G
FILE_TRANSFER_EPHEMERAL_STORAGE_REQUEST=5G
MICRONAUT_ENVIRONMENTS=k8s,control-plane,edition-community
LAUNCHER_MICRONAUT_ENVIRONMENTS=control-plane,oss
WORKERS_MICRONAUT_ENVIRONMENTS=control-plane
CRON_MICRONAUT_ENVIRONMENTS=control-plane
SERVER_MICRONAUT_ENVIRONMENTS=control-plane
"""
[[config.mounts]]
filePath = "./config/docker-dns.Corefile"
content = """
.:53 {
bind eth0
errors
cache 30
forward . 127.0.0.11
}
"""
[[config.mounts]]
filePath = "./config/k3s-resources.yaml"
content = """
apiVersion: v1
kind: ServiceAccount
metadata:
name: airbyte-admin
namespace: default
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: airbyte-admin-role
namespace: default
rules:
- apiGroups: ["*"]
resources:
- configmaps
- endpoints
- jobs
- pods
- pods/log
- pods/exec
- pods/attach
- secrets
verbs: [get, list, watch, create, update, patch, delete]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: airbyte-admin-binding
namespace: default
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: airbyte-admin-role
subjects:
- kind: ServiceAccount
name: airbyte-admin
namespace: default
---
apiVersion: v1
kind: Service
metadata:
name: airbyte-db-svc
namespace: default
spec:
type: ExternalName
externalName: db
ports:
- name: postgresql
port: 5432
protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
name: airbyte-minio-svc
namespace: default
spec:
type: ExternalName
externalName: minio
ports:
- name: api
port: 9000
protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
name: airbyte-temporal
namespace: default
spec:
type: ExternalName
externalName: temporal
ports:
- name: grpc
port: 7233
protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
name: airbyte-airbyte-server-svc
namespace: default
spec:
type: ExternalName
externalName: server
ports:
- name: http
port: 8001
protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
name: airbyte-workload-api-server-svc
namespace: default
spec:
type: ExternalName
externalName: workload-api-server
ports:
- name: http
port: 8007
protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
name: airbyte-airbyte-manifest-server-svc
namespace: default
spec:
type: ExternalName
externalName: manifest-server
ports:
- name: http
port: 8080
protocol: TCP
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: coredns
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: system:coredns
rules:
- apiGroups: [""]
resources: [endpoints, services, pods, namespaces]
verbs: [list, watch]
- apiGroups: [discovery.k8s.io]
resources: [endpointslices]
verbs: [list, watch]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: system:coredns
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: system:coredns
subjects:
- kind: ServiceAccount
name: coredns
namespace: kube-system
---
apiVersion: v1
kind: ConfigMap
metadata:
name: coredns
namespace: kube-system
data:
Corefile: |
.:53 {
errors
health
ready
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
fallthrough
}
cache 30
loop
reload
loadbalance
forward . 127.0.0.1:1053
}
.:1053 {
bind 127.0.0.1
errors
rewrite stop name regex ^(.+?)(\\.[^.]+\\.svc\\.cluster\\.local|\\.svc\\.cluster\\.local|\\.cluster\\.local)\\.$ {1} answer auto
forward . {$AIRBYTE_K3S_IP}
}
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: coredns
namespace: kube-system
labels:
k8s-app: kube-dns
spec:
replicas: 1
selector:
matchLabels:
k8s-app: kube-dns
template:
metadata:
labels:
k8s-app: kube-dns
spec:
priorityClassName: system-cluster-critical
serviceAccountName: coredns
nodeSelector:
kubernetes.io/os: linux
tolerations:
- key: CriticalAddonsOnly
operator: Exists
- key: node-role.kubernetes.io/control-plane
operator: Exists
- key: node-role.kubernetes.io/master
operator: Exists
effect: NoSchedule
containers:
- name: coredns
image: rancher/mirrored-coredns-coredns:1.14.7
imagePullPolicy: IfNotPresent
args: [-conf, /etc/coredns/Corefile]
env:
- name: AIRBYTE_K3S_IP
valueFrom:
fieldRef:
fieldPath: status.hostIP
resources:
limits:
memory: 170Mi
requests:
cpu: 100m
memory: 70Mi
ports:
- name: dns
containerPort: 53
protocol: UDP
- name: dns-tcp
containerPort: 53
protocol: TCP
volumeMounts:
- name: config
mountPath: /etc/coredns
readOnly: true
securityContext:
allowPrivilegeEscalation: false
capabilities:
add: [NET_BIND_SERVICE]
drop: [ALL]
readOnlyRootFilesystem: true
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 60
periodSeconds: 10
readinessProbe:
httpGet:
path: /ready
port: 8181
periodSeconds: 2
dnsPolicy: Default
volumes:
- name: config
configMap:
name: coredns
---
apiVersion: v1
kind: Service
metadata:
name: kube-dns
namespace: kube-system
labels:
k8s-app: kube-dns
kubernetes.io/cluster-service: "true"
kubernetes.io/name: CoreDNS
spec:
selector:
k8s-app: kube-dns
clusterIP: 10.43.0.10
ports:
- name: dns
port: 53
protocol: UDP
- name: dns-tcp
port: 53
protocol: TCP
"""
[[config.mounts]]
filePath = "./config/temporal-dynamicconfig.yaml"
content = """
frontend.enableClientVersionCheck:
- value: true
constraints: {}
history.persistenceMaxQPS:
- value: 3000
constraints: {}
frontend.persistenceMaxQPS:
- value: 3000
constraints: {}
frontend.historyMgrNumConns:
- value: 30
constraints: {}
frontend.throttledLogRPS:
- value: 20
constraints: {}
frontend.enableUpdateWorkflowExecution:
- value: true
frontend.enableUpdateWorkflowExecutionAsyncAccepted:
- value: true
history.historyMgrNumConns:
- value: 50
constraints: {}
system.advancedVisibilityWritingMode:
- value: "off"
constraints: {}
history.defaultActivityRetryPolicy:
- value:
InitialIntervalInSeconds: 1
MaximumIntervalCoefficient: 100.0
BackoffCoefficient: 2.0
MaximumAttempts: 0
history.defaultWorkflowRetryPolicy:
- value:
InitialIntervalInSeconds: 1
MaximumIntervalCoefficient: 100.0
BackoffCoefficient: 2.0
MaximumAttempts: 0
limit.blobSize.error:
- value: 15728640
constraints: {}
limit.blobSize.warn:
- value: 10485760
constraints: {}
"""
[[config.mounts]]
filePath = "./scripts/bootstrap-k3s.sh"
content = """
#!/bin/sh
set -eu
source_config=/kube/kubeconfig.yaml
client_config=/kube/config.yaml
until [ -s "$source_config" ]; do
sleep 1
done
sed 's|server: https://127.0.0.1:6443|server: https://k3s:6443|' \
"$source_config" > "$client_config"
chmod 0644 "$client_config"
/bin/kubectl --kubeconfig "$client_config" \
config set-context --current --namespace=default >/dev/null
until /bin/kubectl --kubeconfig "$client_config" get --raw=/readyz >/dev/null 2>&1; do
sleep 2
done
/bin/kubectl --kubeconfig "$client_config" apply -f /config/k3s-resources.yaml
/bin/kubectl --kubeconfig "$client_config" \
--namespace kube-system rollout status deployment/coredns --timeout=180s
/bin/kubectl --kubeconfig "$client_config" create secret generic airbyte-auth-secrets \
--namespace default \
--from-literal=instance-admin-password="$AIRBYTE_ADMIN_PASSWORD" \
--from-literal=instance-admin-client-id="$AIRBYTE_ADMIN_CLIENT_ID" \
--from-literal=instance-admin-client-secret="$AIRBYTE_ADMIN_CLIENT_SECRET" \
--from-literal=jwt-signature-secret="$AIRBYTE_JWT_SIGNATURE_SECRET" \
--from-literal=dataplane-client-id= \
--from-literal=dataplane-client-secret= \
--dry-run=client -o yaml | \
/bin/kubectl --kubeconfig "$client_config" apply -f -
/bin/kubectl --kubeconfig "$client_config" create secret generic airbyte-airbyte-secrets \
--namespace default \
--from-literal=AIRBYTE_DUMMY_SECRET=dummy \
--from-literal=AB_INSTANCE_ADMIN_PASSWORD="$AIRBYTE_ADMIN_PASSWORD" \
--from-literal=AB_INSTANCE_ADMIN_CLIENT_ID="$AIRBYTE_ADMIN_CLIENT_ID" \
--from-literal=AB_INSTANCE_ADMIN_CLIENT_SECRET="$AIRBYTE_ADMIN_CLIENT_SECRET" \
--from-literal=AB_JWT_SIGNATURE_SECRET="$AIRBYTE_JWT_SIGNATURE_SECRET" \
--from-literal=DATABASE_USER="$DATABASE_USER" \
--from-literal=DATABASE_PASSWORD="$DATABASE_PASSWORD" \
--from-literal=CONFIG_DATABASE_REPLICA_USER="$DATABASE_USER" \
--from-literal=CONFIG_DATABASE_REPLICA_PASSWORD="$DATABASE_PASSWORD" \
--from-literal=AWS_ACCESS_KEY_ID="$MINIO_ROOT_USER" \
--from-literal=AWS_SECRET_ACCESS_KEY="$MINIO_ROOT_PASSWORD" \
--from-literal=DATAPLANE_CLIENT_ID= \
--from-literal=DATAPLANE_CLIENT_SECRET= \
--dry-run=client -o yaml | \
/bin/kubectl --kubeconfig "$client_config" apply -f -
"""
[[config.mounts]]
filePath = "./scripts/export-dataplane-credentials.sh"
content = """
#!/bin/sh
set -eu
kubeconfig=/kube/config.yaml
namespace=default
secret_name=airbyte-auth-secrets
credentials_dir=/credentials
client_id_file="$credentials_dir/dataplane-client-id"
client_secret_file="$credentials_dir/dataplane-client-secret"
client_id_tmp="$credentials_dir/.dataplane-client-id.$$"
client_secret_tmp="$credentials_dir/.dataplane-client-secret.$$"
umask 022
mkdir -p "$credentials_dir"
trap 'rm -f "$client_id_tmp" "$client_secret_tmp"' 0 1 2 15
client_id_b64=$(
/bin/kubectl --kubeconfig "$kubeconfig" \
--namespace "$namespace" \
get secret "$secret_name" \
-o 'jsonpath={.data.dataplane-client-id}'
)
client_secret_b64=$(
/bin/kubectl --kubeconfig "$kubeconfig" \
--namespace "$namespace" \
get secret "$secret_name" \
-o 'jsonpath={.data.dataplane-client-secret}'
)
[ -n "$client_id_b64" ] || {
echo "The bootloader did not create a data-plane client ID." >&2
exit 1
}
[ -n "$client_secret_b64" ] || {
echo "The bootloader did not create a data-plane client secret." >&2
exit 1
}
printf '%s' "$client_id_b64" | base64 -d > "$client_id_tmp"
printf '%s' "$client_secret_b64" | base64 -d > "$client_secret_tmp"
client_id=$(cat "$client_id_tmp")
if ! printf '%s' "$client_id" | grep -Eq \
'^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$'; then
echo "The bootloader returned an invalid data-plane client ID." >&2
exit 1
fi
mv -f "$client_id_tmp" "$client_id_file"
mv -f "$client_secret_tmp" "$client_secret_file"
trap - 0 1 2 15
"""
[[config.mounts]]
filePath = "./scripts/init-minio.sh"
content = """
#!/bin/sh
set -eu
for bucket in airbyte-bucket state-storage airbyte-dev-logs; do
until echo "s3.bucket.list" | weed shell -master="$SEAWEEDFS_MASTER" 2>/dev/null | grep -q "^[[:space:]]*$bucket[[:space:]]"; do
echo "s3.bucket.create -name $bucket" | weed shell -master="$SEAWEEDFS_MASTER" >/dev/null 2>&1 || true
sleep 2
done
echo "bucket $bucket ready"
done
"""
[[config.mounts]]
filePath = "./scripts/start-workload-launcher.sh"
content = """
#!/bin/sh
set -eu
client_id_file=/credentials/dataplane-client-id
client_secret_file=/credentials/dataplane-client-secret
[ -s "$client_id_file" ] || {
echo "Missing generated data-plane client ID." >&2
exit 1
}
[ -s "$client_secret_file" ] || {
echo "Missing generated data-plane client secret." >&2
exit 1
}
DATAPLANE_CLIENT_ID=$(cat "$client_id_file")
DATAPLANE_CLIENT_SECRET=$(cat "$client_secret_file")
export DATAPLANE_CLIENT_ID DATAPLANE_CLIENT_SECRET
exec /entrypoint.sh "$@"
"""
-2
View File
@@ -1,5 +1,3 @@
version: "3.8"
services:
akaunting:
image: docker.io/akaunting/akaunting:latest
+2 -2
View File
@@ -24,6 +24,7 @@ port = 80
host = "${main_domain}"
[config]
mounts = []
env = [
# App
"APP_URL=${main_domain}",
@@ -50,5 +51,4 @@ env = [
"MYSQL_RANDOM_ROOT_PASSWORD=yes"
]
# No custom mounts needed; volumes are already defined in compose.
[[config.mounts]]
# No custom mounts needed; volumes are already defined in compose.
+1 -2
View File
@@ -1,4 +1,3 @@
version: '3.3'
services:
alist:
image: xhofe/alist:v3.55.0
@@ -11,4 +10,4 @@ services:
restart: unless-stopped
volumes:
alist-data:
alist-data:
+2 -3
View File
@@ -1,12 +1,11 @@
version: "3.8"
services:
alltube:
image: dnomd343/alltube:latest
restart: unless-stopped
ports:
expose:
- 80
environment:
- TITLE=${TITLE}
- CONVERT=${CONVERT}
- STREAM=${STREAM}
- REMUX=${REMUX}
- REMUX=${REMUX}
+2 -3
View File
@@ -1,9 +1,8 @@
version: "3.8"
services:
ampache:
image: ampache/ampache:latest
restart: unless-stopped
ports:
expose:
- 80
volumes:
- config:/var/www/config
@@ -14,4 +13,4 @@ services:
volumes:
config: {}
log: {}
mysql: {}
mysql: {}
+2 -3
View File
@@ -1,9 +1,8 @@
version: "3.8"
services:
anonupload:
image: ghcr.io/supernova3339/anonfiles:1
restart: unless-stopped
ports:
expose:
- 80
environment:
- ADMIN_EMAIL=${ADMIN_EMAIL}
@@ -13,4 +12,4 @@ services:
- uploads:/var/www/html/uploads
volumes:
uploads: {}
uploads: {}
-2
View File
@@ -1,5 +1,3 @@
version: "3.8"
services:
anse-demo:
image: ddiu8081/anse:latest
+1 -1
View File
@@ -1,7 +1,7 @@
services:
answer:
image: apache/answer:1.4.1
ports:
expose:
- '80'
restart: on-failure
volumes:
+1 -1
View File
@@ -10,7 +10,7 @@
"docs": "https://answer.apache.org/docs"
},
"tags": [
"q&a",
"q-and-a",
"self-hosted"
]
}
+1 -2
View File
@@ -1,9 +1,8 @@
version: "3.8"
services:
anubis:
image: ghcr.io/techarohq/anubis:latest
restart: unless-stopped
ports:
expose:
- "8923" # Anubis default port
environment:
# Required: Point to your frontend service locally
+2 -3
View File
@@ -1,9 +1,8 @@
version: "3.8"
services:
anythingllm:
image: mintplexlabs/anythingllm:latest
restart: unless-stopped
ports:
expose:
- 3001
environment:
- STORAGE_DIR=/app/server/storage
@@ -13,4 +12,4 @@ services:
- SYS_ADMIN
volumes:
storage: {}
storage: {}
+4 -2
View File
@@ -2,7 +2,7 @@
"id": "anythingllm",
"name": "AnythingLLM",
"version": "latest",
"description": "AnythingLLM is a private, self-hosted, and local document chatbot platform that allows you to chat with your documents using various LLM providers.",
"description": "AnythingLLM is a private AI chat app for working with your own documents. Self-host it on your own server with Dokploy, which deploys AnythingLLM as a Docker Compose service in a few clicks.",
"logo": "logo.png",
"links": {
"github": "https://github.com/Mintplex-Labs/anything-llm",
@@ -13,5 +13,7 @@
"ai",
"llm",
"chatbot"
]
],
"seoTitle": "Self-Host AnythingLLM in minutes",
"seoDescription": "Private AI chatbot for your documents. Self-host AnythingLLM on Dokploy in minutes – no manual setup needed."
}
+1
View File
@@ -1,3 +1,4 @@
# dokploy: allow-host-ports — Anytype clients speak the any-sync protocol (TCP 33010, UDP/QUIC 33020) directly against the server; it is not HTTP, so Traefik cannot route it.
# Example: Any-Sync-Bundle with embedded MongoDB and Redis (all-in-one image)
#
# Usage:
+4 -2
View File
@@ -2,7 +2,7 @@
"id": "anytype",
"name": "Anytype",
"version": "latest",
"description": "Anytype is a personal knowledge base—your digital brain—that lets you gather, connect and remix all kinds of information. Create pages, tasks, wikis, journals—even entire apps—and define your own data model while your data stays offline-first, private and encrypted across devices.\n\nAfter installation, you can view the Anytype client configuration by running `cat /data/client-config.yml` inside the service container.",
"description": "Anytype is a private, offline-first app for notes and personal knowledge. Self-host it on your own server with Dokploy, which deploys Anytype as a Docker Compose service in a few clicks.",
"logo": "logo.png",
"links": {
"github": "https://github.com/grishy/any-sync-bundle",
@@ -13,5 +13,7 @@
"note-taking",
"local-first",
"peer-to-peer"
]
],
"seoTitle": "Self-Host Anytype with Dokploy",
"seoDescription": "Private, offline-first personal knowledge base. Self-host Anytype on Dokploy – view your client config afterward with a quick command inside the container."
}
+4 -2
View File
@@ -2,7 +2,7 @@
"id": "appflowy",
"name": "App Flowy",
"version": "0.9.3",
"description": "AppFlowy is an open-source alternative to Notion. You are in charge of your data and customizations.",
"description": "AppFlowy is a workspace app for notes, docs, and projects, and an open-source alternative to Notion. Self-host it on your own server with Dokploy, which deploys AppFlowy as a Docker Compose service in a few clicks.",
"links": {
"github": "https://github.com/AppFlowy-IO/AppFlowy",
"website": "https://appflowy.io/",
@@ -15,5 +15,7 @@
"notes",
"knowledge-base",
"notion-alternative"
]
],
"seoTitle": "Self-Host AppFlowy in minutes",
"seoDescription": "Workspace app, an alternative to Notion. Self-host AppFlowy on Dokploy in minutes – no manual setup needed."
}
+2 -3
View File
@@ -1,9 +1,8 @@
version: "3.8"
services:
apprise-api:
image: linuxserver/apprise-api:latest
restart: unless-stopped
ports:
expose:
- 8000
environment:
- PUID=1000
@@ -13,4 +12,4 @@ services:
- config:/config
volumes:
config: {}
config: {}
+1 -2
View File
@@ -1,4 +1,3 @@
version: "3.8"
services:
appsmith:
image: appsmith/appsmith-ee:v1.94
@@ -7,4 +6,4 @@ services:
restart: unless-stopped
volumes:
appsmith-data:
appsmith-data:
File diff suppressed because it is too large Load Diff
+2 -2
View File
@@ -1,7 +1,7 @@
{
"id": "appwrite",
"name": "Appwrite",
"version": "1.9.5",
"version": "2.7.0",
"description": "Appwrite is an end-to-end platform for building Web, Mobile, Native, or Backend apps, packaged as a set of Docker microservices. It includes both a backend server and a fully integrated hosting solution for deploying static and server-side rendered frontends. Appwrite abstracts the complexity and repetitiveness required to build modern apps from scratch and allows you to build secure, full-stack applications faster.\nUsing Appwrite, you can easily integrate your app with user authentication and multiple sign-in methods, a database for storing and querying users and team data, storage and file management, image manipulation, Cloud Functions, messaging, and more services.",
"links": {
"github": "https://github.com/appwrite/appwrite",
@@ -12,7 +12,7 @@
"tags": [
"database",
"firebase",
"mariadb",
"postgresql",
"mongodb",
"hosting",
"self-hosted"
+306 -46
View File
@@ -2,42 +2,78 @@
main_domain = "${domain}"
functions_domain = "functions.${main_domain}"
sites_domain = "sites.${main_domain}"
mqtt_domain = "mqtt.${main_domain}"
openssl_key = "${password:32}"
notifications_tracking_secret = "${password:32}"
db_pw = "${password:32}"
db_root_pw = "${password:32}"
db_user_pw = "${password:32}"
usage_pw = "${password:32}"
executor_secret = "${password:32}"
jobs_secret = "${password:32}"
geo_secret = "${password:32}"
# Optional AI code review of GitHub pull requests. Uncomment together with the
# _APP_REVIEWS_* variables and the appwrite-hansi service in docker-compose.yml.
# reviews_secret = "${password:32}"
console_domain = "console.${main_domain}"
[config]
# Build jobs and runtimes join <appName>_default, which isolated deployments never create
# (every service sits on the external <appName> network instead).
isolated = false
env = [
"_APP_ENV=production",
"_APP_VERSION=2.7.0",
"_APP_MEMORY_LIMIT=512M",
"_APP_EDITION=self-hosted",
"_APP_LOCALE=en",
"_APP_POOL_ADAPTER=stack",
"_APP_WORKER_PER_CORE=6",
"_APP_OPTIONS_ABUSE=enabled",
"_APP_OPTIONS_ABUSE_INCREASED_LIMIT_PROJECTS=",
"_APP_OPTIONS_FORCE_HTTPS=disabled",
"_APP_OPTIONS_ROUTER_FORCE_HTTPS=disabled",
"_APP_OPTIONS_ROUTER_PROTECTION=disabled",
"_APP_ROUTER_AUTO_CERTIFICATES=enabled",
"_APP_LOCKING_ENABLED=enabled",
"_APP_OPENSSL_KEY_V1=${openssl_key}",
"_APP_OPENSSL_KEY_V2=",
"_APP_OPENSSL_KEY_CURRENT=1",
"_APP_OPENSSL_KEY_OLDEST=1",
"_APP_NOTIFICATIONS_TRACKING_SECRET=${notifications_tracking_secret}",
"_APP_NOTIFICATIONS_PUSH_APNS=",
"_APP_NOTIFICATIONS_PUSH_APNS_KEY=",
"_APP_DOMAIN=${main_domain}",
"_APP_CONSOLE_DOMAIN=${main_domain}",
"_APP_CONSOLE_DOMAIN=${console_domain}",
"_APP_CONSOLE_URL=https://${console_domain}",
"_APP_CONSOLE_HOSTNAMES=${console_domain}",
"_APP_CONSOLE_TRUSTED_PROJECTS=",
"_APP_CUSTOM_DOMAIN_DENY_LIST=example.com,test.com,app.example.com",
"_APP_DOMAIN_FUNCTIONS=${functions_domain}",
"_APP_DOMAIN_FUNCTIONS_FALLBACK=",
"_APP_DOMAIN_SITES=${sites_domain}",
"_APP_DOMAIN_TARGET_CNAME=localhost",
"_APP_DOMAIN_TARGET_AAAA=::1",
"_APP_DOMAIN_TARGET_A=127.0.0.1",
"_APP_DOMAIN_TARGET_CAA=",
"_APP_DNS=8.8.8.8",
"_APP_DNS_EXTERNAL=",
"_APP_ALLOWED_INTERNAL_ADDRESSES=",
"_APP_TRUSTED_HEADERS=x-forwarded-for",
"_APP_CONSOLE_WHITELIST_ROOT=enabled",
"_APP_CONSOLE_WHITELIST_EMAILS=",
"_APP_CONSOLE_WHITELIST_IPS=",
"_APP_CONSOLE_HOSTNAMES=",
"_APP_CONSOLE_SCHEMA=appwriteio",
"_APP_CONSOLE_SESSION_ALERTS=disabled",
"_APP_CONSOLE_COUNTRIES_DENYLIST=",
"_APP_CONSOLE_GITHUB_APP_ID=",
"_APP_CONSOLE_GITHUB_SECRET=",
"_APP_CONSOLE_GITLAB_APP_ID=",
"_APP_CONSOLE_GITLAB_SECRET=",
"_APP_CONSOLE_GITLAB_ENDPOINT=",
"_APP_CONSOLE_BITBUCKET_APP_ID=",
"_APP_CONSOLE_BITBUCKET_SECRET=",
"_APP_CONSOLE_GOOGLE_APP_ID=",
"_APP_CONSOLE_GOOGLE_SECRET=",
"_APP_SYSTEM_EMAIL_NAME=Appwrite",
"_APP_SYSTEM_EMAIL_ADDRESS=noreply@appwrite.io",
"_APP_SYSTEM_TEAM_EMAIL=team@appwrite.io",
@@ -46,33 +82,58 @@ env = [
"_APP_EMAIL_CERTIFICATES=",
"_APP_COMPRESSION_ENABLED=enabled",
"_APP_COMPRESSION_MIN_SIZE_BYTES=1024",
"_APP_USAGE_STATS=enabled",
"_APP_USAGE_AGGREGATION_INTERVAL=30",
"_APP_STATS_RESOURCES_INTERVAL=30",
"_APP_LOGGING_PROVIDER=",
"_APP_LOGGING_CONFIG=",
"_APP_LOGGING_CONFIG_REALTIME=",
"_APP_EXPERIMENT_LOGGING_PROVIDER=",
"_APP_EXPERIMENT_LOGGING_CONFIG=",
"_APP_LOGGING_FORMAT=pretty",
"_APP_GEO_ENDPOINT=http://appwrite-geo/v1",
"_APP_GEO_SECRET=${geo_secret}",
"_APP_REDIS_HOST=redis",
"_APP_REDIS_PORT=6379",
"_APP_REDIS_USER=",
"_APP_REDIS_PASS=",
"_APP_DB_ADAPTER=mongodb",
"_APP_DB_HOST=mongodb",
"_APP_DB_PORT=27017",
"_APP_DB_ADAPTER=postgresql",
"_APP_DB_HOST=postgresql",
"_APP_DB_PORT=5432",
"_APP_DB_SCHEMA=appwrite",
"_APP_DB_USER=user",
"_APP_DB_PASS=${db_user_pw}",
"_APP_DB_ROOT_PASS=${db_root_pw}",
"_APP_DB_PASS=${db_pw}",
"_APP_DATABASE_SHARED_TABLES=",
"_APP_DATABASE_SHARED_NAMESPACE=",
"_APP_DB_ADAPTER_VECTORSDB=",
"_APP_DB_HOST_VECTORSDB=",
"_APP_DB_PORT_VECTORSDB=",
"_APP_LIMIT_DATABASE_BATCH=100",
"_APP_DOCUMENTSDB=enabled",
"_APP_DB_ADAPTER_DOCUMENTSDB=mongodb",
"_APP_DB_HOST_DOCUMENTSDB=mongodb",
"_APP_DB_PORT_DOCUMENTSDB=27017",
"_APP_DB_SCHEMA_DOCUMENTSDB=",
"_APP_DB_USER_DOCUMENTSDB=",
"_APP_DB_PASS_DOCUMENTSDB=",
"_APP_CONNECTIONS_DATABASE_DOCUMENTSDB=",
"_APP_VECTORSDB=enabled",
"_APP_DB_ADAPTER_VECTORSDB=postgresql",
"_APP_DB_HOST_VECTORSDB=postgresql",
"_APP_DB_PORT_VECTORSDB=5432",
"_APP_DB_SCHEMA_VECTORSDB=",
"_APP_DB_USER_VECTORSDB=",
"_APP_DB_PASS_VECTORSDB=",
"_APP_CONNECTIONS_DATABASE_VECTORSDB=",
"_APP_EMBEDDING=disabled",
"_APP_USAGE_STATS=enabled",
"_APP_USAGE_PASS=${usage_pw}",
"_APP_CONNECTIONS_DB_USAGE=http://appwrite:${usage_pw}@clickhouse:8123/appwrite",
"_APP_POOL_SIZE_USAGE=2",
"_APP_CONNECTIONS_DB_EXECUTIONS=http://appwrite:${usage_pw}@clickhouse:8123/appwrite",
"_APP_POOL_SIZE_EXECUTIONS=2",
"_APP_MAINTENANCE_RETENTION_USAGE_TTL=180",
"_APP_STATS_USAGE_QUEUE_NAME=v1-stats-usage",
"_APP_STATS_RESOURCES_QUEUE_NAME=v1-stats-resources",
"_APP_MAINTENANCE_QUEUE_NAME=v1-maintenance",
"_APP_STATS_RESOURCES_INTERVAL=3600",
"_APP_ALERTS_INTERVAL=60",
"_APP_ALERTS_USAGE_LAG=120",
"_APP_MQTT_REPLAY_DEPTH=5",
"_APP_MQTT_MAX_PACKET_SIZE=64000",
"_APP_LIMIT_REALTIME_SUBSCRIPTIONS=100",
"_APP_LIMIT_REALTIME_CHANNELS=100",
"_APP_LIMIT_REALTIME_QUERIES=100",
"_APP_SMTP_HOST=",
"_APP_SMTP_PORT=",
"_APP_SMTP_SECURE=",
@@ -81,8 +142,11 @@ env = [
"_APP_SMS_PROVIDER=",
"_APP_SMS_FROM=",
"_APP_SMS_PROJECTS_DENY_LIST=",
"_APP_PWNED_PASSWORDS_DSN=none://localhost",
"_APP_STORAGE_LIMIT=30000000",
"_APP_STORAGE_PREVIEW_LIMIT=20000000",
"_APP_AUTOGRAVITY_HOST=http://appwrite-autogravity:8080",
"_APP_EXIFTOOL_HOST=http://appwrite-exiftool:8080",
"_APP_STORAGE_ANTIVIRUS=disabled",
"_APP_STORAGE_ANTIVIRUS_HOST=clamav",
"_APP_STORAGE_ANTIVIRUS_PORT=3310",
@@ -92,6 +156,7 @@ env = [
"_APP_STORAGE_S3_REGION=us-east-1",
"_APP_STORAGE_S3_BUCKET=",
"_APP_STORAGE_S3_ENDPOINT=",
"_APP_STORAGE_S3_PATH_STYLE=",
"_APP_STORAGE_DO_SPACES_ACCESS_KEY=",
"_APP_STORAGE_DO_SPACES_SECRET=",
"_APP_STORAGE_DO_SPACES_REGION=us-east-1",
@@ -109,34 +174,46 @@ env = [
"_APP_STORAGE_WASABI_REGION=eu-central-1",
"_APP_STORAGE_WASABI_BUCKET=",
"_APP_COMPUTE_SIZE_LIMIT=30000000",
"_APP_COMPUTE_BUILD_TIMEOUT=900",
"_APP_COMPUTE_BUILD_SIZE_LIMIT=2000000000",
"_APP_COMPUTE_BUILD_TIMEOUT=2700",
"_APP_COMPUTE_CPUS=0",
"_APP_COMPUTE_MEMORY=0",
"_APP_COMPUTE_INACTIVE_THRESHOLD=60",
"_APP_COMPUTE_MAINTENANCE_INTERVAL=3600",
"_APP_COMPUTE_RUNTIMES_NETWORK=dokploy-network",
"_APP_OPEN_RUNTIMES_NFT=enabled",
"_APP_FUNCTIONS_TIMEOUT=900",
"_APP_FUNCTIONS_CREATION_ABUSE_LIMIT=5000",
"_APP_FUNCTIONS_RUNTIMES=node-22,python-3.12,php-8.3,ruby-3.3,dart-3.5,go-1.23,rust-1.83,bun-1.1,deno-1.46,java-21.0,dotnet-8.0",
"_APP_FUNCTIONS_SCHEDULE_SPREAD=0",
"_APP_FUNCTIONS_RUNTIMES=node-22,node-24,node-26,python-3.12,php-8.3,ruby-3.3,dart-3.5,go-1.23,rust-1.83,bun-1.1,deno-1.46,java-21.0,dotnet-8.0",
"_APP_SITES_TIMEOUT=900",
"_APP_SITES_RUNTIMES=static-1,node-22",
"_APP_EXECUTOR_SECRET=${executor_secret}",
"_APP_EXECUTOR_HOST=http://openruntimes-executor/v1",
"_APP_EXECUTOR_IMAGES=openruntimes/node:v5-22,openruntimes/python:v5-3.12,openruntimes/php:v5-8.3,openruntimes/static:v5-1",
"_APP_OPEN_RUNTIMES_NFT=enabled",
"_APP_EXECUTOR_CONNECTION_STORAGE=local://localhost",
"_APP_JOBS_HOST=http://orchestrator:8080",
"_APP_JOBS_SECRET=${jobs_secret}",
"_APP_JOBS_ENDPOINT=http://appwrite",
# Reviews are opt-in: the shared secret turns the /v1/reviews API on, and the
# console hides the screen in the self-hosted profile regardless.
# "_APP_REVIEWS_SECRET=${reviews_secret}",
# "_APP_REVIEWS_MODEL=anthropic/claude-sonnet-4.5",
# "_APP_REVIEWS_VERIFY_MODEL=",
# "_APP_REVIEWS_AI_GATEWAY_KEY=",
"_APP_BROWSER_HOST=http://appwrite-browser:3000/v1",
"_APP_WORKER_SCREENSHOTS_ROUTER=http://appwrite",
"_APP_DOCKER_HUB_USERNAME=",
"_APP_DOCKER_HUB_PASSWORD=",
"_APP_MAINTENANCE_INTERVAL=86400",
"_APP_MAINTENANCE_INACTIVE_INTERVAL=604800",
"_APP_MAINTENANCE_START_TIME=00:00",
"_APP_MAINTENANCE_RETENTION_CACHE=2592000",
"_APP_MAINTENANCE_RETENTION_EXECUTION=1209600",
"_APP_MAINTENANCE_RETENTION_AUDIT=1209600",
"_APP_MAINTENANCE_RETENTION_AUDIT_CONSOLE=15778800",
"_APP_MAINTENANCE_RETENTION_ABUSE=86400",
"_APP_MAINTENANCE_RETENTION_USAGE_HOURLY=8640000",
"_APP_MAINTENANCE_RETENTION_SCHEDULES=86400",
"_APP_MAINTENANCE_RETENTION_ALERTS=7776000",
"_APP_INTERVAL_DOMAIN_VERIFICATION=120",
"_APP_INTERVAL_CLEANUP_STALE_EXECUTIONS=300",
"_APP_GRAPHQL_INTROSPECTION=enabled",
@@ -150,32 +227,55 @@ env = [
"_APP_VCS_GITHUB_CLIENT_ID=",
"_APP_VCS_GITHUB_CLIENT_SECRET=",
"_APP_VCS_GITHUB_WEBHOOK_SECRET=",
"_APP_VCS_GITEA_ENDPOINT=",
"_APP_VCS_GITEA_BROWSER_ENDPOINT=",
"_APP_VCS_GITEA_CLIENT_ID=",
"_APP_VCS_GITEA_CLIENT_SECRET=",
"_APP_VCS_GITEA_WEBHOOK_SECRET=",
"_APP_VCS_GITLAB_ENDPOINT=",
"_APP_VCS_GITLAB_CLIENT_ID=",
"_APP_VCS_GITLAB_CLIENT_SECRET=",
"_APP_VCS_GITLAB_WEBHOOK_SECRET=",
"_APP_VCS_BITBUCKET_CLIENT_ID=",
"_APP_VCS_BITBUCKET_CLIENT_SECRET=",
"_APP_VCS_BITBUCKET_WEBHOOK_SECRET=",
"_APP_VCS_ORIGIN_CLIENT_ID=",
"_APP_VCS_ORIGIN_PRIVATE_KEY=",
"_APP_VCS_ENTIRE_PLUGIN=",
"_APP_VCS_ENTIRE_PRIVATE_KEY=",
"_APP_VCS_ENTIRE_ISSUER=",
"_APP_VCS_ENTIRE_ENDPOINT=",
"_APP_VCS_WEBHOOK_URL=",
"_APP_MIGRATION_HOST=appwrite",
"_APP_MIGRATIONS_FIREBASE_CLIENT_ID=",
"_APP_MIGRATIONS_FIREBASE_CLIENT_SECRET=",
"_APP_ASSISTANT_OPENAI_API_KEY=",
"_APP_DB_ROOT_PASS=${db_root_pw}",
"_APP_DB_USER_PASS=${db_user_pw}",
"_APP_DB_MAX_CONNECTIONS=500",
]
[[config.mounts]]
filePath = "mongo-init.js"
content = """// mongo-init.js
// Switch to the admin database
const adminDb = db.getSiblingDB('admin');
// Get username and password from environment variables
const username = process.env.MONGO_INITDB_USERNAME;
const password = process.env.MONGO_INITDB_PASSWORD;
const database = process.env.MONGO_INITDB_DATABASE;
// Create the user
adminDb.createUser({
user: username,
pwd: password,
roles: [
{ role: 'readWrite', db: database }
]
});
// Idempotent: the official entrypoint races the real server on port 27017 when
// initialising a fresh volume (appwrite/appwrite#13593), so this script may run
// more than once. Skip if the user already exists.
if (adminDb.getUser(username) === null) {
adminDb.createUser({
user: username,
pwd: password,
roles: [
{ role: 'readWrite', db: database }
]
});
}
"""
[[config.mounts]]
@@ -183,7 +283,6 @@ filePath = "mongo-entrypoint.sh"
content = """#!/bin/bash
set -e
# Fix keyfile permissions if mounted from volume
KEYFILE_PATH="/data/keyfile/mongo-keyfile"
if [ ! -f "$KEYFILE_PATH" ]; then
@@ -195,16 +294,183 @@ fi
chmod 400 "$KEYFILE_PATH"
chown mongodb:mongodb "$KEYFILE_PATH" 2>/dev/null || chown 999:999 "$KEYFILE_PATH"
# Use MongoDB's standard entrypoint with our command
# The standard entrypoint initialises an empty data directory with a second
# mongod on 27017, stopped with `mongod --shutdown`. That returns once the
# server clears <dbpath>/mongod.lock, several steps before it exits and
# releases the port, and the real server binds a millisecond after it starts --
# so a slow shutdown tail leaves it exiting 48, "Address already in use",
# taking the container with it (appwrite/appwrite#13593). Initialise here
# instead, on a port the real server never binds, and hand over a directory
# the standard entrypoint has nothing left to do.
INIT_MARKER=/data/db/.appwrite-initialised
if [ ! -e "$INIT_MARKER" ]; then
INIT_PORT=27018
echo "Initialising MongoDB data directory..."
find -L /data/db \\! -user mongodb -exec chown mongodb '{}' +
export MONGO_INITDB_DATABASE="${MONGO_INITDB_DATABASE:-test}"
gosu mongodb mongod --dbpath /data/db --bind_ip 127.0.0.1 --port "$INIT_PORT" &
INIT_SERVER=$!
READY=
for _ in $(seq 1 30); do
if mongosh --host 127.0.0.1 --port "$INIT_PORT" --quiet --eval 'quit(0)' > /dev/null 2>&1; then
READY=1
break
fi
if ! kill -0 "$INIT_SERVER" 2>/dev/null; then
break
fi
sleep 1
done
if [ -z "$READY" ]; then
echo "MongoDB did not accept connections for initialisation" >&2
exit 1
fi
mongosh --host 127.0.0.1 --port "$INIT_PORT" --quiet admin --eval '
const username = process.env.MONGO_INITDB_ROOT_USERNAME;
if (db.getUser(username) === null) {
db.createUser({
user: username,
pwd: process.env.MONGO_INITDB_ROOT_PASSWORD,
roles: [{ role: "root", db: "admin" }]
});
}
'
mongosh --host 127.0.0.1 --port "$INIT_PORT" --quiet "$MONGO_INITDB_DATABASE" /mongo-init.js
touch "$INIT_MARKER"
kill -TERM "$INIT_SERVER"
wait "$INIT_SERVER"
echo "MongoDB data directory initialised."
fi
exec docker-entrypoint.sh mongod --replSet rs0 --bind_ip_all --auth --keyFile "$KEYFILE_PATH"
"""
[[config.mounts]]
filePath = "clickhouse-config.xml"
content = """<?xml version="1.0"?>
<!--
Retention for ClickHouse's own system log tables.
Every <ttl> in the image's config.xml sits inside an XML comment, so these
tables keep every row forever, and the metric ones add a row per second
whether or not the instance serves traffic. Left alone they outgrow the
usage data they sit next to and fill the volume.
When a window here changes, ClickHouse replaces the table on the next
restart and keeps the old one, rows and all, as <log>_<N>.
clickhouse-init.sh gives those old tables the same window.
-->
<clickhouse>
<!-- The metric, trace and profile logs sample the server every second whether
or not Appwrite serves traffic, and nothing reads them back, so their
writes and the merges behind them are pure overhead. -->
<asynchronous_metric_log remove="1"/>
<metric_log remove="1"/>
<histogram_metric_log remove="1"/>
<query_metric_log remove="1"/>
<processors_profile_log remove="1"/>
<trace_log remove="1"/>
<!-- text_log repeats the server log the container already writes. -->
<text_log remove="1"/>
<!-- Kept for debugging, capped so they cannot fill the volume. -->
<asynchronous_insert_log><ttl>event_date + INTERVAL 3 DAY DELETE</ttl></asynchronous_insert_log>
<query_log><ttl>event_date + INTERVAL 7 DAY DELETE</ttl></query_log>
<query_views_log><ttl>event_date + INTERVAL 7 DAY DELETE</ttl></query_views_log>
<query_thread_log><ttl>event_date + INTERVAL 7 DAY DELETE</ttl></query_thread_log>
<part_log><ttl>event_date + INTERVAL 7 DAY DELETE</ttl></part_log>
<background_schedule_pool_log><ttl>event_date + INTERVAL 7 DAY DELETE</ttl></background_schedule_pool_log>
<!-- Longer, so it still covers a report that reaches us late. crash_log is
deliberately left alone: it is tiny and worth keeping. -->
<error_log><ttl>event_date + INTERVAL 14 DAY DELETE</ttl></error_log>
</clickhouse>
"""
[[config.mounts]]
filePath = "clickhouse-init.sh"
content = """#!/bin/bash
# The ClickHouse entrypoint sources this file, so a subshell keeps these options out of it.
(
set -euo pipefail
client() {
clickhouse-client --host 127.0.0.1 --user "$CLICKHOUSE_USER" --password "$CLICKHOUSE_PASSWORD" "$@"
}
# Flushing replaces log tables whose definition changed, keeping each old table as <log>_<N>.
client --query 'SYSTEM FLUSH LOGS'
# Tables left behind never expire on their own: take the TTL of the log that
# replaced this one, or a week when the log is no longer written at all.
# The named logs must match the ones clickhouse-config.xml removes: a log that
# is still written gets replaced on the next restart if its TTL is altered here.
client --format TSVRaw <<'SQL' | client --multiquery
SELECT concat('ALTER TABLE system.', stale.name, ' MODIFY TTL ', if(active.name = '', 'event_date + INTERVAL 7 DAY DELETE', splitByString(' SETTINGS ', splitByString(' TTL ', active.engine_full)[2])[1]), ';')
FROM (
SELECT name, splitByChar('_', name)[-1] AS suffix, arrayStringConcat(arrayPopBack(splitByChar('_', name)), '_') AS log
FROM system.tables
WHERE database = 'system'
AND position(engine_full, ' TTL ') = 0
AND endsWith(engine, 'MergeTree')
AND name IN (SELECT table FROM system.columns WHERE database = 'system' AND name = 'event_date' AND type = 'Date')
) AS stale
LEFT JOIN system.tables AS active
ON active.database = 'system'
AND active.name = stale.log
AND position(active.engine_full, ' TTL ') > 0
WHERE (endsWith(stale.log, '_log') AND toUInt64OrNull(stale.suffix) IS NOT NULL)
OR stale.name IN ('asynchronous_metric_log', 'metric_log', 'histogram_metric_log', 'query_metric_log', 'processors_profile_log', 'trace_log', 'text_log')
SQL
)
"""
[[config.domains]]
serviceName = "appwrite-console"
port = 3000
host = "${main_domain}"
path = "/"
[[config.domains]]
serviceName = "appwrite"
port = 80
host = "${main_domain}"
path = "/v1"
[[config.domains]]
serviceName = "appwrite"
port = 80
host = "${main_domain}"
path = "/.well-known"
[[config.domains]]
serviceName = "appwrite-realtime"
port = 80
host = "${main_domain}"
path = "/v1/realtime"
# --- Dedicated Console domain ---
# The Console SPA is served at the root of ${console_domain}, with /v1 and
# /v1/realtime proxied to the API and Realtime so the Console reaches the API
# on its own origin.
[[config.domains]]
serviceName = "appwrite-console"
port = 3000
host = "${console_domain}"
path = "/"
[[config.domains]]
serviceName = "appwrite"
port = 80
host = "${console_domain}"
path = "/v1"
[[config.domains]]
serviceName = "appwrite-realtime"
port = 80
host = "${console_domain}"
path = "/v1/realtime"
[[config.domains]]
serviceName = "appwrite"
port = 80
@@ -218,13 +484,7 @@ host = "${functions_domain}"
path = "/"
[[config.domains]]
serviceName = "appwrite-console"
port = 80
host = "${main_domain}"
path = "/console"
[[config.domains]]
serviceName = "appwrite-realtime"
port = 80
host = "${main_domain}"
path = "/v1/realtime"
serviceName = "appwrite-mqtt"
port = 8083
host = "${mqtt_domain}"
path = "/"
+2 -3
View File
@@ -1,9 +1,8 @@
version: "3.8"
services:
arangodb:
image: arangodb:3.12.4
restart: unless-stopped
ports:
expose:
- 8529
environment:
- ARANGO_ROOT_PASSWORD=${ARANGO_PASSWORD}
@@ -11,4 +10,4 @@ services:
- data:/var/lib/arangodb3
volumes:
data: {}
data: {}
-2
View File
@@ -1,5 +1,3 @@
version: "3.8"
# Arche — AI workspace platform that spawns per-user OpenCode containers
# via a Docker socket proxy.
#
+1 -2
View File
@@ -9,8 +9,7 @@ services:
PUBLIC_SNAPSHOTS: ${PUBLIC_SNAPSHOTS}
volumes:
- archivebox_data:/data
ports:
expose:
- "8000"
volumes:
archivebox_data:
+2 -3
View File
@@ -1,9 +1,8 @@
version: "3.8"
services:
argilla-web:
image: argilla/argilla-server:latest
restart: unless-stopped
ports:
expose:
- 6900
environment:
- ARGILLA_HOME_PATH=/var/lib/argilla
@@ -74,4 +73,4 @@ volumes:
argilladata: {}
elasticdata: {}
dbdata: {}
redisdata: {}
redisdata: {}
+2 -3
View File
@@ -1,9 +1,8 @@
version: "3.8"
services:
audiobookshelf:
image: ghcr.io/advplyr/audiobookshelf:2.19.4
restart: unless-stopped
ports:
expose:
- 80
environment:
- TZ=UTC
@@ -14,4 +13,4 @@ services:
volumes:
config: {}
metadata: {}
metadata: {}
+2 -3
View File
@@ -16,9 +16,8 @@ services:
condition: service_healthy
postgres:
condition: service_healthy
ports:
expose:
- 9091
redis:
image: redis:7-alpine
restart: unless-stopped
@@ -52,4 +51,4 @@ services:
volumes:
authelia_config:
redis_data:
postgres_data:
postgres_data:
+5 -2
View File
@@ -2,7 +2,7 @@
"id": "authelia",
"name": "Authelia",
"version": "latest",
"description": "The Single Sign-On Multi-Factor portal for web apps. An open-source authentication and authorization server providing 2FA and SSO via web portal.",
"description": "Authelia is an open-source authentication portal for single sign-on (SSO) and two-factor authentication. Self-host it on your own server with Dokploy, which deploys Authelia as a Docker Compose service in a few clicks.",
"logo": "authelia.png",
"links": {
"github": "https://github.com/authelia/authelia",
@@ -17,5 +17,8 @@
"security",
"reverse-proxy",
"ldap"
]
],
"seoTitle": "Authelia Docker Compose Setup",
"seoDescription": "Single sign-on and two-factor auth portal. Deploy Authelia with Docker Compose on Dokploy in minutes – free, open source, self-hosted.",
"newConfig": true
}
+13 -30
View File
@@ -1,4 +1,3 @@
version: "3.8"
services:
postgresql:
image: docker.io/library/postgres:18-alpine
@@ -18,34 +17,20 @@ services:
expose:
- 5432
redis:
image: docker.io/library/redis:alpine
command: --save 60 1 --loglevel warning
restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "redis-cli ping | grep PONG"]
start_period: 20s
interval: 30s
retries: 5
timeout: 3s
volumes:
- redis:/data
expose:
- 6379
server:
image: ${AUTHENTIK_IMAGE:-ghcr.io/goauthentik/server}:${AUTHENTIK_TAG:-2026.2.2}
image: ${AUTHENTIK_IMAGE:-ghcr.io/goauthentik/server}:${AUTHENTIK_TAG:-2026.8.2}
restart: unless-stopped
command: server
shm_size: 512mb
environment:
AUTHENTIK_SECRET_KEY: ${AUTHENTIK_SECRET_KEY}
AUTHENTIK_REDIS__HOST: redis
AUTHENTIK_WEB__BASE_URL: ${AUTHENTIK_WEB__BASE_URL}
AUTHENTIK_POSTGRESQL__HOST: postgresql
AUTHENTIK_POSTGRESQL__USER: ${PG_USER}
AUTHENTIK_POSTGRESQL__NAME: ${PG_DB}
AUTHENTIK_POSTGRESQL__PASSWORD: ${PG_PASS}
volumes:
- media:/media
- data:/data
- custom-templates:/templates
expose:
- 9000
@@ -53,38 +38,36 @@ services:
depends_on:
postgresql:
condition: service_healthy
redis:
condition: service_healthy
worker:
image: ${AUTHENTIK_IMAGE:-ghcr.io/goauthentik/server}:${AUTHENTIK_TAG:-2026.2.2}
image: ${AUTHENTIK_IMAGE:-ghcr.io/goauthentik/server}:${AUTHENTIK_TAG:-2026.8.2}
restart: unless-stopped
command: worker
shm_size: 512mb
environment:
AUTHENTIK_SECRET_KEY: ${AUTHENTIK_SECRET_KEY}
AUTHENTIK_REDIS__HOST: redis
AUTHENTIK_WEB__BASE_URL: ${AUTHENTIK_WEB__BASE_URL}
AUTHENTIK_POSTGRESQL__HOST: postgresql
AUTHENTIK_POSTGRESQL__USER: ${PG_USER}
AUTHENTIK_POSTGRESQL__NAME: ${PG_DB}
AUTHENTIK_POSTGRESQL__PASSWORD: ${PG_PASS}
user: root
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- media:/media
- data:/data
- certs:/certs
- custom-templates:/templates
depends_on:
postgresql:
condition: service_healthy
redis:
condition: service_healthy
# Create the worker after the server so both don't populate the fresh
# shared "data" volume from the image at the same time (race on /data/media).
server:
condition: service_started
volumes:
database:
driver: local
redis:
driver: local
media:
data:
driver: local
certs:
driver: local
+6 -3
View File
@@ -1,8 +1,8 @@
{
"id": "authentik",
"name": "Authentik",
"version": "2026.2.2",
"description": "Authentik is an open-source Identity Provider for authentication and authorization. It provides a comprehensive solution for managing user authentication, authorization, and identity federation with support for SAML, OAuth2, OIDC, and more.",
"version": "2026.8.2",
"description": "Authentik is an identity provider for single sign-on (SSO) authorization and authentication, with support for SAML, OAuth2, OIDC, and more. Self-host it on your own server with Dokploy, which deploys Authentik as a Docker Compose service in a few clicks.",
"links": {
"github": "https://github.com/goauthentik/authentik",
"website": "https://goauthentik.io/",
@@ -17,5 +17,8 @@
"saml",
"oauth2",
"self-hosted"
]
],
"seoTitle": "Authentik Docker Compose Setup",
"seoDescription": "Identity provider for SSO and authentication. Deploy Authentik with Docker Compose on Dokploy in minutes – free, open source, self-hosted.",
"newConfig": true
}
+2 -1
View File
@@ -22,5 +22,6 @@ PG_USER = "${pg_user}"
PG_DB = "${pg_db}"
PG_PASS = "${password:32}" # Password for PostgreSQL authentication
AUTHENTIK_SECRET_KEY = "${password:64}" # Secret key for Authentik authentication
AUTHENTIK_WEB__BASE_URL = "https://${main_domain}"
AUTHENTIK_IMAGE = "ghcr.io/goauthentik/server"
AUTHENTIK_TAG = "2026.2.2"
AUTHENTIK_TAG = "2026.8.2"
+2 -3
View File
@@ -1,9 +1,8 @@
version: "3.8"
services:
authorizer:
image: lakhansamani/authorizer:1.4.4
restart: unless-stopped
ports:
expose:
- 8080
environment:
- DATABASE_TYPE=postgres
@@ -37,4 +36,4 @@ services:
volumes:
db_data: {}
redis_data: {}
redis_data: {}
+2 -2
View File
@@ -1,8 +1,8 @@
services:
autobase-console:
image: autobase/console:2.7.2
image: autobase/console:2.11.0
restart: unless-stopped
ports:
expose:
- "80"
- "8080"
environment:
+1 -1
View File
@@ -1,7 +1,7 @@
{
"id": "autobase",
"name": "Autobase",
"version": "2.7.2",
"version": "2.11.0",
"description": "Autobase for PostgreSQL® is an open-source alternative to cloud-managed databases (self-hosted DBaaS).",
"links": {
"github": "https://github.com/vitabaks/autobase",
+15 -14
View File
@@ -1,17 +1,15 @@
version: "3.8"
services:
automatisch:
image: dockeriddonuts/automatisch:2.0
image: automatischio/automatisch:0.15.0
restart: unless-stopped
ports:
- 3000
environment:
- HOST=${DOMAIN}
- PROTOCOL=http
- PORT=3000
- API_URL=http://${DOMAIN}
- WEB_APP_URL=http://${DOMAIN}
- APP_ENV=production
- REDIS_HOST=automatisch-redis
- REDIS_USERNAME=default
- REDIS_PASSWORD=${REDIS_PASSWORD}
- POSTGRES_HOST=automatisch-postgres
- POSTGRES_DATABASE=automatisch
@@ -23,11 +21,13 @@ services:
volumes:
- storage:/automatisch/storage
depends_on:
- automatisch-postgres
- automatisch-redis
automatisch-postgres:
condition: service_healthy
automatisch-redis:
condition: service_started
automatisch-worker:
image: dockeriddonuts/automatisch:2.0
image: automatischio/automatisch:0.15.0
restart: unless-stopped
environment:
- APP_ENV=production
@@ -44,8 +44,7 @@ services:
volumes:
- storage:/automatisch/storage
depends_on:
- automatisch-postgres
- automatisch-redis
- automatisch
automatisch-postgres:
image: postgres:15-alpine
@@ -56,18 +55,20 @@ services:
- POSTGRES_DB=automatisch
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres -d automatisch"]
interval: 10s
timeout: 5s
retries: 5
automatisch-redis:
image: redis:7-alpine
restart: unless-stopped
command: redis-server --requirepass ${REDIS_PASSWORD}
environment:
- REDIS_USERNAME=default
- REDIS_PASSWORD=${REDIS_PASSWORD}
volumes:
- redis_data:/data
volumes:
storage: {}
postgres_data: {}
redis_data: {}
redis_data: {}
+1 -1
View File
@@ -1,7 +1,7 @@
{
"id": "automatisch",
"name": "Automatisch",
"version": "2.0",
"version": "0.15.0",
"description": "Automatisch is a powerful, self-hosted workflow automation tool designed for connecting your apps and automating repetitive tasks. With Automatisch, you can create workflows to sync data, send notifications, and perform various actions seamlessly across different services.",
"logo": "logo.png",
"links": {
+1
View File
@@ -13,6 +13,7 @@ port = 3000
host = "${main_domain}"
[config.env]
DOMAIN = "${main_domain}"
DB_PASSWORD = "${db_password}"
REDIS_PASSWORD = "${redis_password}"
ENCRYPTION_KEY = "${encryption_key}"
+57
View File
@@ -0,0 +1,57 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="868.000000pt" height="868.000000pt" viewBox="0 0 868.000000 868.000000"
preserveAspectRatio="xMidYMid meet">
<metadata>
Created by potrace 1.11, written by Peter Selinger 2001-2013
</metadata>
<g transform="translate(0.000000,868.000000) scale(0.100000,-0.100000)"
fill="#000000" stroke="none">
<path d="M4184 7124 c-89 -99 -106 -117 -173 -190 -31 -33 -88 -96 -127 -140
-40 -44 -85 -94 -100 -110 -34 -37 -161 -177 -187 -208 -10 -11 -58 -64 -106
-116 -48 -52 -139 -151 -201 -220 -62 -69 -134 -148 -159 -175 -25 -28 -66
-73 -91 -100 -39 -43 -173 -191 -249 -274 -12 -14 -60 -66 -105 -115 -44 -50
-88 -97 -96 -106 -8 -9 -49 -54 -90 -100 -41 -46 -82 -91 -90 -100 -8 -9 -55
-61 -105 -115 -49 -55 -111 -122 -136 -150 -25 -27 -65 -72 -90 -99 -24 -27
-53 -59 -64 -70 -11 -12 -56 -61 -100 -110 -44 -50 -91 -101 -105 -116 -14
-14 -56 -61 -94 -103 -76 -85 -75 -84 -196 -216 -47 -52 -93 -103 -103 -115
-10 -11 -58 -63 -105 -115 -48 -51 -95 -103 -105 -115 -18 -21 -138 -152 -187
-206 -14 -15 -56 -62 -95 -105 -38 -42 -83 -92 -100 -109 -16 -18 -66 -72
-110 -121 -79 -88 -189 -209 -210 -231 -5 -6 -44 -48 -85 -95 -41 -46 -84 -93
-95 -104 -11 -12 -38 -41 -59 -66 -22 -24 -82 -90 -133 -146 -52 -56 -103
-113 -113 -126 l-19 -24 72 -76 c40 -41 162 -169 272 -283 231 -239 400 -415
509 -529 l77 -79 22 26 c26 29 173 192 202 222 11 12 56 62 100 111 44 50 83
92 86 95 3 3 54 59 114 125 60 66 126 138 146 160 77 85 93 102 153 169 33 37
72 80 86 95 41 45 193 213 241 266 24 27 53 59 64 70 11 12 58 64 105 115 47
52 96 105 109 119 13 14 53 59 90 100 36 41 73 81 81 90 9 9 56 61 105 116 50
55 92 102 95 105 3 3 52 57 110 120 57 63 144 160 194 214 50 55 100 110 111
122 70 77 192 212 326 359 138 152 173 191 244 269 11 13 61 67 110 121 50 54
98 107 108 119 10 12 35 39 55 61 21 22 78 85 127 140 50 54 113 123 140 153
l51 54 139 -147 c77 -80 165 -172 195 -204 86 -90 352 -369 420 -441 85 -89
357 -376 400 -421 19 -20 100 -105 180 -189 80 -84 165 -174 190 -200 25 -26
115 -120 200 -210 210 -221 223 -235 400 -421 227 -238 245 -257 323 -339 163
-172 428 -450 513 -540 50 -52 135 -142 190 -199 54 -58 147 -154 206 -215
l106 -111 40 45 c22 25 57 64 78 86 22 23 75 81 119 129 44 48 94 102 110 119
17 18 73 79 125 136 52 57 106 116 120 131 14 15 62 67 106 115 45 49 109 118
143 154 33 36 61 70 61 75 0 6 -37 48 -83 95 -80 83 -342 359 -447 470 -53 56
-329 346 -476 500 -45 47 -96 101 -114 120 -18 19 -105 111 -194 204 -88 93
-181 190 -206 216 -25 26 -113 119 -196 206 -84 88 -171 179 -194 204 -23 25
-115 122 -204 215 -90 94 -174 182 -187 196 -13 15 -97 102 -185 195 -89 93
-176 185 -194 204 -18 19 -104 109 -190 200 -87 91 -182 190 -210 220 -51 54
-291 307 -380 400 -25 26 -115 121 -200 210 -85 90 -175 185 -200 211 -95 99
-350 367 -419 439 -58 62 -77 76 -105 78 -30 2 -40 -5 -102 -74z"/>
<path d="M4254 4264 c-111 -123 -117 -130 -149 -166 -16 -18 -56 -62 -90 -98
-33 -36 -94 -103 -135 -149 -41 -45 -88 -98 -105 -116 -97 -105 -240 -264
-300 -331 -5 -6 -48 -53 -95 -104 -47 -51 -95 -104 -107 -118 -67 -73 -183
-202 -220 -242 -24 -25 -43 -49 -43 -53 0 -4 15 -23 33 -41 17 -18 124 -128
237 -245 113 -118 234 -244 270 -281 36 -37 157 -163 270 -280 113 -117 239
-247 280 -290 41 -43 119 -123 172 -179 l96 -101 74 81 c91 101 93 103 204
225 51 54 109 119 130 143 22 24 55 60 74 81 19 21 64 70 100 110 86 96 92
102 190 210 107 118 118 129 198 218 37 41 80 88 97 106 16 18 66 73 110 121
44 49 95 105 112 124 18 20 32 39 30 42 -2 6 -239 255 -452 474 -49 51 -144
149 -210 218 -66 68 -208 215 -315 326 -107 112 -236 245 -285 297 -50 52 -93
94 -96 94 -3 0 -37 -34 -75 -76z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.7 KiB

+108
View File
@@ -0,0 +1,108 @@
# dokploy: allow-host-ports — WoW clients connect directly over raw TCP (3724 authentication, 8085 world); Traefik cannot route the game protocol.
services:
azerothcore-database:
image: mysql:8.4.11
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
volumes:
- azerothcore-database:/var/lib/mysql
healthcheck:
test:
[
"CMD-SHELL",
"mysqladmin ping --host=127.0.0.1 --protocol=TCP --user=root --password=$${MYSQL_ROOT_PASSWORD}",
]
interval: 5s
timeout: 10s
retries: 40
start_period: 20s
azerothcore-db-import:
image: acore/ac-wotlk-db-import:17.0.0-dev
restart: "no"
environment:
AC_DATA_DIR: /azerothcore/env/dist/data
AC_LOGS_DIR: /azerothcore/env/dist/logs
AC_LOGIN_DATABASE_INFO: azerothcore-database;3306;root;${MYSQL_ROOT_PASSWORD};acore_auth
AC_WORLD_DATABASE_INFO: azerothcore-database;3306;root;${MYSQL_ROOT_PASSWORD};acore_world
AC_CHARACTER_DATABASE_INFO: azerothcore-database;3306;root;${MYSQL_ROOT_PASSWORD};acore_characters
volumes:
- azerothcore-config:/azerothcore/env/dist/etc
- azerothcore-logs:/azerothcore/env/dist/logs
depends_on:
azerothcore-database:
condition: service_healthy
azerothcore-client-data:
image: acore/ac-wotlk-client-data:17.0.0-dev
restart: "no"
volumes:
- azerothcore-client-data:/azerothcore/env/dist/data
azerothcore-realm-config:
image: mysql:8.4.11
restart: "no"
environment:
MYSQL_PWD: ${MYSQL_ROOT_PASSWORD}
REALM_ADDRESS: ${REALM_ADDRESS}
entrypoint: ["/bin/sh", "-c"]
command:
- >-
mysql --host=azerothcore-database --user=root
--execute="UPDATE acore_auth.realmlist
SET name = 'AzerothCore', address = '$${REALM_ADDRESS}',
localAddress = '127.0.0.1', localSubnetMask = '255.255.255.0', port = 8085
WHERE id = 1;"
depends_on:
azerothcore-database:
condition: service_healthy
azerothcore-db-import:
condition: service_completed_successfully
azerothcore-auth:
image: acore/ac-wotlk-authserver:17.0.0-dev
restart: unless-stopped
tty: true
environment:
AC_LOGS_DIR: /azerothcore/env/dist/logs
AC_TEMP_DIR: /azerothcore/env/dist/temp
AC_LOGIN_DATABASE_INFO: azerothcore-database;3306;root;${MYSQL_ROOT_PASSWORD};acore_auth
ports:
- "3724:3724/tcp"
volumes:
- azerothcore-config:/azerothcore/env/dist/etc
- azerothcore-logs:/azerothcore/env/dist/logs
depends_on:
azerothcore-realm-config:
condition: service_completed_successfully
azerothcore:
image: acore/ac-wotlk-worldserver:17.0.0-dev
restart: unless-stopped
stdin_open: true
tty: true
stop_grace_period: 2m
environment:
AC_DATA_DIR: /azerothcore/env/dist/data
AC_LOGS_DIR: /azerothcore/env/dist/logs
AC_LOGIN_DATABASE_INFO: azerothcore-database;3306;root;${MYSQL_ROOT_PASSWORD};acore_auth
AC_WORLD_DATABASE_INFO: azerothcore-database;3306;root;${MYSQL_ROOT_PASSWORD};acore_world
AC_CHARACTER_DATABASE_INFO: azerothcore-database;3306;root;${MYSQL_ROOT_PASSWORD};acore_characters
ports:
- "8085:8085/tcp"
volumes:
- azerothcore-config:/azerothcore/env/dist/etc
- azerothcore-logs:/azerothcore/env/dist/logs
- azerothcore-client-data:/azerothcore/env/dist/data:ro
depends_on:
azerothcore-realm-config:
condition: service_completed_successfully
azerothcore-client-data:
condition: service_completed_successfully
volumes:
azerothcore-database:
azerothcore-client-data:
azerothcore-config:
azerothcore-logs:
+42
View File
@@ -0,0 +1,42 @@
# AzerothCore setup
## Before deploying
AzerothCore's published server images currently support `amd64` hosts only.
AzerothCore uses raw TCP connections rather than HTTP. Make sure TCP ports `3724` (authentication) and `8085` (world server) are free on the Dokploy host and allowed through its firewall.
The template generates `REALM_ADDRESS` with Dokploy's domain helper. Verify that this hostname resolves publicly to the Dokploy server. If it does not, replace `REALM_ADDRESS` in the service environment with the server's public IP address or another public DNS name, then redeploy.
## First startup
The first deployment downloads the client data and imports the authentication, character, and world databases. This can take several minutes. The `azerothcore-client-data`, `azerothcore-db-import`, and `azerothcore-realm-config` containers are initialization jobs and should exit successfully after completing their work.
## Create the first game account
After the `azerothcore` world server is running, attach to its console from the Dokploy host:
```bash
docker attach <azerothcore-worldserver-container-id>
```
Create an account and grant it administrator permissions:
```text
account create <username> <password>
account set gmlevel <username> 3 -1
```
Detach without stopping the server by pressing `Ctrl-p`, then `Ctrl-q`.
## Connect a 3.3.5a client
Set the client's `Data/<locale>/realmlist.wtf` file to the same hostname or IP stored in `REALM_ADDRESS`:
```text
set realmlist <REALM_ADDRESS>
```
Restart the client, sign in with the account created above, and select the AzerothCore realm. If authentication works but the realm connection fails, confirm that TCP port `8085` is reachable and that `REALM_ADDRESS` points to the Dokploy host.
For updates, backups, configuration, and troubleshooting, see the [AzerothCore Docker documentation](https://www.azerothcore.org/wiki/install-with-docker).
+17
View File
@@ -0,0 +1,17 @@
{
"id": "azerothcore",
"name": "AzerothCore",
"version": "17.0.0-dev",
"description": "A modular open source World of Warcraft: Wrath of the Lich King 3.3.5a game server emulator.",
"logo": "azerothcore.svg",
"links": {
"github": "https://github.com/azerothcore/azerothcore-wotlk",
"website": "https://www.azerothcore.org/",
"docs": "https://www.azerothcore.org/wiki/install-with-docker"
},
"tags": [
"gaming",
"mmorpg",
"server"
]
}
+11
View File
@@ -0,0 +1,11 @@
[variables]
mysql_root_password = "${password:32}"
realm_address = "${domain}"
[config]
domains = []
mounts = []
env = [
"MYSQL_ROOT_PASSWORD=${mysql_root_password}",
"REALM_ADDRESS=${realm_address}",
]
+2 -2
View File
@@ -2,7 +2,7 @@ services:
azuracast:
image: ghcr.io/azuracast/azuracast:latest
restart: unless-stopped
ports:
expose:
- 80
volumes:
- azuracast-station-data:/var/azuracast/stations
@@ -36,4 +36,4 @@ volumes:
azuracast-data: {}
azuracast-uploads: {}
azuracast-backups: {}
mariadb-data: {}
mariadb-data: {}
+1 -2
View File
@@ -4,6 +4,7 @@ mysql_root_password = "${password:32}"
mysql_password = "${password:16}"
[config]
mounts = []
[[config.domains]]
serviceName = "azuracast"
port = 80
@@ -27,5 +28,3 @@ NGINX_RADIO_PORTS = "8000,8010,8020,8030,8040,8050"
PREFER_RELEASE_BUILDS = "true"
COMPOSER_PLUGIN_MODE = "false"
ADDITIONAL_MEDIA_SYNC_WORKER_COUNT = "0"
[[config.mounts]]
+2 -3
View File
@@ -1,9 +1,8 @@
version: "3.8"
services:
babybuddy:
image: linuxserver/babybuddy:2.7.0
restart: unless-stopped
ports:
expose:
- 8000
environment:
- PUID=1000
@@ -16,4 +15,4 @@ services:
- config:/config
volumes:
config: {}
config: {}
+1 -1
View File
@@ -2,7 +2,7 @@ services:
backrest:
image: garethgeorge/backrest:v1.7.3
restart: unless-stopped
ports:
expose:
- 9898
environment:
- BACKREST_PORT=9898
+2 -3
View File
@@ -1,9 +1,8 @@
version: "3.8"
services:
baikal:
image: ckulka/baikal:nginx-php8.2
restart: unless-stopped
ports:
expose:
- 80
environment:
- TZ=UTC
@@ -13,4 +12,4 @@ services:
volumes:
config: {}
data: {}
data: {}
+2 -3
View File
@@ -1,13 +1,12 @@
version: "3.8"
services:
barrage:
image: maulik9898/barrage:0.3.0
restart: unless-stopped
ports:
expose:
- 3000
environment:
- NEXTAUTH_SECRET=${NEXTAUTH_SECRET}
- NEXTAUTH_URL=http://${DOMAIN}
- DELUGE_URL=${DELUGE_URL}
- DELUGE_PASSWORD=${DELUGE_PASSWORD}
- BARRAGE_PASSWORD=${BARRAGE_PASSWORD}
- BARRAGE_PASSWORD=${BARRAGE_PASSWORD}
-1
View File
@@ -1,4 +1,3 @@
version: "3.8"
services:
baserow:
image: baserow/baserow:1.25.2
+2 -3
View File
@@ -1,9 +1,8 @@
version: "3.8"
services:
bazarr:
image: lscr.io/linuxserver/bazarr:1.5.1
restart: unless-stopped
ports:
expose:
- 6767
environment:
- PUID=1000
@@ -15,4 +14,4 @@ services:
- ${TV_PATH}:/tv
volumes:
config: {}
config: {}
+2 -4
View File
@@ -1,8 +1,6 @@
version: "3.8"
services:
bentopdf:
image: bentopdf/bentopdf:latest
image: ghcr.io/alam00000/bentopdf-simple:sha-72d20bb
restart: unless-stopped
expose:
- 80
- 8080
+1 -1
View File
@@ -4,6 +4,6 @@ main_domain = "${domain}"
[config]
[[config.domains]]
serviceName = "bentopdf"
port = 80
port = 8080
host = "${main_domain}"
path = "/"
+2 -3
View File
@@ -1,13 +1,12 @@
version: "3.8"
services:
beszel:
image: henrygd/beszel:0.10.2
restart: unless-stopped
ports:
expose:
- 8090
volumes:
- beszel_data:/beszel_data
- /var/run/docker.sock:/var/run/docker.sock:ro
volumes:
beszel_data: {}
beszel_data: {}
+6 -12
View File
@@ -4,10 +4,8 @@ services:
restart: unless-stopped
depends_on:
- server
ports:
expose:
- '80'
server:
image: bigcapitalhq/server:latest
restart: unless-stopped
@@ -18,9 +16,8 @@ services:
condition: service_started
redis:
condition: service_started
ports:
expose:
- '3000'
environment:
# Mail
- MAIL_HOST=${MAIL_HOST}
@@ -97,9 +94,8 @@ services:
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
volumes:
- mysql:/var/lib/mysql
ports:
expose:
- '3306'
healthcheck:
test: ["CMD-SHELL", "mysqladmin ping -h localhost -u root -p$$MYSQL_ROOT_PASSWORD || exit 1"]
interval: 10s
@@ -110,7 +106,7 @@ services:
mongo:
image: mongo:7
restart: unless-stopped
ports:
expose:
- '27017'
volumes:
- mongo:/data/db
@@ -119,7 +115,7 @@ services:
redis:
image: redis:7-alpine
restart: unless-stopped
ports:
expose:
- '6379'
volumes:
- redis:/data
@@ -133,10 +129,8 @@ services:
gotenberg:
image: gotenberg/gotenberg:7
restart: unless-stopped
ports:
expose:
- '9000'
volumes:
mysql:
name: bigcapital_mysql
+1 -4
View File
@@ -72,7 +72,7 @@ s3_endpoint = ""
s3_bucket = ""
[config]
mounts = []
[[config.domains]]
serviceName = "webapp"
port = 80
@@ -165,6 +165,3 @@ MYSQL_DATABASE = "${system_db_name}"
MYSQL_USER = "${db_user}"
MYSQL_PASSWORD = "${db_password}"
MYSQL_ROOT_PASSWORD = "${db_root_password}"
[[config.mounts]]
+12 -2
View File
@@ -1,5 +1,3 @@
version: "3.8"
services:
billmora-app:
image: ghcr.io/billmora/billmora:latest
@@ -28,6 +26,9 @@ services:
- AUTORUN_LARAVEL_STORAGE_LINK=true
volumes:
- billmora-storage:/var/www/html/storage
- billmora-plugins:/var/www/html/plugin
- billmora-themes-resources:/var/www/html/resources/themes
- billmora-themes-public:/var/www/html/public/themes
depends_on:
billmora-db:
condition: service_healthy
@@ -58,6 +59,9 @@ services:
- AUTORUN_ENABLED=false
volumes:
- billmora-storage:/var/www/html/storage
- billmora-plugins:/var/www/html/plugin
- billmora-themes-resources:/var/www/html/resources/themes
- billmora-themes-public:/var/www/html/public/themes
depends_on:
billmora-db:
condition: service_healthy
@@ -88,6 +92,9 @@ services:
- AUTORUN_ENABLED=false
volumes:
- billmora-storage:/var/www/html/storage
- billmora-plugins:/var/www/html/plugin
- billmora-themes-resources:/var/www/html/resources/themes
- billmora-themes-public:/var/www/html/public/themes
depends_on:
billmora-db:
condition: service_healthy
@@ -126,5 +133,8 @@ services:
volumes:
billmora-storage:
billmora-plugins:
billmora-themes-resources:
billmora-themes-public:
billmora-db-data:
billmora-redis-data:
+1 -3
View File
@@ -1,5 +1,3 @@
version: "3.8"
services:
blender:
image: lscr.io/linuxserver/blender:latest
@@ -19,7 +17,7 @@ services:
- PGID=1000
- TZ=Etc/UTC
- SUBFOLDER=/ #optional
ports:
expose:
- 3000
- 3001
restart: unless-stopped
+1 -2
View File
@@ -16,9 +16,8 @@ services:
options:
max-size: "10m"
max-file: "3"
ports:
expose:
- 1111
blinko-postgres:
image: postgres:14
restart: always
+12
View File
@@ -0,0 +1,12 @@
# BlogFactory on Dokploy
Dokploy creates independent database, storage, JWT, encryption, and scheduler secrets during import. Only the `web` service receives a public domain; the API, scheduler, PostgreSQL, and MinIO remain private.
## First administrator
1. Open the Compose service's environment settings and copy the generated `ADMIN_EMAILS` value.
2. Open the generated BlogFactory domain and register with that exact email address.
3. Return to the Compose environment settings, change `BLOGFACTORY_ALLOW_SIGNUP` to `false`, and redeploy.
4. Add OpenRouter, CMS, or Google Search Console credentials from BlogFactory only when you need those optional integrations.
BlogFactory sends reviewed content to connected CMS providers as drafts. The template does not grant live-publish or delete authority.
+8
View File
@@ -0,0 +1,8 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64">
<rect width="64" height="64" rx="8" fill="#fff"/>
<rect x="1" y="1" width="62" height="62" rx="7" fill="none" stroke="#d7d8d4" stroke-width="2"/>
<circle cx="50" cy="14" r="5" fill="#ff5a1f"/>
<rect x="13" y="31" width="10" height="18" fill="#202224"/>
<rect x="27" y="20" width="10" height="29" fill="#202224"/>
<rect x="41" y="26" width="10" height="23" fill="#202224"/>
</svg>

After

Width:  |  Height:  |  Size: 453 B

+100
View File
@@ -0,0 +1,100 @@
services:
postgres:
image: postgres:17.6-alpine3.22
restart: unless-stopped
environment:
POSTGRES_DB: blogfactory
POSTGRES_USER: blogfactory
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
volumes:
- postgres-data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U blogfactory -d blogfactory"]
interval: 5s
timeout: 5s
retries: 20
minio:
image: minio/minio:RELEASE.2025-09-07T16-13-09Z
restart: unless-stopped
command: server /data --console-address :9001
environment:
MINIO_ROOT_USER: ${MINIO_ROOT_USER}
MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD}
volumes:
- minio-data:/data
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
interval: 5s
timeout: 5s
retries: 20
api:
image: ghcr.io/blogfactoryhq/blogfactory-api:v0.1.0
restart: unless-stopped
command: >-
sh -c "bun run src/init-s3-bucket.ts && bun run src/db/migrate.ts && exec bun run src/index.ts"
depends_on:
postgres:
condition: service_healthy
minio:
condition: service_healthy
expose:
- 3000
environment:
NODE_ENV: production
PORT: 3000
BLOGFACTORY_SELF_HOSTED: "true"
DATABASE_URL: postgresql://blogfactory:${POSTGRES_PASSWORD}@postgres:5432/blogfactory
JWT_SECRET: ${JWT_SECRET}
API_KEY_ENCRYPTION_SECRET: ${API_KEY_ENCRYPTION_SECRET}
ADMIN_EMAILS: ${ADMIN_EMAILS}
BLOGFACTORY_ALLOW_SIGNUP: ${BLOGFACTORY_ALLOW_SIGNUP}
CRON_SECRET: ${CRON_SECRET}
WEB_APP_URL: ${BLOGFACTORY_URL}
MCP_APP_URL: http://web/mcp-review.html
MCP_ALLOWED_ORIGINS: ${BLOGFACTORY_URL}
S3_ENDPOINT: http://minio:9000
S3_ACCESS_KEY_ID: ${MINIO_ROOT_USER}
S3_SECRET_ACCESS_KEY: ${MINIO_ROOT_PASSWORD}
S3_BUCKET: blogfactory
S3_REGION: us-east-1
healthcheck:
test: ["CMD", "bun", "-e", "fetch('http://localhost:3000/api/ready').then(r=>{if(!r.ok)process.exit(1)}).catch(()=>process.exit(1))"]
interval: 10s
timeout: 5s
retries: 20
web:
image: ghcr.io/blogfactoryhq/blogfactory-web:v0.1.0
restart: unless-stopped
depends_on:
api:
condition: service_healthy
expose:
- 80
environment:
API_UPSTREAM: http://api:3000
healthcheck:
test: ["CMD-SHELL", "nginx -t >/dev/null 2>&1 && wget -q -O /dev/null http://api:3000/api/ready"]
interval: 10s
timeout: 5s
retries: 20
scheduler:
image: curlimages/curl:8.15.0
restart: unless-stopped
depends_on:
api:
condition: service_healthy
environment:
CRON_SECRET: ${CRON_SECRET}
CRON_INTERVAL_SECONDS: 21600
entrypoint: ["/bin/sh", "-c"]
command:
- >-
while true; do curl --fail --silent --show-error --output /dev/null -H "Authorization: Bearer $${CRON_SECRET}" http://api:3000/api/cron/drain && echo "Scheduler drain completed"; sleep "$${CRON_INTERVAL_SECONDS}"; done
volumes:
postgres-data:
minio-data:
+13
View File
@@ -0,0 +1,13 @@
{
"id": "blogfactory",
"name": "BlogFactory",
"version": "v0.1.0",
"description": "Self-hosted control plane for AI-assisted content operations and human-approved CMS draft delivery.",
"logo": "blogfactory.svg",
"links": {
"github": "https://github.com/BlogFactoryHQ/blogfactory",
"website": "https://blogfactory.io/",
"docs": "https://github.com/BlogFactoryHQ/blogfactory/blob/main/docs/self-hosting.md"
},
"tags": ["ai", "automation", "content-management"]
}
+28
View File
@@ -0,0 +1,28 @@
[variables]
main_domain = "${domain}"
postgres_password = "${password:48}"
minio_root_user = "blogfactory"
minio_root_password = "${password:48}"
jwt_secret = "${base64:48}"
encryption_secret = "${base64:48}"
cron_secret = "${base64:48}"
admin_email = "${email}"
[config]
env = [
"POSTGRES_PASSWORD=${postgres_password}",
"MINIO_ROOT_USER=${minio_root_user}",
"MINIO_ROOT_PASSWORD=${minio_root_password}",
"JWT_SECRET=${jwt_secret}",
"API_KEY_ENCRYPTION_SECRET=${encryption_secret}",
"CRON_SECRET=${cron_secret}",
"ADMIN_EMAILS=${admin_email}",
"BLOGFACTORY_ALLOW_SIGNUP=true",
"BLOGFACTORY_URL=https://${main_domain}",
]
mounts = []
[[config.domains]]
serviceName = "web"
port = 80
host = "${main_domain}"

Some files were not shown because too many files have changed in this diff Show More