Compare commits

...
Author SHA1 Message Date
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
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 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 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 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 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
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 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 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 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
Yusuf Gündoğdu c1716ad72b libredb-studio: correct the engine count in the description 2026-10-02 17:00:43 +03:00
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
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
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
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
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
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
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
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
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
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 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
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
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
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
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
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
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
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
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
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
Mauricio SiuandGitHub f29a0b7340 Merge pull request #1103 from jmaxdev/canary
feat: add Kotonoba template
2026-08-25 11:46:44 -06: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
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 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
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
+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
392 changed files with 14008 additions and 2561 deletions
+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...."
+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" />
+2 -2
View File
@@ -2,7 +2,7 @@ version: "3.8"
services:
activepieces:
image: activepieces/activepieces:0.35.0
image: activepieces/activepieces:0.91.2
restart: unless-stopped
depends_on:
@@ -32,7 +32,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:
+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": {
+3 -1
View File
@@ -1,3 +1,4 @@
# 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.
version: "3.8"
services:
adguardhome:
@@ -10,7 +11,8 @@ 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
+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]]
+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
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:
File diff suppressed because it is too large Load Diff
+2 -3
View File
@@ -1,7 +1,7 @@
{
"id": "appwrite",
"name": "Appwrite",
"version": "1.9.5",
"version": "2.3.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,8 +12,7 @@
"tags": [
"database",
"firebase",
"mariadb",
"mongodb",
"postgresql",
"hosting",
"self-hosted"
]
+104 -75
View File
@@ -2,25 +2,36 @@
main_domain = "${domain}"
functions_domain = "functions.${main_domain}"
sites_domain = "sites.${main_domain}"
mqtt_domain = "mqtt.${main_domain}"
openssl_key = "${password:32}"
db_root_pw = "${password:32}"
db_user_pw = "${password:32}"
notifications_tracking_secret = "${password:32}"
db_pw = "${password:32}"
usage_pw = "${password:32}"
executor_secret = "${password:32}"
jobs_secret = "${password:32}"
geo_secret = "${password:32}"
[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_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_NOTIFICATIONS_TRACKING_SECRET=${notifications_tracking_secret}",
"_APP_DOMAIN=${main_domain}",
"_APP_CONSOLE_DOMAIN=${main_domain}",
"_APP_CONSOLE_URL=",
"_APP_CONSOLE_TRUSTED_PROJECTS=",
"_APP_CUSTOM_DOMAIN_DENY_LIST=example.com,test.com,app.example.com",
"_APP_DOMAIN_FUNCTIONS=${functions_domain}",
@@ -38,6 +49,15 @@ env = [
"_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 +66,52 @@ 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=disabled",
"_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=disabled",
"_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_STATS_RESOURCES_INTERVAL=3600",
"_APP_MQTT_REPLAY_DEPTH=5",
"_APP_MQTT_MAX_PACKET_SIZE=64000",
"_APP_SMTP_HOST=",
"_APP_SMTP_PORT=",
"_APP_SMTP_SECURE=",
@@ -81,8 +120,10 @@ 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_STORAGE_ANTIVIRUS=disabled",
"_APP_STORAGE_ANTIVIRUS_HOST=clamav",
"_APP_STORAGE_ANTIVIRUS_PORT=3310",
@@ -109,21 +150,26 @@ 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_SCHEDULE_SPREAD=0",
"_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_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",
"_APP_BROWSER_HOST=http://appwrite-browser:3000/v1",
"_APP_WORKER_SCREENSHOTS_ROUTER=http://appwrite",
"_APP_DOCKER_HUB_USERNAME=",
@@ -135,7 +181,6 @@ env = [
"_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_INTERVAL_DOMAIN_VERIFICATION=120",
"_APP_INTERVAL_CLEANUP_STALE_EXECUTIONS=300",
@@ -150,60 +195,50 @@ 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_WEBHOOK_URL=",
"_APP_MIGRATION_HOST=appwrite",
"_APP_MIGRATIONS_FIREBASE_CLIENT_ID=",
"_APP_MIGRATIONS_FIREBASE_CLIENT_SECRET=",
"_APP_ASSISTANT_OPENAI_API_KEY=",
]
[[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 }
]
});
"""
[[config.mounts]]
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
echo "Generating random MongoDB keyfile..."
mkdir -p /data/keyfile
openssl rand -base64 756 > "$KEYFILE_PATH"
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
exec docker-entrypoint.sh mongod --replSet rs0 --bind_ip_all --auth --keyFile "$KEYFILE_PATH"
"""
[[config.domains]]
serviceName = "appwrite-console"
port = 3000
host = "${main_domain}"
path = "/"
[[config.domains]]
serviceName = "appwrite"
port = 80
host = "${main_domain}"
path = "/"
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"
[[config.domains]]
serviceName = "appwrite"
@@ -218,13 +253,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 = "/"
+1 -1
View File
@@ -1,6 +1,6 @@
services:
autobase-console:
image: autobase/console:2.7.2
image: autobase/console:2.11.0
restart: unless-stopped
expose:
- "80"
+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",
+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 -2
View File
@@ -2,7 +2,7 @@ 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 = "/"
+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
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

+102
View File
@@ -0,0 +1,102 @@
version: "3.8"
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}"
+1 -2
View File
@@ -4,6 +4,7 @@ app_password = "${password:32}"
db_root_password = "${password:32}"
[config]
mounts = []
[[config.domains]]
serviceName = "booklore"
port = 6060
@@ -20,5 +21,3 @@ MYSQL_USER = "booklore"
MYSQL_PASSWORD = "${app_password}"
# API Key
MYSQL_ROOT_PASSWORD = "${db_root_password}"
[[config.mounts]]
+1 -15
View File
@@ -2,24 +2,10 @@
main_domain = "${domain}"
[config]
mounts = []
[[config.domains]]
serviceName = "borgitory"
port = 8000
host = "${main_domain}"
[config.env]
[[config.mounts]]
name = "borgitory-data"
mountPath = "/app/data"
description = "Database and encryption key storage"
[[config.mounts]]
name = "borgitory-sources"
mountPath = "/mnt/sources"
description = "Sources to back up (read-only)"
[[config.mounts]]
name = "borgitory-repos"
mountPath = "/mnt/repos"
description = "Borg repositories (read-only)"
+1 -7
View File
@@ -3,18 +3,12 @@ main_domain = "${domain}"
postgres_password = "${password:32}"
[config]
mounts = []
[[config.domains]]
serviceName = "budget-board-client"
port = 6253
host = "${main_domain}"
path = "/"
[config.env]
POSTGRES_PASSWORD = "${postgres_password}"
[[config.mounts]]
source = "../files/db-data"
target = "/var/lib/postgresql/data"
type = "bind"
+16 -1
View File
@@ -1,3 +1,8 @@
# If you are on a machine with ARM architecture, please add a "-arm" suffix to the calcom image on line 19.
# For example, `calcom/cal.com:v6.2.0` will become `calcom/cal.com:v6.2.0-arm`
# If serving the instance on https, change `NEXT_PUBLIC_WEBAPP_URL` (Line 28) and `NEXTAUTH_URL` (Line 30) to https
services:
postgres:
image: postgres:16-alpine
@@ -11,15 +16,25 @@ services:
- DATABASE_URL=postgres://postgres:password@postgres:5432/db
calcom:
image: calcom/cal.com:v2.7.6
image: calcom/cal.com:v6.2.0
depends_on:
- postgres
environment:
- NEXTAUTH_SECRET=${NEXTAUTH_SECRET}
- CALENDSO_ENCRYPTION_KEY=${CALENDSO_ENCRYPTION_KEY}
- DATABASE_URL=postgres://postgres:password@postgres:5432/db
- DATABASE_DIRECT_URL=postgres://postgres:password@postgres:5432/db
- DATABASE_HOST=postgres:5432
- NEXT_PUBLIC_WEBAPP_URL=http://${CALCOM_HOST}
- ALLOWED_HOSTNAMES="${CALCOM_HOST}"
- NEXTAUTH_URL=http://${CALCOM_HOST}/api/auth
- NEXT_PUBLIC_DISABLE_SIGNUP=${DISABLE_SIGNUP}
- EMAIL_SERVER_HOST=${SMTP_SERVER}
- EMAIL_SERVER_PORT=${SMTP_PORT}
- EMAIL_SERVER_USER=${EMAIL_SERVER_USER}
- EMAIL_SERVER_PASSWORD=${SMTP_PASSWORD}
- EMAIL_FROM=${EMAIL_FROM}
volumes:
calcom-data:
+1 -1
View File
@@ -1,7 +1,7 @@
{
"id": "calcom",
"name": "Calcom",
"version": "v2.7.6",
"version": "v6.2.0",
"description": "Calcom is a open source alternative to Calendly that allows to create scheduling and booking services.",
"links": {
"github": "https://github.com/calcom/cal.com",
+6
View File
@@ -8,6 +8,12 @@ env = [
"CALCOM_HOST=${main_domain}",
"NEXTAUTH_SECRET=${nextauth_secret}",
"CALENDSO_ENCRYPTION_KEY=${calcom_encryption_key}",
"DISABLE_SIGNUP=true",
"SMTP_SERVER=",
"SMTP_PORT=",
"SMTP_PASSWORD=",
"EMAIL_SERVER_USER=",
"EMAIL_FROM=",
]
mounts = []
+1 -4
View File
@@ -2,13 +2,10 @@
main_domain = "${domain}"
[config]
mounts = []
[[config.domains]]
serviceName = "checkcle"
port = 8090
host = "${main_domain}"
[config.env]
[[config.mounts]]
source = "checkcle-data"
target = "/mnt/pb_data"
-11
View File
@@ -6,8 +6,6 @@
services:
chibisafe:
image: chibisafe/chibisafe:latest
networks:
- chibinet
environment:
- BASE_API_URL=http://chibisafe_server:8000
restart: unless-stopped
@@ -20,8 +18,6 @@ services:
chibisafe_server:
image: chibisafe/chibisafe-server:latest
networks:
- chibinet
volumes:
- database:/app/database:rw
- uploads:/app/uploads:rw
@@ -43,8 +39,6 @@ services:
caddy:
image: caddy:2-alpine
networks:
- chibinet
volumes:
- ../files/Caddyfile:/etc/caddy/Caddyfile:ro
- uploads:/app/uploads:ro
@@ -62,8 +56,3 @@ volumes:
database:
uploads:
logs:
networks:
chibinet:
driver: bridge
internal: true
+1 -1
View File
@@ -6,7 +6,7 @@
"logo": "logo.png",
"links": {
"github": "https://github.com/chiefonboarding/chiefonboarding",
"website": "https://demo.chiefonboarding.com/",
"website": "https://chiefonboarding.com/",
"docs": "https://docs.chiefonboarding.com/"
},
"tags": [
+1 -5
View File
@@ -11,6 +11,7 @@ hide_history = "false"
language = "en"
[config]
mounts = []
[[config.domains]]
serviceName = "convertx"
port = 3000
@@ -26,8 +27,3 @@ WEBROOT = "${webroot}"
FFMPEG_ARGS = "${ffmpeg_args}"
HIDE_HISTORY = "${hide_history}"
LANGUAGE = "${language}"
[[config.mounts]]
source = "../files/data"
target = "/app/data"
type = "bind"
+1 -1
View File
@@ -5,7 +5,7 @@
"description": "Convex is an open-source reactive database designed to make life easy for web app developers.",
"logo": "convex.svg",
"links": {
"github": "https://github.com/get-convex/convex",
"github": "https://github.com/get-convex/convex-backend",
"website": "https://www.convex.dev/",
"docs": "https://www.convex.dev/docs"
},
+1 -3
View File
@@ -2,6 +2,7 @@
main_domain = "${domain}"
[config]
mounts = []
[[config.domains]]
serviceName = "cookiecloud"
port = 8088
@@ -9,6 +10,3 @@ host = "${main_domain}"
[config.env]
# No environment variables required by default
[[config.mounts]]
# Data volume mount is defined in docker-compose.yml
+6
View File
@@ -0,0 +1,6 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 400" width="400" height="400" stroke-width="18" stroke="#fff" fill="#595ce7">
<path fill-rule="evenodd" d="m200 390c-105.1 0-190-84.9-190-190 0-105.1 84.9-190 190-190 105.1 0 190 84.9 190 190 0 105.1-84.9 190-190 190z"/>
<path fill-rule="evenodd" d="m262.6 368.6c-65.2 0-117.9-75.4-117.9-168.7 0-93.3 52.7-168.7 117.9-168.7 65.1 0 117.8 75.4 117.8 168.7 0 93.3-52.7 168.7-117.8 168.7z"/>
<path fill-rule="evenodd" d="m319.9 330.7c-31.8 0-57.4-58.2-57.4-130.2 0-72 25.6-130.1 57.4-130.1 31.7 0 57.3 58.1 57.3 130.1 0 72-25.6 130.2-57.3 130.2z"/>
<path fill="#fff" fill-rule="evenodd" d="m364.5 267.5c-14.1 0-25.6-29.9-25.6-67 0-37 11.5-67 25.6-67 14.1 0 25.5 30 25.5 67 0 37.1-11.4 67-25.5 67z"/>
</svg>

After

Width:  |  Height:  |  Size: 768 B

+85
View File
@@ -0,0 +1,85 @@
version: "3.8"
services:
corsfix:
image: ghcr.io/corsfix/corsfix-app:8899bb15e71c7238285ccefc4c95a0cd47daeaf0
platform: linux/amd64
restart: unless-stopped
expose:
- "3000"
environment:
MONGODB_URI: mongodb://corsfix:${MONGODB_PASSWORD}@mongodb:27017/db?authSource=admin
REDIS_URI: redis://default:${REDIS_PASSWORD}@redis:6379
KEK_VERSION: KEK_VERSION_1
KEK_VERSION_1: ${KEK_VERSION_1}
AUTH_SECRET: ${AUTH_SECRET}
AUTH_TRUST_HOST: "true"
AUTH_URL: ${AUTH_URL}
PROXY_DOMAIN: ${PROXY_DOMAIN}
DISABLE_SIGNUP: ${DISABLE_SIGNUP:-false}
depends_on:
mongodb:
condition: service_healthy
redis:
condition: service_healthy
corsfix-proxy:
image: ghcr.io/corsfix/corsfix-proxy:8899bb15e71c7238285ccefc4c95a0cd47daeaf0
restart: unless-stopped
expose:
- "80"
environment:
MONGODB_URI: mongodb://corsfix:${MONGODB_PASSWORD}@mongodb:27017/db?authSource=admin
REDIS_URI: redis://default:${REDIS_PASSWORD}@redis:6379
KEK_VERSION_1: ${KEK_VERSION_1}
APP_DOMAIN: ${APP_DOMAIN}
RPM: ${RPM:-180}
ALLOWED_ORIGINS: ${ALLOWED_ORIGINS:-}
ALLOWED_TARGETS: ${ALLOWED_TARGETS:-}
depends_on:
mongodb:
condition: service_healthy
redis:
condition: service_healthy
mongodb:
image: mongo:8.0.17
restart: unless-stopped
environment:
MONGO_INITDB_ROOT_USERNAME: corsfix
MONGO_INITDB_ROOT_PASSWORD: ${MONGODB_PASSWORD}
MONGO_INITDB_DATABASE: db
volumes:
- mongodb-data:/data/db
- mongodb-config:/data/configdb
healthcheck:
test:
- CMD-SHELL
- >-
mongosh --quiet --username "$${MONGO_INITDB_ROOT_USERNAME}"
--password "$${MONGO_INITDB_ROOT_PASSWORD}" --authenticationDatabase admin
--eval 'quit(db.adminCommand({ ping: 1 }).ok ? 0 : 1)'
interval: 10s
timeout: 5s
retries: 10
start_period: 30s
redis:
image: redis:7.4.11-alpine
restart: unless-stopped
command: ["redis-server", "--requirepass", "${REDIS_PASSWORD}", "--appendonly", "yes"]
environment:
REDIS_PASSWORD: ${REDIS_PASSWORD}
volumes:
- redis-data:/data
healthcheck:
test: ["CMD-SHELL", "REDISCLI_AUTH=\"$${REDIS_PASSWORD}\" redis-cli ping | grep -q PONG"]
interval: 10s
timeout: 5s
retries: 10
start_period: 10s
volumes:
mongodb-data:
mongodb-config:
redis-data:
+27
View File
@@ -0,0 +1,27 @@
# Corsfix
This template deploys the Corsfix dashboard and proxy with MongoDB and Redis.
The dashboard image requires an **x86-64 / amd64 server**.
## Before deploying
1. Dokploy imports template domains without a certificate configuration, so `AUTH_URL` defaults to `http://` followed by the generated dashboard hostname. When enabling **HTTPS** and **Let's Encrypt** in the **Domains** tab, also change `AUTH_URL` in **Environment** to `https://` followed by that hostname and redeploy. This URL must match the public dashboard address, even though Dokploy terminates TLS at the edge. Enable HTTPS for **both** domains before using the playground, which uses HTTPS proxy URLs.
2. If using custom domains, point both DNS records to your server, update the domain entries, and set `APP_DOMAIN` and `PROXY_DOMAIN` in **Environment** to the matching hostnames, without `https://` or a trailing slash. Update `AUTH_URL` to the full public dashboard URL, including its `http://` or `https://` scheme.
3. Deploy, then open the dashboard domain (the `corsfix` service on port `3000`) and create your account with an email address and password. Self-hosted signup does not require an email server.
4. Set `DISABLE_SIGNUP=true` in **Environment** and redeploy after creating the accounts you need.
## Using the proxy
The second domain routes to `corsfix-proxy` on port `80`. Use the dashboard to register your application's origin and permitted target domains, manage secrets, and try requests in the playground.
`RPM` sets the self-hosted rate limit (default: `180` requests per minute). Optional `ALLOWED_ORIGINS` and `ALLOWED_TARGETS` accept comma-separated hostnames for environment-based allowlists; leave them empty to manage applications through the dashboard.
## Persistent data and upgrades
MongoDB stores users, applications, and encrypted secrets in named volumes. Redis uses a named volume with append-only persistence. Preserve these volumes and the generated environment values when upgrading.
Keep a backup of `KEK_VERSION_1`: changing or losing this encryption key makes existing saved secrets unreadable. Do not re-import the template to upgrade an existing installation, because imports generate new credentials and keys. Update the image tags in the existing Compose configuration instead. Changing `MONGODB_PASSWORD` alone does not change the password already stored in MongoDB.
The Corsfix images are pinned to the same upstream commit because the project publishes commit tags rather than numbered releases.
See the [Corsfix self-hosting documentation](https://corsfix.com/docs/open-source/self-hosting) for more information.
+13
View File
@@ -0,0 +1,13 @@
{
"id": "corsfix",
"name": "Corsfix",
"version": "8899bb15e71c7238285ccefc4c95a0cd47daeaf0",
"description": "Corsfix is an open source CORS proxy platform for fetching APIs from browser applications, with origin and target allowlists, encrypted API secrets, response caching, and a management dashboard.",
"logo": "corsfix.svg",
"links": {
"github": "https://github.com/corsfix/corsfix",
"website": "https://corsfix.com",
"docs": "https://corsfix.com/docs/open-source/self-hosting"
},
"tags": ["proxy", "developer-tools", "networking"]
}
+33
View File
@@ -0,0 +1,33 @@
[variables]
app_domain = "${domain}"
proxy_domain = "${domain}"
mongodb_password = "${hash:64}"
redis_password = "${hash:64}"
kek_version_1 = "${base64:32}"
auth_secret = "${base64:32}"
[config]
env = [
"APP_DOMAIN=${app_domain}",
"AUTH_URL=http://${app_domain}",
"PROXY_DOMAIN=${proxy_domain}",
"MONGODB_PASSWORD=${mongodb_password}",
"REDIS_PASSWORD=${redis_password}",
"KEK_VERSION_1=${kek_version_1}",
"AUTH_SECRET=${auth_secret}",
"DISABLE_SIGNUP=false",
"RPM=180",
"ALLOWED_ORIGINS=",
"ALLOWED_TARGETS=",
]
mounts = []
[[config.domains]]
serviceName = "corsfix"
port = 3000
host = "${app_domain}"
[[config.domains]]
serviceName = "corsfix-proxy"
port = 80
host = "${proxy_domain}"
+8
View File
@@ -0,0 +1,8 @@
<svg width="1031" height="244" viewBox="0 0 1031 244" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M374.72 225.76C356.8 225.76 341.027 221.653 327.4 213.44C313.773 205.04 303.133 193.093 295.48 177.6C287.827 162.107 284 143.627 284 122.16C284 100.88 287.733 82.4933 295.2 67C302.853 51.32 313.493 39.28 327.12 30.88C340.747 22.2933 356.707 18 375 18C399.64 18 418.773 24.16 432.4 36.48C446.027 48.8 454.893 65.88 459 87.72L427.36 89.4C424.747 75.7733 419.147 65.1333 410.56 57.48C401.973 49.64 390.12 45.72 375 45.72C362.867 45.72 352.32 48.8 343.36 54.96C334.587 61.12 327.68 69.8933 322.64 81.28C317.787 92.6667 315.36 106.293 315.36 122.16C315.36 138.027 317.787 151.653 322.64 163.04C327.68 174.427 334.68 183.107 343.64 189.08C352.6 195.053 362.96 198.04 374.72 198.04C390.773 198.04 403.187 193.84 411.96 185.44C420.92 176.853 426.52 165.093 428.76 150.16L460.4 151.84C457.973 166.96 453.12 180.027 445.84 191.04C438.56 202.053 428.947 210.64 417 216.8C405.053 222.773 390.96 225.76 374.72 225.76Z" fill="white"/>
<path d="M488.982 221.28V72.32H516.142L517.262 111.8L514.742 110.96C516.795 97.52 520.902 87.72 527.062 81.56C533.409 75.4 541.902 72.32 552.542 72.32H566.822V98.92H552.542C545.075 98.92 538.822 100.133 533.782 102.56C528.742 104.987 524.915 108.72 522.302 113.76C519.875 118.8 518.662 125.333 518.662 133.36V221.28H488.982Z" fill="white"/>
<path d="M648.166 224.64C633.606 224.64 621.006 221.467 610.366 215.12C599.913 208.773 591.793 199.72 586.006 187.96C580.406 176.2 577.606 162.48 577.606 146.8C577.606 131.12 580.406 117.493 586.006 105.92C591.793 94.16 599.913 85.1067 610.366 78.76C620.82 72.2267 633.14 68.96 647.326 68.96C660.766 68.96 672.62 72.1333 682.886 78.48C693.153 84.64 701.086 93.6 706.686 105.36C712.473 117.12 715.366 131.307 715.366 147.92V155.48H608.406C609.153 170.04 612.98 180.96 619.886 188.24C626.98 195.52 636.5 199.16 648.446 199.16C657.22 199.16 664.5 197.107 670.286 193C676.073 188.893 680.086 183.387 682.326 176.48L713.126 178.44C709.206 192.253 701.46 203.453 689.886 212.04C678.5 220.44 664.593 224.64 648.166 224.64ZM608.406 133.08H684.006C683.073 119.827 679.246 110.027 672.526 103.68C665.993 97.3333 657.593 94.16 647.326 94.16C636.686 94.16 627.913 97.52 621.006 104.24C614.286 110.773 610.086 120.387 608.406 133.08Z" fill="white"/>
<path d="M805.64 224.64C791.08 224.64 778.48 221.467 767.84 215.12C757.387 208.773 749.267 199.72 743.48 187.96C737.88 176.2 735.08 162.48 735.08 146.8C735.08 131.12 737.88 117.493 743.48 105.92C749.267 94.16 757.387 85.1067 767.84 78.76C778.293 72.2267 790.613 68.96 804.8 68.96C818.24 68.96 830.093 72.1333 840.36 78.48C850.627 84.64 858.56 93.6 864.16 105.36C869.947 117.12 872.84 131.307 872.84 147.92V155.48H765.88C766.627 170.04 770.453 180.96 777.36 188.24C784.453 195.52 793.973 199.16 805.92 199.16C814.693 199.16 821.973 197.107 827.76 193C833.547 188.893 837.56 183.387 839.8 176.48L870.6 178.44C866.68 192.253 858.933 203.453 847.36 212.04C835.973 220.44 822.067 224.64 805.64 224.64ZM765.88 133.08H841.48C840.547 119.827 836.72 110.027 830 103.68C823.467 97.3333 815.067 94.16 804.8 94.16C794.16 94.16 785.387 97.52 778.48 104.24C771.76 110.773 767.56 120.387 765.88 133.08Z" fill="white"/>
<path d="M954.714 224.64C942.02 224.64 930.914 221.467 921.394 215.12C912.06 208.773 904.874 199.813 899.834 188.24C894.98 176.48 892.554 162.667 892.554 146.8C892.554 130.933 895.074 117.213 900.114 105.64C905.154 93.88 912.34 84.8267 921.674 78.48C931.007 72.1333 942.02 68.96 954.714 68.96C964.98 68.96 974.127 71.1067 982.154 75.4C990.18 79.6933 996.247 85.6667 1000.35 93.32V22.48H1030.03V221.28H1002.31L1001.47 198.88C997.367 206.907 991.114 213.253 982.714 217.92C974.5 222.4 965.167 224.64 954.714 224.64ZM962.554 198.88C970.58 198.88 977.394 196.827 982.994 192.72C988.594 188.613 992.887 182.64 995.874 174.8C998.86 166.96 1000.35 157.627 1000.35 146.8C1000.35 135.6 998.86 126.173 995.874 118.52C992.887 110.68 988.594 104.8 982.994 100.88C977.394 96.7733 970.58 94.72 962.554 94.72C950.607 94.72 941.087 99.3867 933.994 108.72C926.9 117.867 923.354 130.56 923.354 146.8C923.354 162.853 926.9 175.547 933.994 184.88C941.087 194.213 950.607 198.88 962.554 198.88Z" fill="white"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M156.683 25.8912C156.683 20.7784 153.949 16.6984 150.153 15.8682L50.8845 0.803281C44.4474 -0.207939 40.8385 -0.418278 34.4022 1.07664C21.948 4.53448 19.4689 5.55156 7.16796 9.52026C1.74137 10.8567 0 14.8659 0 20.1609L0.111367 226.189C0.111367 231.049 3.3005 234.218 7.66406 235.676C14.0626 237.863 21.4027 240.262 28.5807 242.489C33.5011 244.038 38.8467 244.038 45.3161 243.664C52.231 243.259 92.7685 236.617 149.596 229.044C154.101 228.447 156.663 224.772 156.663 221.087L156.713 25.8912H156.683ZM132.658 192.425C134.521 192.222 139.148 190.127 139.148 184.639V59.9491C139.279 57.4788 137.528 52.9533 132.445 52.5382L75.861 44.5097C70.7786 44.2971 68.0552 47.9924 68.0552 51.4043V194.055C68.2678 196.525 70.161 200.362 75.2333 199.542L132.658 192.425Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 4.9 KiB

+65
View File
@@ -0,0 +1,65 @@
version: "3.8"
services:
creed:
build:
context: https://github.com/connorhpbrn/creed.git#e9b096d6d68fef6df336338bc9965a94ab62f75e
dockerfile_inline: |
FROM node:20-alpine AS builder
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci
COPY . .
ARG NEXT_PUBLIC_SITE_URL
ARG NEXT_PUBLIC_SUPABASE_URL
ARG NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY
ARG NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY
ARG NEXT_PUBLIC_CONTACT_EMAIL
ARG NEXT_PUBLIC_GITHUB_URL
ENV NEXT_PUBLIC_SITE_URL=$NEXT_PUBLIC_SITE_URL \
NEXT_PUBLIC_SUPABASE_URL=$NEXT_PUBLIC_SUPABASE_URL \
NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY=$NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY \
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=$NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY \
NEXT_PUBLIC_CONTACT_EMAIL=$NEXT_PUBLIC_CONTACT_EMAIL \
NEXT_PUBLIC_GITHUB_URL=$NEXT_PUBLIC_GITHUB_URL
RUN npm run build
FROM node:20-alpine AS runner
WORKDIR /app
ENV NODE_ENV=production
COPY --from=builder /app/public ./public
COPY --from=builder /app/.next ./.next
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/package.json ./package.json
COPY --from=builder /app/next.config.ts ./next.config.ts
EXPOSE 3000
CMD ["npm", "start"]
args:
NEXT_PUBLIC_SITE_URL: ${NEXT_PUBLIC_SITE_URL}
NEXT_PUBLIC_SUPABASE_URL: ${NEXT_PUBLIC_SUPABASE_URL}
NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY: ${NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY}
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY: ${NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY}
NEXT_PUBLIC_CONTACT_EMAIL: ${NEXT_PUBLIC_CONTACT_EMAIL}
NEXT_PUBLIC_GITHUB_URL: ${NEXT_PUBLIC_GITHUB_URL}
restart: unless-stopped
environment:
- NEXT_PUBLIC_SITE_URL=${NEXT_PUBLIC_SITE_URL}
- NEXT_PUBLIC_SUPABASE_URL=${NEXT_PUBLIC_SUPABASE_URL}
- NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY=${NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY}
- SUPABASE_SECRET_KEY=${SUPABASE_SECRET_KEY}
- CREED_ENCRYPTION_SECRET=${CREED_ENCRYPTION_SECRET}
- STRIPE_SECRET_KEY=${STRIPE_SECRET_KEY}
- NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=${NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY}
- STRIPE_WEBHOOK_SECRET=${STRIPE_WEBHOOK_SECRET}
- OPENROUTER_PLATFORM_KEY=${OPENROUTER_PLATFORM_KEY}
- ANALYSIS_MODEL=${ANALYSIS_MODEL}
- TAB_MODEL=${TAB_MODEL}
- PANEL_MODEL=${PANEL_MODEL}
- RESEND_API_KEY=${RESEND_API_KEY}
- RESEND_FROM_EMAIL=${RESEND_FROM_EMAIL}
- GITHUB_OAUTH_CLIENT_ID=${GITHUB_OAUTH_CLIENT_ID}
- GITHUB_OAUTH_CLIENT_SECRET=${GITHUB_OAUTH_CLIENT_SECRET}
- NEXT_PUBLIC_CONTACT_EMAIL=${NEXT_PUBLIC_CONTACT_EMAIL}
- NEXT_PUBLIC_GITHUB_URL=${NEXT_PUBLIC_GITHUB_URL}
- CREED_CSP_ENFORCE=${CREED_CSP_ENFORCE}
expose:
- 3000
+19
View File
@@ -0,0 +1,19 @@
{
"id": "creed",
"name": "Creed",
"version": "e9b096d",
"description": "One personal context file every AI agent reads before answering and proposes updates to as it learns about you. Requires an external Supabase project (see instructions).",
"logo": "creed.svg",
"links": {
"github": "https://github.com/hpbrn/creed",
"website": "https://creed.md",
"docs": "https://docs.creed.md/"
},
"tags": [
"ai",
"productivity",
"mcp",
"nextjs",
"supabase"
]
}
+105
View File
@@ -0,0 +1,105 @@
[variables]
main_domain = "${domain}"
creed_encryption_secret = "${base64:32}"
[config]
env = [
"NEXT_PUBLIC_SITE_URL=https://${main_domain}",
"NEXT_PUBLIC_SUPABASE_URL=",
"NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY=",
"SUPABASE_SECRET_KEY=",
"CREED_ENCRYPTION_SECRET=${creed_encryption_secret}",
"STRIPE_SECRET_KEY=",
"NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=",
"STRIPE_WEBHOOK_SECRET=",
"OPENROUTER_PLATFORM_KEY=",
"ANALYSIS_MODEL=",
"TAB_MODEL=",
"PANEL_MODEL=",
"RESEND_API_KEY=",
"RESEND_FROM_EMAIL=Creed <hello@example.com>",
"GITHUB_OAUTH_CLIENT_ID=",
"GITHUB_OAUTH_CLIENT_SECRET=",
"NEXT_PUBLIC_CONTACT_EMAIL=",
"NEXT_PUBLIC_GITHUB_URL=https://github.com/connorhpbrn/creed",
"CREED_CSP_ENFORCE=",
]
[[config.domains]]
serviceName = "creed"
port = 3000
host = "${main_domain}"
[[config.mounts]]
filePath = "README.md"
content = """# Creed
Creed (creed.md) is a personal context file: one Markdown file every AI agent
reads before answering and proposes updates to as it learns about you. This
template builds the app from source (https://github.com/connorhpbrn/creed)
and runs it as a stateless Next.js container — Postgres, auth, and storage
live in Supabase, which is **not** part of this template.
## Before you deploy
Creed needs a Supabase project. It is not enough to point it at a plain
Postgres database: the app relies on Supabase Auth, Row Level Security, and
realtime subscriptions, and its schema is applied through the Supabase CLI.
1. Create a Supabase project — either a hosted one at supabase.com, or your
own self-hosted instance (Dokploy has a separate **Supabase** template you
can deploy for this).
2. On a machine with Node 20+, clone the Creed repo and push its schema to
your project:
```bash
git clone https://github.com/connorhpbrn/creed.git
cd creed && npm install
supabase link --project-ref <your-project-ref>
supabase db push
```
3. From Project Settings -> API in your Supabase dashboard, copy the
project URL, the publishable (anon) key, and the secret (service_role)
key.
## Required environment variables
Fill these in on the **Environment** tab before the first deploy, then
redeploy:
- `NEXT_PUBLIC_SUPABASE_URL`: your Supabase project URL.
- `NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY`: the Supabase anon/publishable key.
- `SUPABASE_SECRET_KEY`: the Supabase service_role/secret key. Server-only,
never exposed to the browser.
- `CREED_ENCRYPTION_SECRET` is generated for you (used to encrypt provider
tokens at rest).
- `NEXT_PUBLIC_SITE_URL` is set to this service's domain automatically.
The app boots with only these set, but sign-in, AI features, and billing
stay disabled until their own variables are configured.
## Optional integrations
- **Stripe** (paid plans): `STRIPE_SECRET_KEY`, `NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY`,
`STRIPE_WEBHOOK_SECRET`. Create a webhook endpoint at
`https://<your-domain>/api/stripe/webhook` in the Stripe dashboard for the
signing secret.
- **OpenRouter** (managed AI credits): `OPENROUTER_PLATFORM_KEY` from
https://openrouter.ai/keys. `ANALYSIS_MODEL`, `TAB_MODEL`, `PANEL_MODEL`
override the default model per AI feature and can be left blank.
- **Resend** (Company invite emails): `RESEND_API_KEY` and
`RESEND_FROM_EMAIL` (must be on a domain verified in Resend).
- **GitHub OAuth** (repo sync, not sign-in): create an OAuth App at
https://github.com/settings/developers with callback URL
`https://<your-domain>/auth/github/callback`, then set
`GITHUB_OAUTH_CLIENT_ID` and `GITHUB_OAUTH_CLIENT_SECRET`.
- `CREED_CSP_ENFORCE=1` switches the Content-Security-Policy header from
report-only to enforcing. Leave it unset for at least one deploy cycle so
you can check the browser console for violations first.
## Notes
- This template builds the image from the Creed GitHub repository during
deployment; the first deploy can take a few minutes.
- The app itself is stateless — all data lives in Supabase, so there are no
volumes to back up here.
"""
+2 -2
View File
@@ -6,8 +6,8 @@
"logo": "image.png",
"links": {
"github": "https://github.com/sergi0g/cup",
"website": "https://cup.sh",
"docs": "https://github.com/sergi0g/cup"
"website": "https://cup.sergi0g.dev/",
"docs": "https://cup.sergi0g.dev/docs"
},
"tags": [
"docker",
+1 -7
View File
@@ -2,16 +2,10 @@
main_domain = "${domain}"
[config]
mounts = []
[[config.domains]]
serviceName = "cup"
port = 8000
host = "${main_domain}"
[config.env]
[[config.mounts]]
serviceName = "cup"
source = "/var/run/docker.sock"
target = "/var/run/docker.sock"
type = "bind"
Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

@@ -0,0 +1,27 @@
version: "3.8"
services:
databasement:
image: davidcrty/databasement:1.8.4
restart: unless-stopped
expose:
- 2226
environment:
- APP_KEY=${APP_KEY}
- APP_URL=${APP_URL}
- DB_CONNECTION=sqlite
- DB_DATABASE=/data/database.sqlite
- ENABLE_QUEUE_WORKER=true
- TRUSTED_PROXIES=*
- LOG_CHANNEL=stderr
- APP_DISPLAY_TIMEZONE=${APP_DISPLAY_TIMEZONE}
volumes:
- databasement-data:/data
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:2226/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 60s
volumes:
databasement-data:
+19
View File
@@ -0,0 +1,19 @@
{
"id": "databasement",
"name": "Databasement",
"version": "1.8.4",
"description": "Self-hosted database backup manager with a web UI. Schedule, backup, and restore MySQL, PostgreSQL, MariaDB, Microsoft SQL Server, MongoDB, SQLite, Firebird and Redis to S3, SFTP, Samba or local storage. SSH tunnel support.",
"logo": "databasement.png",
"links": {
"github": "https://github.com/David-Crty/databasement",
"website": "https://david-crty.github.io/databasement/",
"docs": "https://david-crty.github.io/databasement/self-hosting/docker"
},
"tags": [
"backup",
"database",
"mysql",
"postgres",
"mongodb"
]
}
+22
View File
@@ -0,0 +1,22 @@
[variables]
main_domain = "${domain}"
app_key = "${base64:32}"
timezone = "UTC"
[config]
env = [
"APP_KEY=base64:${app_key}",
"APP_URL=https://${main_domain}",
"APP_DISPLAY_TIMEZONE=${timezone}",
"TRUSTED_PROXIES=*",
"LOG_CHANNEL=stderr",
"DB_CONNECTION=sqlite",
"DB_DATABASE=/data/database.sqlite",
"ENABLE_QUEUE_WORKER=true"
]
mounts = []
[[config.domains]]
serviceName = "databasement"
port = 2226
host = "${main_domain}"
+2 -4
View File
@@ -23,7 +23,6 @@ services:
- us
data-api:
container_name: datalens-data-api
image: ghcr.io/datalens-tech/datalens-data-api:0.2192.0
restart: always
environment:
@@ -43,7 +42,6 @@ services:
- pg-compeng
pg-us:
container_name: datalens-pg-us
image: postgres:16-alpine
restart: always
environment:
@@ -75,8 +73,8 @@ services:
datalens:
image: ghcr.io/datalens-tech/datalens-ui:0.2601.0
restart: always
ports:
- ${UI_PORT:-8080}:8080
expose:
- 8080 # web UI — routed through Traefik via the template domain
depends_on:
- us
- control-api
+16
View File
@@ -0,0 +1,16 @@
services:
dexio:
image: ghcr.io/dexio-wiki/dexio:1.0.0
restart: unless-stopped
environment:
- DEXIO_PUBLIC_URL=${DEXIO_PUBLIC_URL}
- DEXIO_SECRET_KEY=${DEXIO_SECRET_KEY}
- DEXIO_DB=/data/dexio.db
- DEXIO_FILES_DIR=/data/files
expose:
- 8080
volumes:
- dexio-data:/data
volumes:
dexio-data:
+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="-769 -852 1567 1567"><!-- Dexio mark: a small graph, hub and four nodes. Built by brand/build.py. --><rect x="-769" y="-852" width="1567" height="1567" rx="345" fill="#000000"/><path d="M79.9 0.0L20.4 -475.2L-20.4 -475.2L-79.9 0.0ZM29.1 74.4L498.1 -173.2L483.3 -211.2L-29.1 -74.4ZM-52.3 60.3L392.4 367.4L419.0 336.6L52.3 -60.3ZM-33.6 -72.5L-462.2 191.8L-445.0 228.8L33.6 72.5Z" fill="#ffffff"/><circle cx="0.0" cy="-475.2" r="87.6" fill="#ffffff"/><circle cx="490.7" cy="-192.2" r="87.6" fill="#ffffff"/><circle cx="405.7" cy="352.0" r="74.5" fill="#ffffff"/><circle cx="-453.6" cy="210.3" r="96.4" fill="#ffffff"/><circle cx="0.0" cy="0.0" r="166.5" fill="#38bdf8"/></svg>

After

Width:  |  Height:  |  Size: 723 B

+20
View File
@@ -0,0 +1,20 @@
{
"id": "dexio",
"name": "Dexio",
"version": "1.0.0",
"description": "One wiki for all your agents. AI agents read and write linked markdown pages over MCP from any machine, and people see what they know in a web app: the link graph, every page and its history.",
"logo": "logo.svg",
"links": {
"github": "https://github.com/dexio-wiki/dexio",
"website": "https://dexio.wiki",
"docs": "https://github.com/dexio-wiki/dexio/blob/main/deploy/README.md"
},
"tags": [
"wiki",
"knowledge-base",
"markdown",
"mcp",
"ai",
"agents"
]
}
+17
View File
@@ -0,0 +1,17 @@
[variables]
main_domain = "${domain}"
secret_key = "${password:64}"
[config]
env = [
"DEXIO_PUBLIC_URL=https://${main_domain}",
"DEXIO_SECRET_KEY=${secret_key}",
]
# Dexio's session cookie is HTTPS-only, so the domain asks for a certificate.
[[config.domains]]
serviceName = "dexio"
port = 8080
host = "${main_domain}"
https = true
certificateType = "letsencrypt"
+77
View File
@@ -0,0 +1,77 @@
# ============================================================================
# Didacta Community — blueprint de Dokploy
# ----------------------------------------------------------------------------
# Formato de `blueprints/<id>/docker-compose.yml` del repositorio
# Dokploy/templates. Reglas de esa casa que este fichero cumple:
# - Sin `ports:` (el proxy de Dokploy entra por la red interna).
# - Sin `container_name:` ni `networks:` (los gestiona Dokploy).
# - `restart: unless-stopped` en todos los servicios.
# - El nombre del servicio principal coincide con el id del blueprint.
#
# Las variables las inyecta Dokploy en un `.env` junto a este fichero a partir
# de `[config.env]` de template.toml — de ahí el `env_file` de cada servicio.
#
# UN SOLO DOMINIO: el contenedor corre API (:4000) y web (:3000) juntos, y
# Next.js reescribe `/api/*`, `/healthz` y `/readyz` al 4000 interno. El
# dominio de template.toml apunta al 3000 y no hace falta nada más.
# ============================================================================
services:
didacta:
image: ghcr.io/va360labs/didacta-community:0.0.1-alpha.107
restart: unless-stopped
env_file:
- .env
expose:
- 3000
volumes:
# Uploads de cursos, certificados y evidencias + la clave de cifrado
# autogenerada. Es el volumen que hay que respaldar.
- didacta-data:/app/data
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_healthy
healthcheck:
test: ['CMD', 'curl', '-fsS', 'http://127.0.0.1:4000/healthz']
interval: 10s
timeout: 5s
retries: 30
# El primer arranque aplica migraciones, RLS y grants antes de servir.
start_period: 120s
postgres:
# pgvector NO es opcional: la migración baseline hace
# `CREATE EXTENSION "vector"` y falla contra un postgres:16 estándar.
image: pgvector/pgvector:pg16
restart: unless-stopped
env_file:
- .env
volumes:
- didacta-postgres-data:/var/lib/postgresql/data
healthcheck:
test: ['CMD-SHELL', 'pg_isready -U "$$POSTGRES_USER" -d "$$POSTGRES_DB"']
interval: 5s
timeout: 5s
retries: 20
redis:
image: redis:7-alpine
restart: unless-stopped
command: redis-server --appendonly yes
volumes:
- didacta-redis-data:/data
healthcheck:
test: ['CMD', 'redis-cli', 'ping']
interval: 5s
timeout: 3s
retries: 10
volumes:
didacta-data:
driver: local
didacta-postgres-data:
driver: local
didacta-redis-data:
driver: local
File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 32 KiB

+13
View File
@@ -0,0 +1,13 @@
{
"id": "didacta",
"name": "Didacta",
"version": "0.0.1-alpha.107",
"description": "Didacta is a fair-code, self-hosted learning platform (LMS) with multi-tenant isolation, a public course catalog, enrollment flows, gamification and a module marketplace.",
"logo": "logo.svg",
"links": {
"github": "https://github.com/va360labs/didacta-io",
"website": "https://didacta.io",
"docs": "https://docs.didacta.io"
},
"tags": ["education", "lms", "elearning", "courses"]
}
+79
View File
@@ -0,0 +1,79 @@
# ============================================================================
# Didacta Community — configuración del blueprint de Dokploy
# ----------------------------------------------------------------------------
# Dokploy resuelve los helpers de [variables], escribe [config.env] en un .env
# junto al docker-compose.yml y publica el dominio de [[config.domains]].
#
# Helpers disponibles: ${domain}, ${password:N}, ${base64:N}, ${hash:N},
# ${uuid}, ${randomPort}, ${email}, ${username}, ${timestamp}.
# ============================================================================
[variables]
main_domain = "${domain}"
# 64 caracteres sin símbolos: firma las sesiones. Rotarlo echa a todo el mundo.
auth_secret = "${password:64}"
# Token de un solo uso del alta inicial. Va en una URL, así que sin símbolos.
setup_token = "${password:32}"
# Va dentro de la cadena de conexión de Postgres: sin símbolos a propósito.
postgres_password = "${password:32}"
[[config.domains]]
serviceName = "didacta"
port = 3000
host = "${main_domain}"
[config.env]
NODE_ENV = "production"
# Debe coincidir SIEMPRE con el tag de la imagen del docker-compose.yml.
DIDACTA_CORE_VERSION = "0.0.1-alpha.107"
# Base absoluta de los enlaces que salen por correo (verificación de email,
# invitaciones, recordatorios). Sin esto los correos llevan enlaces rotos.
WEB_PUBLIC_URL = "https://${main_domain}"
WEB_PUBLIC_ALLOWED_HOSTS = "${main_domain}"
# Credenciales del Postgres del propio blueprint. El servicio `postgres` las
# lee del mismo .env para inicializar el cluster.
POSTGRES_USER = "didacta"
POSTGRES_PASSWORD = "${postgres_password}"
POSTGRES_DB = "didacta"
# Conexión de BOOTSTRAP (superusuario). Se usa solo para migraciones, RLS y
# grants — nunca para servir tráfico. El entrypoint deriva de aquí la conexión
# de runtime hacia el rol `didacta_app` (NOBYPASSRLS), que es lo que hace real
# el aislamiento entre tenants. Por eso NO se define DATABASE_URL.
ADMIN_DATABASE_URL = "postgresql://didacta:${postgres_password}@postgres:5432/didacta?schema=public"
REDIS_URL = "redis://redis:6379"
AUTH_SECRET = "${auth_secret}"
# Fijarlo evita tener que buscar el token en los logs: el alta se hace en
# https://<dominio>/setup?token=<este valor>.
DIDACTA_SETUP_TOKEN = "${setup_token}"
# Puertos INTERNOS fijos. No tocar: el dominio apunta al 3000 y el healthcheck
# al 4000.
API_PORT = "4000"
WEB_PORT = "3000"
# Almacenamiento local sobre el volumen persistente `didacta-data`. Para S3
# (AWS, Hetzner, MinIO…): STORAGE_DRIVER=s3 y rellenar las S3_*.
STORAGE_DRIVER = "local"
STORAGE_ROOT = "/app/data/storage"
# SMTP: sin esto la instalación arranca igual, avisa por la interfaz y no puede
# mandar correos. Rellenar desde el panel de Dokploy después del despliegue.
SMTP_HOST = ""
SMTP_PORT = "587"
SMTP_USER = ""
SMTP_PASS = ""
SMTP_SECURE = "false"
SMTP_FROM = ""
# Licencia Enterprise (opcional). Vacío = edición Community.
DIDACTA_LICENSE_KEY = ""
# TENANT_SETTINGS_ENC_KEY se deja SIN definir a propósito: la app genera una
# clave hex de 32 bytes en el primer arranque y la persiste en el volumen
# `didacta-data`. Definirla con un helper que no produzca exactamente 64
# caracteres hexadecimales rompería el cifrado de secretos (SSO, SMTP por
# tenant, Stripe) de forma silenciosa.
+1 -2
View File
@@ -2,6 +2,7 @@
app_domain = "${domain}"
[config]
mounts = []
[[config.domains]]
serviceName = "directory-lister" # Must match the service name in docker-compose.yml
port = 80
@@ -15,5 +16,3 @@ READMES_FIRST = "false"
ZIP_DOWNLOADS = "true"
TIMEZONE = "UTC"
[[config.mounts]]
+16
View File
@@ -0,0 +1,16 @@
version: "3.8"
services:
dockroute:
image: ghcr.io/dockroute/dockroute:0.2.0
restart: unless-stopped
environment:
- DOCKROUTE_PROVIDER=${DOCKROUTE_PROVIDER}
- DOCKROUTE_OWNER_ID=${DOCKROUTE_OWNER_ID}
- DOCKROUTE_POLICY=${DOCKROUTE_POLICY}
- DOCKROUTE_DEFAULT_TARGET=${DOCKROUTE_DEFAULT_TARGET}
- DOCKROUTE_DOMAIN_FILTER=${DOCKROUTE_DOMAIN_FILTER}
- CLOUDFLARE_API_TOKEN=${CLOUDFLARE_API_TOKEN}
- CLOUDFLARE_ACCOUNT_ID=${CLOUDFLARE_ACCOUNT_ID}
- CLOUDFLARE_TUNNEL_ID=${CLOUDFLARE_TUNNEL_ID}
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
Binary file not shown.

After

Width:  |  Height:  |  Size: 691 KiB

+17
View File
@@ -0,0 +1,17 @@
{
"id": "dockroute",
"name": "DockRoute",
"version": "0.2.0",
"description": "External-DNS for plain Docker hosts: watches container labels and reconciles DNS records and Cloudflare Tunnel routes, never touching records it cannot prove it manages.",
"logo": "dockroute.png",
"links": {
"github": "https://github.com/Dockroute/Dockroute",
"website": "https://www.dockroute.dev",
"docs": "https://www.dockroute.dev"
},
"tags": [
"dns",
"networking",
"automation"
]
}
+15
View File
@@ -0,0 +1,15 @@
variables = {}
[config]
domains = []
mounts = []
[config.env]
DOCKROUTE_PROVIDER = "log"
DOCKROUTE_OWNER_ID = "default"
DOCKROUTE_POLICY = "sync"
DOCKROUTE_DEFAULT_TARGET = ""
DOCKROUTE_DOMAIN_FILTER = ""
CLOUDFLARE_API_TOKEN = ""
CLOUDFLARE_ACCOUNT_ID = ""
CLOUDFLARE_TUNNEL_ID = ""
+2 -2
View File
@@ -6,8 +6,8 @@
"logo": "docling-serve.png",
"links": {
"github": "https://github.com/docling-project/docling-serve",
"website": "https://docling-project.github.io/docling-serve/",
"docs": "https://docling-project.github.io/docling-serve/",
"website": "",
"docs": "https://github.com/docling-project/docling-serve/blob/main/docs/README.md",
"dockerhub": "https://quay.io/repository/docling-project/docling-serve"
},
"tags": [
+1 -2
View File
@@ -2,6 +2,7 @@
main_domain = "${domain}"
[config]
mounts = []
[[config.domains]]
serviceName = "docling-serve"
port = 5001
@@ -11,5 +12,3 @@ host = "${main_domain}"
DOCLING_SERVE_ENABLE_UI = "1"
DOCLING_SERVE_HOST = "0.0.0.0"
DOCLING_SERVE_PORT = "5001"
[[config.mounts]]
+1 -5
View File
@@ -3,6 +3,7 @@ main_domain = "${domain}"
pg_password = "${password:32}"
[config]
mounts = []
[[config.domains]]
serviceName = "app"
port = 3000
@@ -26,8 +27,3 @@ DL_PG_NAME = "domain_locker"
# DL_DOMAIN_INFO_API = ""
# DL_DOMAIN_SUBS_API = ""
# DL_DISABLE_WRITE_METHODS = "false"
[[config.mounts]]
# Example mount for PostgreSQL persistence (already defined in compose volumes)
# filePath = "/var/lib/postgresql/data"
# content = ""
+1 -1
View File
@@ -6,7 +6,7 @@
"logo": "doublezero.svg",
"links": {
"github": "https://github.com/technomancy-dev/00",
"website": "https://www.double-zero.cloud/",
"website": "",
"docs": "https://github.com/technomancy-dev/00"
},
"tags": [
+1 -1
View File
@@ -7,7 +7,7 @@
"links": {
"github": "https://github.com/amir20/dozzle",
"website": "https://dozzle.dev",
"docs": "https://dozzle.dev/docs"
"docs": "https://dozzle.dev/guide/what-is-dozzle"
},
"tags": [
"monitoring",
+1 -5
View File
@@ -3,6 +3,7 @@ main_domain = "${domain}"
docker_socket = "/var/run/docker.sock"
[config]
mounts = []
[[config.domains]]
serviceName = "dozzle"
port = 8080
@@ -11,8 +12,3 @@ host = "${main_domain}"
[config.env]
DOZZLE_USERNAME = "${username}"
DOZZLE_PASSWORD = "${password:16}"
[[config.mounts]]
source = "${docker_socket}"
target = "/var/run/docker.sock"
read_only = true
+2 -2
View File
@@ -4,8 +4,8 @@ services:
image: 'docker.dragonflydb.io/dragonflydb/dragonfly'
ulimits:
memlock: -1
ports:
- "6379:6379"
expose:
- 6379
volumes:
- dragonflydata:/data
environment:
+2 -2
View File
@@ -6,8 +6,8 @@
"logo": "drawio.svg",
"links": {
"github": "https://github.com/jgraph/drawio",
"website": "https://draw.io/",
"docs": "https://www.drawio.com/doc/"
"website": "https://www.drawio.com/",
"docs": "https://www.drawio.com/docs/"
},
"tags": [
"drawing",
+4 -3
View File
@@ -5,9 +5,10 @@
"description": "Drawnix is an application for generating and managing visual content, powered by pubuzhixing/drawnix Docker image.",
"logo": "image.png",
"links": {
"github": "https://github.com/pubuzhixing/drawnix",
"website": "https://hub.docker.com/r/pubuzhixing/drawnix",
"docs": "https://hub.docker.com/r/pubuzhixing/drawnix"
"github": "https://github.com/plait-board/drawnix/",
"website": "https://drawnix.com/",
"docs": "https://github.com/plait-board/drawnix/blob/develop/README_en.md#docker",
"dockerhub": "https://hub.docker.com/r/pubuzhixing/drawnix"
},
"tags": [
"visualization",
@@ -8,12 +8,6 @@ services:
MASTERPASS: ${MASTERPASS}
volumes:
- drizzle-gateway:/app
networks:
- dokploy-network
volumes:
drizzle-gateway:
networks:
dokploy-network:
external: true
+3 -3
View File
@@ -5,9 +5,9 @@
"description": "Drizzle Gateway is a self-hosted database gateway that allows you to connect to your databases from anywhere.",
"logo": "drizzle-gateway.svg",
"links": {
"github": "https://github.com/drizzle-team/drizzle-gateway",
"website": "https://drizzle-team.github.io/",
"docs": "https://drizzle-team.github.io/docs"
"github": "",
"website": "https://gateway.drizzle.team/",
"docs": "https://gateway.drizzle.team/docs/railway"
},
"tags": [
"database",
+1 -1
View File
@@ -6,7 +6,7 @@
"logo": "logo.svg",
"links": {
"github": "https://github.com/dumbwareio/dumbassets",
"website": "https://www.dumbware.io/software/DumbAssets/",
"website": "https://dumbware.io/DumbAssets/",
"docs": "https://github.com/dumbwareio/dumbassets"
},
"tags": [
+1 -6
View File
@@ -3,6 +3,7 @@ main_domain = "${domain}"
default_pin = "${password:4}"
[config]
mounts = []
[[config.domains]]
serviceName = "dumbassets"
port = 3000
@@ -19,9 +20,3 @@ DEMO_MODE = "false"
APPRISE_URL = ""
CURRENCY_CODE = "USD"
CURRENCY_LOCALE = "en-US"
[[config.mounts]]
serviceName = "dumbassets"
type = "volume"
source = "dumbassets-data"
target = "/app/data"
+3 -3
View File
@@ -5,9 +5,9 @@
"description": "DumbBudget is a simple, self-hosted budget tracking service with PIN protection and no database required.",
"logo": "logo.svg",
"links": {
"github": "https://github.com/dumbwareio/dumbbudget",
"website": "https://www.dumbware.io/software/DumbBudget/",
"docs": "https://github.com/dumbwareio/dumbbudget"
"github": "https://github.com/DumbWareio/DumbBudget",
"website": "https://dumbware.io/DumbBudget",
"docs": "https://github.com/DumbWareio/DumbBudget/blob/main/README.md"
},
"tags": [
"budget",
+2 -2
View File
@@ -4,6 +4,7 @@ main_domain = "${domain}"
dumbbudget_pin = "${password:16}"
[config]
mounts = []
[[config.domains]]
serviceName = "dumbbudget"
port = 3000
@@ -20,5 +21,4 @@ ALLOWED_ORIGINS = "${main_domain}"
# The named volume 'dumbbudget-data' is defined in the docker-compose.yml.
# According to Dokploy's template examples, volumes declared in the compose
# file are automatically managed and do not require a separate entry here.
[[config.mounts]]
# file are automatically managed and do not require a separate entry here.
+1 -1
View File
@@ -6,7 +6,7 @@
"logo": "logo.svg",
"links": {
"github": "https://github.com/dumbwareio/dumbdrop",
"website": "https://www.dumbware.io/software/DumbDrop/",
"website": "https://dumbware.io/DumbDrop/",
"docs": "https://github.com/dumbwareio/dumbdrop"
},
"tags": [
+1 -2
View File
@@ -2,6 +2,7 @@
main_domain = "https://${domain}"
[config]
mounts = []
[[config.domains]]
serviceName = "dumbdrop"
port = 3000
@@ -20,5 +21,3 @@ APPRISE_URL = ""
APPRISE_MESSAGE = "New file uploaded {filename} ({size}), Storage used {storage}"
APPRISE_SIZE_UNIT = "Auto"
ALLOWED_EXTENSIONS = ""
[[config.mounts]]
+1 -1
View File
@@ -6,7 +6,7 @@
"logo": "logo.svg",
"links": {
"github": "https://github.com/dumbwareio/dumbpad",
"website": "https://www.dumbware.io/software/DumbPad/",
"website": "https://dumbware.io/DumbPad/",
"docs": "https://github.com/dumbwareio/dumbpad"
},
"tags": [
+1 -2
View File
@@ -2,6 +2,7 @@
main_domain = "${domain}"
[config]
mounts = []
[[config.domains]]
serviceName = "dumbpad"
port = 3000
@@ -17,5 +18,3 @@ LOCKOUT_TIME = "15"
MAX_ATTEMPTS = "5"
COOKIE_MAX_AGE = "24"
PAGE_HISTORY_COOKIE_AGE = "365"
[[config.mounts]]
@@ -3,7 +3,6 @@ version: '3.8'
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.10.2
container_name: elasticsearch
environment:
- discovery.type=single-node
- xpack.security.enabled=false
@@ -20,7 +19,6 @@ services:
kibana:
image: docker.elastic.co/kibana/kibana:8.10.2
container_name: kibana
environment:
- ELASTICSEARCH_HOSTS=http://elasticsearch:9200
expose:
+1 -1
View File
@@ -7,7 +7,7 @@
"links": {
"github": "https://github.com/elastic/elasticsearch",
"website": "https://www.elastic.co/elasticsearch/",
"docs": "https://docs.elastic.co/elasticsearch/"
"docs": "https://www.elastic.co/docs/solutions/search"
},
"tags": [
"search",
-8
View File
@@ -21,10 +21,6 @@ services:
volumes:
- emqx_data:/opt/emqx/data
- emqx_log:/opt/emqx/log
networks:
dokploy-network:
aliases:
- emqx-service
restart: unless-stopped
healthcheck:
test: ["CMD", "/opt/emqx/bin/emqx_ctl", "status"]
@@ -52,7 +48,3 @@ services:
volumes:
emqx_data:
emqx_log:
networks:
dokploy-network:
external: true
+1 -1
View File
@@ -1,7 +1,7 @@
# dokploy: allow-host-ports — Enshrouded game clients connect over raw UDP (15637 game, 27015 Steam query); Traefik cannot route UDP game traffic.
services:
enshrouded:
image: mornedhels/enshrouded-server:latest
container_name: enshrouded
hostname: enshrouded
restart: unless-stopped
stop_grace_period: 90s
-31
View File
@@ -10,8 +10,6 @@ services:
<<: *custom_image
volumes:
- sites:/home/frappe/frappe-bench/sites
networks:
- bench-network
healthcheck:
test:
- CMD
@@ -42,8 +40,6 @@ services:
volumes:
- sites:/home/frappe/frappe-bench/sites
networks:
- bench-network
healthcheck:
test:
@@ -63,8 +59,6 @@ services:
- default
volumes:
- sites:/home/frappe/frappe-bench/sites
networks:
- bench-network
healthcheck:
test:
- CMD
@@ -87,8 +81,6 @@ services:
- long
volumes:
- sites:/home/frappe/frappe-bench/sites
networks:
- bench-network
healthcheck:
test:
- CMD
@@ -111,8 +103,6 @@ services:
- short
volumes:
- sites:/home/frappe/frappe-bench/sites
networks:
- bench-network
healthcheck:
test:
- CMD
@@ -145,8 +135,6 @@ services:
required: true
volumes:
- sites:/home/frappe/frappe-bench/sites
networks:
- bench-network
websocket:
<<: *custom_image
@@ -167,8 +155,6 @@ services:
required: true
volumes:
- sites:/home/frappe/frappe-bench/sites
networks:
- bench-network
configurator:
<<: *custom_image
@@ -197,8 +183,6 @@ services:
REGENERATE_APPS_TXT: "${REGENERATE_APPS_TXT:-0}"
volumes:
- sites:/home/frappe/frappe-bench/sites
networks:
- bench-network
create-site:
<<: *custom_image
@@ -237,8 +221,6 @@ services:
DB_PORT: "${DB_PORT:-3306}"
DB_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
INSTALL_APP_ARGS: ${INSTALL_APP_ARGS}
networks:
- bench-network
migration:
<<: *custom_image
@@ -258,8 +240,6 @@ services:
bench --site all set-config -p pause_scheduler 0;
volumes:
- sites:/home/frappe/frappe-bench/sites
networks:
- bench-network
db:
image: mariadb:10.6
@@ -282,8 +262,6 @@ services:
- MARIADB_ROOT_PASSWORD=${DB_ROOT_PASSWORD}
volumes:
- db-data:/var/lib/mysql
networks:
- bench-network
redis-cache:
deploy:
@@ -292,8 +270,6 @@ services:
image: redis:6.2-alpine
volumes:
- redis-cache-data:/data
networks:
- bench-network
healthcheck:
test:
- CMD
@@ -310,8 +286,6 @@ services:
image: redis:6.2-alpine
volumes:
- redis-queue-data:/data
networks:
- bench-network
healthcheck:
test:
- CMD
@@ -328,8 +302,6 @@ services:
image: redis:6.2-alpine
volumes:
- redis-socketio-data:/data
networks:
- bench-network
healthcheck:
test:
- CMD
@@ -349,6 +321,3 @@ volumes:
type: "${SITE_VOLUME_TYPE}"
o: "${SITE_VOLUME_OPTS}"
device: "${SITE_VOLUME_DEV}"
networks:
bench-network:
+253
View File
@@ -0,0 +1,253 @@
# Ethora Core as a Dokploy template. GENERATED FILE: edit the bundle's
# deploy/compose/docker-compose.yml and run build-template.sh.
#
# Same services and start order as the bundle (config -> databases -> xmpp ->
# api, jobs -> init -> frontend), without the bundled Caddy: Dokploy's Traefik
# routes the four public hosts declared in template.toml. The scripts and
# templates are the template's mounts, which Dokploy writes under ../files/.
# Every variable comes from the .env Dokploy writes next to this file
# (template.toml, [config] env). See README.md in this directory.
x-logging: &logging
logging:
driver: json-file
options:
max-size: "20m"
max-file: "5"
x-api: &api
image: ${ETHORA_API_IMAGE:-docker.io/dappros/ethora-api:2610}
entrypoint: ["tini", "--", "bash", "/ethora/scripts/api-entrypoint.sh"]
volumes:
- config:/ethora/config:ro
- ../files/scripts:/ethora/scripts:ro
<<: *logging
services:
# ---------------------------------------------------------------- config --
config:
image: ${ETHORA_XMPP_IMAGE:-docker.io/dappros/ethora-xmpp:2610}
user: "0:0"
entrypoint: ["/bin/sh", "/ethora/scripts/render-config.sh"]
# Every value in .env reaches the renderer, so any variable of the
# installer's templates (POSTMARK_*, EMAIL_TLD_*, RATE_LIMIT_*, ...) can
# be set there. The hosts are derived here once, for caddy and xmpp too.
env_file:
- path: .env
required: false
environment:
ROOT_DOMAIN: ${ROOT_DOMAIN:?ROOT_DOMAIN is not set; run ./configure.sh or fill in .env}
API_DOMAIN: ${API_DOMAIN:-api.${ROOT_DOMAIN}}
WEB_DOMAIN: ${WEB_DOMAIN:-app.${ROOT_DOMAIN}}
XMPP_DOMAIN: ${XMPP_DOMAIN:-xmpp.${ROOT_DOMAIN}}
FILES_DOMAIN: ${FILES_DOMAIN:-files.${ROOT_DOMAIN}}
volumes:
- config:/out/config
- mysql-initdb:/out/mysql-initdb
- ../files/scripts:/ethora/scripts:ro
- ../files/templates:/ethora/templates:ro
restart: "no"
<<: *logging
# ------------------------------------------------------------- databases --
mongo:
image: mongo:6.0.8
command: ["mongod", "--replSet", "rs0", "--bind_ip_all"]
volumes:
- mongo:/data/db
- mongo-config:/data/configdb
restart: unless-stopped
healthcheck:
# A TCP connect, not mongosh: see docker-compose.enterprise.yml.
test: ["CMD", "bash", "-c", "exec 3<>/dev/tcp/127.0.0.1/27017"]
interval: 10s
timeout: 5s
retries: 30
<<: *logging
mongo-init:
image: mongo:6.0.8
entrypoint: ["bash", "/ethora/scripts/mongo-init.sh"]
volumes:
- ../files/scripts:/ethora/scripts:ro
depends_on:
mongo:
condition: service_healthy
restart: "no"
<<: *logging
mysql:
image: mysql:8.1.0
command: ["--default-authentication-plugin=mysql_native_password"]
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:?MYSQL_ROOT_PASSWORD is not set}
# ejabberd connects as root from its own container (as on a host install).
MYSQL_ROOT_HOST: "%"
volumes:
- mysql:/var/lib/mysql
- mysql-initdb:/docker-entrypoint-initdb.d:ro
depends_on:
config:
condition: service_completed_successfully
restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "mysqladmin ping -h 127.0.0.1 -uroot -p\"$$MYSQL_ROOT_PASSWORD\" --silent"]
interval: 10s
timeout: 5s
retries: 30
start_period: 30s
<<: *logging
redis:
image: redis:7.4-alpine
volumes:
- redis:/data
restart: unless-stopped
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 10s
timeout: 5s
retries: 10
<<: *logging
minio:
# Our unmodified copy of the MinIO release every install runs (AGPL-3.0);
# MinIO withdrew its public images. Set MINIO_IMAGE for a private mirror.
image: ${MINIO_IMAGE:-docker.io/dappros/minio:RELEASE.2025-09-07T16-13-09Z}
command: ["server", "/data"]
environment:
MINIO_ROOT_USER: ${MINIO_ROOT_USER:?MINIO_ROOT_USER is not set}
MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD:?MINIO_ROOT_PASSWORD is not set}
volumes:
- minio:/data
restart: unless-stopped
healthcheck:
test: ["CMD", "curl", "-fsS", "http://127.0.0.1:9000/minio/health/live"]
interval: 15s
timeout: 5s
retries: 10
<<: *logging
centrifugo:
image: centrifugo/centrifugo:v6
command: ["centrifugo", "-c", "/ethora/config/centrifugo/config.json"]
volumes:
- config:/ethora/config:ro
depends_on:
config:
condition: service_completed_successfully
ulimits:
nofile:
soft: 65535
hard: 65535
restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "wget -q -O /dev/null http://127.0.0.1:8000/health || exit 1"]
interval: 30s
timeout: 5s
retries: 3
start_period: 10s
<<: *logging
# ------------------------------------------------------------------ xmpp --
xmpp:
image: ${ETHORA_XMPP_IMAGE:-docker.io/dappros/ethora-xmpp:2610}
entrypoint: ["/bin/sh", "/ethora/scripts/xmpp-start.sh"]
environment:
XMPP_DOMAIN: ${XMPP_DOMAIN:-xmpp.${ROOT_DOMAIN}}
XMPP_ADMIN_PASSWORD: ${XMPP_ADMIN_PASSWORD:?XMPP_ADMIN_PASSWORD is not set}
volumes:
- config:/ethora/config:ro
- ../files/scripts:/ethora/scripts:ro
# Native XMPP clients (port 5222) are not exposed by default; web and SDK
# clients connect over wss://xmpp.<root>/ws through caddy. See README.md.
depends_on:
config:
condition: service_completed_successfully
mysql:
condition: service_healthy
restart: unless-stopped
healthcheck:
# Healthy once ejabberd runs AND the admin account is ensured, which is
# what the API and init need.
test: ["CMD-SHELL", "test -f /tmp/ethora-admin-ready && /opt/ejabberd/bin/ejabberdctl status >/dev/null"]
interval: 10s
timeout: 10s
retries: 30
start_period: 30s
<<: *logging
# ------------------------------------------------------------------- api --
api:
<<: *api
command: ["api"]
depends_on:
config:
condition: service_completed_successfully
mongo-init:
condition: service_completed_successfully
redis:
condition: service_healthy
minio:
condition: service_healthy
xmpp:
condition: service_started
restart: unless-stopped
# Healthcheck: the image's own (GET /v1/ping).
jobs:
<<: *api
command: ["jobs"]
depends_on:
api:
condition: service_healthy
restart: unless-stopped
healthcheck:
disable: true
init:
<<: *api
command: ["init"]
depends_on:
api:
condition: service_healthy
xmpp:
condition: service_healthy
restart: "no"
healthcheck:
disable: true
# End-to-end check through the public URLs (scripts/verify.js):
# docker compose --profile verify run --rm verify
verify:
<<: *api
profiles: ["verify"]
command: ["verify"]
restart: "no"
healthcheck:
disable: true
# -------------------------------------------------------------- frontend --
frontend:
image: ${ETHORA_FRONTEND_IMAGE:-docker.io/dappros/ethora-frontend:2610}
entrypoint: ["/bin/sh", "/ethora/scripts/frontend-start.sh"]
command: ["serve"]
volumes:
- config:/ethora/config:ro
- ../files/scripts:/ethora/scripts:ro
depends_on:
config:
condition: service_completed_successfully
restart: unless-stopped
<<: *logging
volumes:
# Your data. Survive `docker compose down`; `down -v` deletes them.
mongo:
mysql:
minio:
redis:
# Regenerated on every start; safe to delete.
mongo-config:
config:
mysql-initdb:
+4
View File
@@ -0,0 +1,4 @@
<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M6.86612 16.7203C6.86612 11.5765 11.036 7.40666 16.1798 7.40666H29.941C30.6313 7.40666 31.191 7.9663 31.191 8.65666C31.191 12.8786 30.0116 15.9059 28.0999 18C26.2039 20.0767 23.7131 21.0979 21.3351 21.5628C18.9587 22.0273 16.6127 21.9536 14.884 21.773C14.0858 21.6896 13.4086 21.5822 12.9067 21.4898L9.38309 28.0216C9.52342 29.1887 10.517 30.0932 11.7219 30.0932H29.941C30.6313 30.0932 31.191 30.6529 31.191 31.3432C31.191 32.0336 30.6313 32.5932 29.941 32.5932H11.7219C9.04014 32.5932 6.86612 30.4192 6.86612 27.7374V16.7203ZM9.36612 22.7875L11.1495 19.4816C11.4215 18.9773 12.0015 18.7226 12.5568 18.8634L12.5579 18.8637L12.5626 18.8648L12.592 18.872C12.6198 18.8787 12.6635 18.8889 12.7221 18.9021C12.8393 18.9284 13.0159 18.9662 13.2434 19.0094C13.6987 19.096 14.3548 19.2041 15.1438 19.2865C16.7322 19.4525 18.8091 19.5092 20.8555 19.1092C22.9004 18.7095 24.8323 17.8712 26.2536 16.3144C27.4955 14.954 28.4459 12.9372 28.6501 9.90666H16.1798C12.4167 9.90666 9.36612 12.9572 9.36612 16.7203V22.7875Z" fill="#0052CD"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M29.786 2.5H10.214C5.95366 2.5 2.5 5.95366 2.5 10.214V29.786C2.5 34.0463 5.95366 37.5 10.214 37.5H29.786C34.0463 37.5 37.5 34.0463 37.5 29.786V10.214C37.5 5.95366 34.0463 2.5 29.786 2.5ZM10.214 0C4.57295 0 0 4.57295 0 10.214V29.786C0 35.4271 4.57295 40 10.214 40H29.786C35.4271 40 40 35.4271 40 29.786V10.214C40 4.57295 35.4271 0 29.786 0H10.214Z" fill="#0052CD"/>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

+16
View File
@@ -0,0 +1,16 @@
{
"id": "ethora-core",
"name": "Ethora Core",
"version": "2610",
"description": "Self-hosted chat and messaging server: API, web chat and admin panel, XMPP server (ejabberd) and file storage, with SDKs for web, iOS, Android and React Native.",
"logo": "ethora.svg",
"links": {
"github": "https://github.com/dappros/ethora-install",
"website": "https://ethora.com/",
"docs": "https://github.com/dappros/ethora-install/tree/main/deploy/compose"
},
"tags": [
"chat",
"self-hosted"
]
}
File diff suppressed because it is too large Load Diff
+3 -3
View File
@@ -5,9 +5,9 @@
"description": "Evolution API is a robust platform dedicated to empowering small businesses with limited resources, going beyond a simple messaging solution via WhatsApp.",
"logo": "evolutionapi.png",
"links": {
"github": "https://github.com/EvolutionAPI/evolution-api",
"docs": "https://doc.evolution-api.com/v2/en/get-started/introduction",
"website": "https://evolution-api.com/opensource-whatsapp-api/"
"github": "https://github.com/evolution-foundation/evolution-api",
"docs": "https://docs.evolutionfoundation.com.br/en",
"website": "https://evolutionfoundation.com.br/"
},
"tags": [
"api",
+1 -2
View File
@@ -7,6 +7,7 @@ root_pass = "${password:32}"
secret_key = "${password:64}"
[config]
mounts = []
[[config.domains]]
serviceName = "ezbookkeeping"
port = 8080
@@ -27,5 +28,3 @@ EBK_DATABASE_PASSWD = "${db_pass}"
EBK_LOG_MODE = "file"
# Security secret key used for application protection
EBK_SECURITY_SECRET_KEY = "${secret_key}"
[[config.mounts]]
+37
View File
@@ -0,0 +1,37 @@
version: "3.8"
services:
falkordb:
image: falkordb/falkordb:v4.20.4-alpine
restart: unless-stopped
environment:
- REDIS_ARGS=--requirepass ${FALKORDB_PASSWORD} --appendonly yes
- FALKORDB_ARGS=MAX_QUEUED_QUERIES 25 TIMEOUT 1000 RESULTSET_SIZE 10000 IMPORT_FOLDER /app/.data/import
- FALKORDB_PASSWORD=${FALKORDB_PASSWORD}
- AUTH_URL=${AUTH_URL}
- AUTH_SECRET=${AUTH_SECRET}
- NEXTAUTH_URL=${AUTH_URL}
- NEXTAUTH_SECRET=${AUTH_SECRET}
- ENCRYPTION_KEY=${ENCRYPTION_KEY}
- ALLOWED_ORIGINS=${AUTH_URL}
- TRUST_PROXY_HEADERS=true
- CSV_STORAGE=local
- CSV_LOCAL_TEMP_DIR=/app/.data/import
- CSV_LOCAL_LOAD_URI_MODE=file
- API_TOKEN_STORAGE_PATH=/app/.data/api_tokens.json
volumes:
- falkordb_data:/var/lib/falkordb/data
- falkordb_browser_data:/app/.data
expose:
- 3000
- 6379
healthcheck:
test: ["CMD-SHELL", "REDISCLI_AUTH=$$FALKORDB_PASSWORD redis-cli ping | grep PONG"]
interval: 10s
timeout: 5s
retries: 5
start_period: 10s
volumes:
falkordb_data:
falkordb_browser_data:
+17
View File
@@ -0,0 +1,17 @@
<svg width="508" height="508" viewBox="0 0 508 508" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_1764_80)">
<rect x="2" width="508" height="508" rx="63.5" fill="#191919"/>
<path d="M459.448 247.263C459.06 249.273 458.295 251.265 457.465 253.036C456.174 255.775 454.477 258.357 452.439 260.598C447.809 265.671 441.271 268.253 434.576 269.608C427.88 270.964 407.573 270.088 399.089 268.041C377.481 262.821 355.182 262.941 341.966 268.05C333.583 271.296 330.651 273.15 326.224 276.968C308.711 292.027 300.872 328.455 293.919 349.897C289.188 364.56 284.549 379.823 273.925 391.378C257.565 409.149 230.332 414 205.635 414H97.1546C95.7989 414 94.7752 412.773 95.0427 411.436L97.588 398.35C99.6538 387.689 109.005 379.998 119.869 379.998H192.706C213.732 379.998 236.234 377.056 247.891 360.963C254.43 351.916 256.311 340.711 258.985 330.051C268.346 292.728 271.454 258.219 308.822 243.5C297.811 236.621 289.806 225.499 287.021 213.27C281.902 190.694 294.011 167.962 295.136 144.897C295.634 135.075 293.319 123.999 284.697 118.549C278.656 114.722 270.91 114.611 263.652 114.611C236.409 114.639 219.182 114.657 187.504 114.676H180.145C165.897 114.685 155.199 101.691 157.919 87.7101L158.685 83.7446C158.879 82.7209 159.745 82.0016 160.778 82.0016C177.637 82.0016 241.602 82.103 273.695 82.0016C292.222 81.9555 313.036 82.8224 325.579 95.7242C329.738 100.013 332.394 104.992 333.962 110.387C334.035 110.6 334.091 110.83 334.155 111.051C337.752 124.267 334.921 139.852 331.296 153.621C326.63 171.531 321.632 192.345 331.628 209.461C335.603 216.258 341.828 221.293 349.224 223.959C353.356 225.453 355.126 226.2 359.516 226.163C361.711 226.144 363.897 225.923 366.064 225.536C370.38 224.779 375.074 223.728 378.966 222.963C380.829 222.594 382.701 222.262 384.591 221.994C389.719 221.275 395.206 221.137 400.426 222.179C404.253 222.944 407.988 224.355 411.188 226.605C414.591 229.003 416.602 231.982 418.391 235.671C419.396 237.737 420.641 239.83 422.67 240.909C426.303 242.846 431.938 241.545 435.848 241.232C439.915 240.909 443.955 240.273 448.012 239.802C449.986 239.572 451.959 239.369 453.942 239.277C455.501 239.203 457.198 239.406 458.369 240.559C459.208 241.388 459.605 242.587 459.697 243.768C459.78 244.911 459.678 246.083 459.457 247.254L459.448 247.263Z" fill="url(#paint0_linear_1764_80)"/>
<path d="M182.763 183.28L172.627 235.164C172.36 236.556 173.421 237.848 174.841 237.848H229.159C230.58 237.848 231.64 239.139 231.373 240.531L228.956 253.055C226.909 263.66 217.622 271.333 206.823 271.333H167.509C166.43 271.333 165.499 272.099 165.296 273.159L154.663 327.847C152.606 338.443 143.319 346.088 132.529 346.088H110.525C109.105 346.088 108.045 344.797 108.312 343.405L145.902 149.794C146.104 148.734 147.036 147.968 148.115 147.968H254.096C255.516 147.968 256.577 149.259 256.309 150.652L253.893 163.176C251.846 173.781 242.559 181.454 231.76 181.454H184.985C183.906 181.454 182.975 182.219 182.772 183.28H182.763Z" fill="white"/>
</g>
<defs>
<linearGradient id="paint0_linear_1764_80" x1="459.787" y1="82.0147" x2="70.7574" y2="381.599" gradientUnits="userSpaceOnUse">
<stop stop-color="#7466FF"/>
<stop offset="0.5" stop-color="#FF66B3"/>
<stop offset="1" stop-color="#FF804D"/>
</linearGradient>
<clipPath id="clip0_1764_80">
<rect width="508" height="508" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 3.3 KiB

+4
View File
@@ -0,0 +1,4 @@
1. Open the generated domain to access FalkorDB Browser.
2. Create a connection using `localhost` as the host and `6379` as the port.
3. Leave the username empty and use the generated `FALKORDB_PASSWORD` from the Dokploy environment settings.
4. Keep port `6379` private unless remote database clients need direct access. The browser interface can access it inside the container.
+20
View File
@@ -0,0 +1,20 @@
{
"id": "falkordb",
"name": "FalkorDB",
"version": "4.20.4",
"description": "A high-performance graph database for knowledge graphs, GraphRAG, agent memory, fraud detection and other relationship-heavy workloads. Includes the FalkorDB Browser interface.",
"logo": "falkordb.svg",
"links": {
"github": "https://github.com/FalkorDB/FalkorDB",
"website": "https://www.falkordb.com/",
"docs": "https://docs.falkordb.com/"
},
"tags": [
"database",
"graph-database",
"knowledge-graph",
"graphrag",
"ai",
"redis"
]
}
+19
View File
@@ -0,0 +1,19 @@
[variables]
main_domain = "${domain}"
falkordb_url = "https://${main_domain}"
falkordb_password = "${hash:32}"
auth_secret = "${base64:48}"
encryption_key = "${hash:32}"
[config]
env = [
"FALKORDB_PASSWORD=${falkordb_password}",
"AUTH_URL=${falkordb_url}",
"AUTH_SECRET=${auth_secret}",
"ENCRYPTION_KEY=${encryption_key}",
]
[[config.domains]]
serviceName = "falkordb"
port = 3000
host = "${main_domain}"
+116
View File
@@ -0,0 +1,116 @@
version: "3.8"
services:
feedbacks:
image: softinator/feedbacks@sha256:f7d759e671b48906a4aa5deff92b4644a73a6a4239f32b4cebba5cfcef8cc97b
restart: unless-stopped
init: true
read_only: true
tmpfs:
- /tmp:size=128m,mode=1777
cap_drop: [ALL]
security_opt: [no-new-privileges:true]
environment:
NODE_ENV: production
PORT: 3000
APP_ORIGIN: ${APP_ORIGIN:?required}
DATABASE_URL: postgresql://feedbacks:${POSTGRES_PASSWORD:?required}@postgres:5432/feedbacks
DATABASE_POOL_MAX: ${DATABASE_POOL_MAX:-10}
TRUST_PROXY_HOPS: ${TRUST_PROXY_HOPS:-1}
ASSET_DRIVER: s3
ORGANIZATION_ID: ${ORGANIZATION_ID:?required}
# Defaults to the bundled SeaweedFS S3; override all S3_* to use external storage.
S3_ENDPOINT: ${S3_ENDPOINT:-https://s3:8333}
S3_REGION: ${S3_REGION:-us-east-1}
S3_BUCKET: ${S3_BUCKET:-feedbacks}
S3_ACCESS_KEY_ID: ${S3_ACCESS_KEY_ID:?required}
S3_SECRET_ACCESS_KEY: ${S3_SECRET_ACCESS_KEY:?required}
# Feedbacks requires an HTTPS S3 endpoint in production; trust the bundled SeaweedFS self-signed cert.
NODE_EXTRA_CA_CERTS: /s3-config/public.crt
TURNSTILE_SITE_KEY: ${TURNSTILE_SITE_KEY:-}
TURNSTILE_SECRET_KEY: ${TURNSTILE_SECRET_KEY:-}
GITHUB_APPS_JSON: ${GITHUB_APPS_JSON:-}
GITHUB_APP_ID: ${GITHUB_APP_ID:-}
GITHUB_APP_SLUG: ${GITHUB_APP_SLUG:-}
GITHUB_APP_PRIVATE_KEY_BASE64: ${GITHUB_APP_PRIVATE_KEY_BASE64:-}
volumes:
- feedbacks-s3-config:/s3-config:ro
expose: ["3000"]
depends_on:
postgres:
condition: service_healthy
s3-bucket:
condition: service_completed_successfully
stop_grace_period: 15s
postgres:
image: postgres:17-bookworm
restart: unless-stopped
environment:
POSTGRES_USER: feedbacks
POSTGRES_DB: feedbacks
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?required}
volumes: ["feedbacks-postgres:/var/lib/postgresql/data"]
healthcheck:
test: ["CMD-SHELL", "pg_isready -U feedbacks -d feedbacks"]
interval: 10s
timeout: 5s
retries: 10
s3-init:
image: alpine:3.22
restart: "no"
environment:
S3_ACCESS_KEY_ID: ${S3_ACCESS_KEY_ID:?required}
S3_SECRET_ACCESS_KEY: ${S3_SECRET_ACCESS_KEY:?required}
volumes:
- feedbacks-s3-config:/config
entrypoint: ["/bin/sh", "-c"]
command:
- |
set -e
if [ ! -s /config/public.crt ]; then
apk add --no-cache openssl >/dev/null
openssl req -x509 -newkey rsa:2048 -nodes -days 3650 \
-subj "/CN=s3" -addext "subjectAltName=DNS:s3" \
-addext "basicConstraints=critical,CA:TRUE" \
-keyout /config/private.key -out /config/public.crt
fi
printf '{"identities":[{"name":"feedbacks","credentials":[{"accessKey":"%s","secretKey":"%s"}],"actions":["Admin","Read","Write","List","Tagging"]}]}' \
"$$S3_ACCESS_KEY_ID" "$$S3_SECRET_ACCESS_KEY" > /config/s3.json
chmod 644 /config/*
s3:
image: chrislusf/seaweedfs:4.48
restart: unless-stopped
command: server -dir=/data -s3 -s3.port=8333 -s3.config=/config/s3.json -s3.cert.file=/config/public.crt -s3.key.file=/config/private.key
volumes:
- feedbacks-s3:/data
- feedbacks-s3-config:/config:ro
depends_on:
s3-init:
condition: service_completed_successfully
s3-bucket:
image: alpine:3.22
restart: "no"
depends_on:
- s3
environment:
S3_BUCKET: ${S3_BUCKET:-feedbacks}
S3_ACCESS_KEY_ID: ${S3_ACCESS_KEY_ID:?required}
S3_SECRET_ACCESS_KEY: ${S3_SECRET_ACCESS_KEY:?required}
volumes:
- feedbacks-s3-config:/config:ro
entrypoint: ["/bin/sh", "-c"]
command:
- |
set -e
apk add --no-cache curl >/dev/null
for i in $$(seq 1 60); do
code=$$(curl -s -o /dev/null -w '%{http_code}' --cacert /config/public.crt \
--aws-sigv4 "aws:amz:us-east-1:s3" --user "$$S3_ACCESS_KEY_ID:$$S3_SECRET_ACCESS_KEY" \
-X PUT "https://s3:8333/$$S3_BUCKET") || code=000
case "$$code" in 200|409) echo "bucket ready ($$code)"; exit 0;; esac
sleep 2
done
echo "could not create bucket (last HTTP $$code)"; exit 1
volumes:
feedbacks-postgres:
feedbacks-s3:
feedbacks-s3-config:
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

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