Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
125 commits
Select commit Hold shift + click to select a range
ea23fb6
fix: meta.json of Poke blueprint
zaaakher Jul 8, 2026
d7b9ac3
fix: broken links in some blueprints
zaaakher Jul 8, 2026
3e942a5
Merge pull request #982 from zaaakher/patch-1
Siumauricio Jul 8, 2026
17efd70
Merge pull request #984 from zaaakher/fix-broken-links
Siumauricio Jul 8, 2026
6d56faf
Add openhabittracker blueprint
Jul 13, 2026
59770d4
fix(affinepro): update to current AFFiNE images
Siumauricio Jul 14, 2026
55aa824
fix(cockpit): persist config and storage volumes per upstream docs
Siumauricio Jul 14, 2026
744ff52
fix(kener): define REDIS_URL and drop unused databases
Siumauricio Jul 14, 2026
c6a0b1b
fix(homarr): use named volume for /appdata and hex encryption key
Siumauricio Jul 14, 2026
7ed8450
fix(logto): fix postgres role error and update to 1.41.0
Siumauricio Jul 14, 2026
8f84a52
fix(gitlab-ce): serve on the generated domain (remove removed unicorn…
Siumauricio Jul 14, 2026
6786237
fix(zitadel): wire EXTERNALDOMAIN/PORT/SECURE to the generated domain
Siumauricio Jul 14, 2026
31158e2
fix(immich): update to v3.0.2
Siumauricio Jul 14, 2026
3c416ea
fix(automatisch): switch to official image and wire up DOMAIN to fix …
Siumauricio Jul 14, 2026
1e48681
fix(signoz): fix ClickHouse hostname resolution and IPv6 binding
Siumauricio Jul 14, 2026
29a7970
fix(infisical): update to v0.162.6
Siumauricio Jul 14, 2026
cd16441
fix: add databasus (postgresus renamed upstream)
Siumauricio Jul 14, 2026
fb64197
fix(evolutionapi): enable integration flags and update version
Siumauricio Jul 14, 2026
2556321
fix(rybbit): update to v2.7.0
Siumauricio Jul 14, 2026
9bdbe26
fix(phpmyadmin): raise PHP upload limit so SQL imports over 2MB work
Siumauricio Jul 14, 2026
f946051
fix(openpanel): pin verified 2.2.1 images and fix ClickHouse interser…
Siumauricio Jul 14, 2026
af16250
fix(wordpress): route loopback requests through Traefik to fix cURL e…
Siumauricio Jul 14, 2026
030d9d1
fix(minio): migrate to pgsty/minio community fork (upstream is source…
Siumauricio Jul 14, 2026
f036dda
fix(nextcloud-aio): drop AIO branding, keep template id, pin nextclou…
Siumauricio Jul 14, 2026
b7c2d6c
feat: add MailCatcher NG template
Siumauricio Jul 14, 2026
03a60bb
docs: add per-template setup instructions (supabase, trigger.dev)
Siumauricio Jul 14, 2026
7683947
feat: add Weblate template
Siumauricio Jul 14, 2026
b23ddd0
feat: add Synapse (Matrix homeserver) template
Siumauricio Jul 14, 2026
1c2dea3
feat: add Dify template
Siumauricio Jul 14, 2026
d1ef933
feat: add Sim Studio template
Siumauricio Jul 14, 2026
62850c3
feat: add Steedos template
Siumauricio Jul 14, 2026
0bfb50d
feat: add Silex template
Siumauricio Jul 14, 2026
3ddbdde
feat: add SpacetimeDB template
Siumauricio Jul 14, 2026
a266e36
feat: add CertMate template
Siumauricio Jul 14, 2026
7f3a08e
feat: add PostHog template
Siumauricio Jul 14, 2026
ee35ed1
feat: add Markup template
Siumauricio Jul 14, 2026
311faa1
Merge pull request #1000 from Dokploy/fix/gitlab-ce
Siumauricio Jul 14, 2026
bd457e0
Merge pull request #1022 from Dokploy/feat/spacetimedb
Siumauricio Jul 14, 2026
6f1b083
Merge pull request #1005 from Dokploy/fix/infisical-update
Siumauricio Jul 14, 2026
1c29214
Merge pull request #1001 from Dokploy/fix/zitadel-domain
Siumauricio Jul 14, 2026
c33f72b
Merge pull request #997 from Dokploy/fix/kener-issues
Siumauricio Jul 14, 2026
a837539
Merge pull request #999 from Dokploy/fix/logto-update
Siumauricio Jul 14, 2026
8c15db8
feat: add Frappe LMS template
Siumauricio Jul 14, 2026
478c519
Merge pull request #1021 from Dokploy/feat/silex
Siumauricio Jul 14, 2026
f76c31e
Merge pull request #1024 from Dokploy/feat/markup
Siumauricio Jul 14, 2026
6f27a94
Merge pull request #995 from Dokploy/fix/affinepro-update
Siumauricio Jul 14, 2026
493e824
Merge pull request #996 from Dokploy/fix/cockpit-volumes
Siumauricio Jul 14, 2026
33c3fcd
Merge pull request #998 from Dokploy/fix/homarr-volumes
Siumauricio Jul 14, 2026
59e3234
feat: add TREK template
Siumauricio Jul 14, 2026
9e02e96
Merge pull request #1002 from Dokploy/fix/immich-update
Siumauricio Jul 14, 2026
64fb0f6
Merge pull request #1003 from Dokploy/fix/automatisch
Siumauricio Jul 14, 2026
74cec8f
Merge pull request #1004 from Dokploy/fix/signoz-clickhouse
Siumauricio Jul 14, 2026
618cda2
Merge pull request #1006 from Dokploy/fix/databasus-rename
Siumauricio Jul 14, 2026
5d6afe2
Merge pull request #1007 from Dokploy/fix/evolutionapi
Siumauricio Jul 14, 2026
0633b98
Merge pull request #1008 from Dokploy/fix/rybbit-update
Siumauricio Jul 14, 2026
dd98603
Merge pull request #1009 from Dokploy/fix/phpmyadmin
Siumauricio Jul 14, 2026
c60bfa8
Merge pull request #1010 from Dokploy/fix/openpanel
Siumauricio Jul 14, 2026
77145ad
Merge pull request #1011 from Dokploy/fix/wordpress-loopback
Siumauricio Jul 14, 2026
ffeaca1
Merge pull request #1012 from Dokploy/fix/minio-source-only
Siumauricio Jul 14, 2026
981811f
Merge pull request #1013 from Dokploy/fix/nextcloud-naming
Siumauricio Jul 14, 2026
89505f0
Merge pull request #1014 from Dokploy/feat/mailcatcher-ng
Siumauricio Jul 14, 2026
abe36ad
Merge pull request #1015 from Dokploy/docs/template-instructions
Siumauricio Jul 14, 2026
4159d3a
Merge pull request #1016 from Dokploy/feat/weblate
Siumauricio Jul 14, 2026
fabecbe
Merge pull request #1017 from Dokploy/feat/synapse
Siumauricio Jul 14, 2026
31f9547
Merge pull request #1018 from Dokploy/feat/dify
Siumauricio Jul 14, 2026
77b078f
Merge pull request #1019 from Dokploy/feat/sim
Siumauricio Jul 14, 2026
a80a073
Merge pull request #1020 from Dokploy/feat/steedos
Siumauricio Jul 14, 2026
e7285ce
Merge pull request #1023 from Dokploy/feat/certmate
Siumauricio Jul 14, 2026
cc3b935
Merge pull request #1025 from Dokploy/feat/frappe-lms
Siumauricio Jul 14, 2026
15db93d
Merge pull request #1026 from Dokploy/feat/trek
Siumauricio Jul 14, 2026
af8b535
feat: add Oryx (SRS) media streaming template
Siumauricio Jul 14, 2026
3eb1d3b
fix: stop plugins service crash loop (logs-redis TLS default)
Siumauricio Jul 14, 2026
fe94f4c
feat: add n8n queue mode template
Siumauricio Jul 14, 2026
7d252ea
feat: add bonfire template
Siumauricio Jul 14, 2026
0beb68a
feat: add dagu blueprint
knowsuchagency Jul 14, 2026
3a6f9d7
Merge pull request #1029 from Dokploy/feat/n8n-queue
Siumauricio Jul 15, 2026
51922e7
Merge pull request #1031 from knowsuchagency/add-dagu-template
Siumauricio Jul 15, 2026
13d03f9
Merge pull request #1030 from Dokploy/feat/bonfire
Siumauricio Jul 15, 2026
a3f2655
Merge pull request #1028 from Dokploy/feat/posthog
Siumauricio Jul 15, 2026
6683685
feat: add OneUptime template
xSiumauricio Jul 14, 2026
f6245f8
feat: add Mailu template
Siumauricio Jul 16, 2026
d6b842c
Merge pull request #1034 from Dokploy/feat/oneuptime
Siumauricio Jul 17, 2026
dd12762
Merge pull request #994 from Jinjinov/add-openhabittracker
Siumauricio Jul 20, 2026
c66a1df
Merge pull request #1027 from Dokploy/feat/oryx
Siumauricio Jul 20, 2026
fff1708
Merge pull request #1033 from Dokploy/feat/mailu
Siumauricio Jul 20, 2026
34f3577
feat(templates): add systemprompt (#1032)
Ejb503 Jul 20, 2026
7aee585
chore: normalize template tags to kebab-case (#987)
markokosticdev Jul 20, 2026
8ca2bf9
feat: adds `check-links.js` to find broken links (#983)
zaaakher Jul 20, 2026
08d87d8
feat: add struxa template (#1037)
stripsior Jul 20, 2026
8daff07
Add PodFetch template (#1035)
SamTV12345 Jul 20, 2026
ceb65b2
fix(docker): share plugins and themes volumes across containers (#990)
Nekoplii Jul 20, 2026
b4542d8
feat(directus): upgrade template to Directus 12.1.1 (#986)
markokosticdev Jul 20, 2026
c33d499
Merge branch 'main' into canary
Siumauricio Jul 20, 2026
285e667
chore: update Windshift to v0.8.2 (#1041)
stefan-ernst Jul 22, 2026
0c33668
fix: bring scrutiny, stack-auth and vault in line with the compose co…
DPS0340 Aug 3, 2026
4de48c2
Add WupNext blueprint (#1051)
javierlnmn Aug 3, 2026
c1ccb27
feat: add NaviServer template (#1062)
andre-carbajal Aug 3, 2026
69e731e
fix: change "ports" -> "expose" for multiple services (#1053)
nktnet1 Aug 3, 2026
a176ba3
Blueprints/portabase (#1055)
Asuniia Aug 3, 2026
292877b
feat: Add Fluxer template (#1045)
fincrawmcq Aug 3, 2026
a49f00f
ci: audit every blueprint on a schedule (#1049)
DPS0340 Aug 3, 2026
5aba790
chore: remove conduwuit in favour of tuwunel (#1054)
nktnet1 Aug 3, 2026
1dc9c36
libredb-studio: bump version to 0.9.59 (#1039)
yusuf-gundogdu Aug 3, 2026
a73e492
feat: bump fmd-server to 0.16.0 for compatibility with Open Street Ma…
nktnet1 Aug 3, 2026
de726de
feat: add 9Router template (#1046)
DPS0340 Aug 3, 2026
0eae107
Update SendDock template: track latest image, drop deprecated env var…
JuansesDev Aug 3, 2026
0b73115
Chatto latest (#1060)
mariosant Aug 3, 2026
025ae61
feat: add Whatomate template (#1064)
Siumauricio Aug 3, 2026
755c7c5
Add Open Design template (#966)
abhishukla610 Aug 3, 2026
b258e9f
chore: update stalwart named volumes for v0.16
rowupstream Aug 4, 2026
ce2864a
chore: update stalwart named volumes for v0.16 (#1066)
Siumauricio Aug 5, 2026
ebeeb58
Add Creed self-host template (#1043)
Simciutoja Aug 6, 2026
01930d7
Add Yuvomi template (#1065)
maarteNNNN Aug 6, 2026
8ad0f91
fix(supabase): upgrade database to Postgres 17 (#1068)
Siumauricio Aug 6, 2026
1d47fa1
fix: normalize template.toml mounts across all 502 blueprints (#1063)
Siumauricio Aug 6, 2026
eec3b3d
Update forgejo template; bumps Forgejo version to 15; fixes git push …
DiegoEnriquezSerrano Aug 6, 2026
ba60abb
feat: add Novu self-hosted notification template (#1056)
detekfitfounder Aug 7, 2026
740981d
fix: bring remaining blueprints in line with the port conventions (au…
Siumauricio Aug 7, 2026
62a418e
feat: add NaviMusic template (#1059)
andre-carbajal Aug 7, 2026
7b4af4c
fix(supabase): generate the new API keys and wire up JWKS verificatio…
whollacsek Aug 7, 2026
c4398d2
feat: add Waxum template (#1074)
fdciabdul Aug 9, 2026
bbd0817
Add Langfuse template (#1072)
huseyincenik Aug 9, 2026
a733967
Reef chain (#776)
anukulpandey Aug 9, 2026
979eadc
Change website and docs URLs in meta.json
fdciabdul Aug 9, 2026
fcac388
Change website and docs URLs in meta.json (#1078)
Siumauricio Aug 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
163 changes: 163 additions & 0 deletions .github/workflows/audit-all-blueprints.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,163 @@
name: Audit All Blueprints

# The per-PR validators only look at blueprints a PR touches, which is the right
# call for CI cost but means a template is checked when it lands and then never
# again. When a rule is added or tightened, every existing blueprint that breaks
# it stays broken with nothing surfacing it (see #1047).
#
# This job runs the same validators over ALL blueprints on a schedule, so drift
# is reported instead of accumulating. It never runs on pull_request, so it
# cannot block a contributor for a pre-existing problem they did not introduce.

on:
schedule:
# Mondays, 04:00 UTC
- cron: "0 4 * * 1"
workflow_dispatch:
inputs:
fail_on_findings:
description: "Exit non-zero when findings exist (default: report only)"
type: boolean
default: false

permissions:
contents: read

jobs:
audit:
runs-on: ubuntu-latest

steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: 20.16.0

- name: Set up pnpm
uses: pnpm/action-setup@v4
with:
version: 8

- name: Install dependencies
run: cd build-scripts && pnpm install

- name: Validate per-template metadata
run: node build-scripts/generate-meta.js --check

- name: Audit every blueprint
id: audit
run: |
# $RUNNER_TEMP is per-job; also cleared explicitly so a re-run or a
# partially-executed earlier step can never leak into the summary.
WORK="${RUNNER_TEMP:-/tmp}"
OUT="$WORK/validator-out.txt"
REPORT="$WORK/audit-report.md"
SUMMARY="$WORK/audit-summary.md"
rm -f "$OUT" "$REPORT" "$SUMMARY"

COMPOSE_FAILED=""
TOML_FAILED=""

for dir in blueprints/*/; do
id="$(basename "$dir")"

# Run unconditionally: a blueprint with no docker-compose.yml or no
# template.toml is itself a finding, and the validators already
# report a missing file clearly. Skipping them would hide exactly
# the blueprints most likely to be broken.
if ! (cd build-scripts && pnpm exec tsx validate-docker-compose.ts \
--file "../$dir/docker-compose.yml") > "$OUT" 2>&1; then
COMPOSE_FAILED="$COMPOSE_FAILED $id"
{
echo "### \`$id\` — docker-compose.yml"
echo '```'
grep '❌' "$OUT" || cat "$OUT"
echo '```'
} >> "$REPORT"
fi

if ! (cd build-scripts && pnpm exec tsx validate-template.ts \
--dir "../$dir") > "$OUT" 2>&1; then
TOML_FAILED="$TOML_FAILED $id"
{
echo "### \`$id\` — template.toml"
echo '```'
grep '❌' "$OUT" || cat "$OUT"
echo '```'
} >> "$REPORT"
fi
done

COMPOSE_COUNT=$(echo $COMPOSE_FAILED | wc -w | tr -d ' ')
TOML_COUNT=$(echo $TOML_FAILED | wc -w | tr -d ' ')
TOTAL=$(ls -d blueprints/*/ | wc -l | tr -d ' ')

{
echo "## Blueprint audit"
echo ""
echo "| check | failing | of |"
echo "| --- | --- | --- |"
echo "| \`validate-docker-compose.ts\` | $COMPOSE_COUNT | $TOTAL |"
echo "| \`validate-template.ts\` | $TOML_COUNT | $TOTAL |"
echo ""
} > "$SUMMARY"

if [ -f "$REPORT" ]; then
cat "$REPORT" >> "$SUMMARY"
else
echo "No findings." >> "$SUMMARY"
fi

# The step summary caps at ~1MB and truncates silently past it, which
# would hide findings exactly as the backlog grows. Bound what we
# append and point at the artifact for the rest.
SUMMARY_LIMIT=$((512 * 1024))
SUMMARY_BYTES=$(wc -c < "$SUMMARY" | tr -d ' ')

if [ "$SUMMARY_BYTES" -gt "$SUMMARY_LIMIT" ]; then
# Emit the header table only, never a byte-sliced prefix: cutting
# mid-``` leaves an unclosed code fence, which swallows the notice
# below it and makes the truncation invisible in the rendered summary.
{
head -n 7 "$SUMMARY"
echo ""
echo "_Report omitted: $SUMMARY_BYTES bytes exceeds the $SUMMARY_LIMIT byte budget for a job summary._"
echo "_Download the \`blueprint-audit\` artifact for the complete output._"
} >> "$GITHUB_STEP_SUMMARY"
else
cat "$SUMMARY" >> "$GITHUB_STEP_SUMMARY"
fi

# Always published, so the full report survives regardless of size.
cp "$SUMMARY" "$WORK/blueprint-audit.md"
echo "report_path=$WORK/blueprint-audit.md" >> "$GITHUB_OUTPUT"

echo "compose_failed=$COMPOSE_COUNT" >> "$GITHUB_OUTPUT"
echo "toml_failed=$TOML_COUNT" >> "$GITHUB_OUTPUT"

if [ "$COMPOSE_COUNT" != "0" ] || [ "$TOML_COUNT" != "0" ]; then
echo "::warning::$COMPOSE_COUNT compose and $TOML_COUNT template.toml findings across $TOTAL blueprints"
fi

- name: Upload the full report
if: always() && steps.audit.outputs.report_path != ''
uses: actions/upload-artifact@v4
with:
name: blueprint-audit
path: ${{ steps.audit.outputs.report_path }}
retention-days: 30

- name: Fail if requested
# `inputs` is only populated for workflow_dispatch; on a schedule run it
# is not available, so gate on the event first and read the value through
# github.event.inputs, which is an empty string when absent.
if: >-
github.event_name == 'workflow_dispatch' &&
github.event.inputs.fail_on_findings == 'true' &&
(steps.audit.outputs.compose_failed != '0' || steps.audit.outputs.toml_failed != '0')
run: |
echo "❌ Findings present and fail_on_findings was requested."
exit 1
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -183,7 +183,7 @@ services:
- 3000:3000

# Instead use this way:
ports:
expose:
- 3000
```

Expand Down
37 changes: 36 additions & 1 deletion app/src/components/TemplateDialog.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import { Tabs, TabsContent, TabsList, TabsTrigger } from "./ui/tabs";
import { Label } from "./ui/label";
import { Clipboard } from "lucide-react";
import { Input } from "./ui/input";
import Markdown from "./ui/markdown";

interface Template {
id: string;
Expand All @@ -32,6 +33,7 @@ interface Template {
interface TemplateFiles {
dockerCompose: string | null;
config: string | null;
instructions: string | null;
}

interface TemplateDialogProps {
Expand Down Expand Up @@ -169,8 +171,23 @@ const TemplateDialog: React.FC<TemplateDialogProps> = ({
</div>
</div>
)}
<Tabs defaultValue="docker-compose" className="w-full">
<Tabs
defaultValue={
templateFiles?.instructions
? "instructions"
: "docker-compose"
}
className="w-full"
>
<TabsList className="w-full justify-start">
{templateFiles?.instructions && (
<TabsTrigger
value="instructions"
className="data-[state=active]:font-bold"
>
Instructions
</TabsTrigger>
)}
<TabsTrigger
value="docker-compose"
className="data-[state=active]:font-bold"
Expand All @@ -184,6 +201,24 @@ const TemplateDialog: React.FC<TemplateDialogProps> = ({
Configuration
</TabsTrigger>
</TabsList>

{templateFiles?.instructions && (
<TabsContent value="instructions" className="mt-4">
<div className="space-y-2">
<Label className="flex flex-col items-start w-fit justify-start gap-1">
<span className="leading-tight text-xl font-semibold">
Setup Instructions
</span>
<span className="leading-tight text-sm text-gray-500">
instructions.md
</span>
</Label>
<div className="rounded-md border p-4">
<Markdown content={templateFiles.instructions} />
</div>
</div>
</TabsContent>
)}
<TabsContent value="docker-compose" className="mt-4">
{templateFiles?.dockerCompose && (
<div className="space-y-2">
Expand Down
27 changes: 21 additions & 6 deletions app/src/components/TemplateGrid.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ interface Template {
interface TemplateFiles {
dockerCompose: string | null;
config: string | null;
instructions: string | null;
}

interface TemplateGridProps {
Expand Down Expand Up @@ -80,20 +81,34 @@ const TemplateGrid: React.FC<TemplateGridProps> = ({ view }) => {
const fetchTemplateFiles = async (templateId: string) => {
setModalLoading(true);
try {
const [dockerComposeRes, configRes] = await Promise.all([
fetch(`/blueprints/${templateId}/docker-compose.yml`),
fetch(`/blueprints/${templateId}/template.toml`),
]);
const [dockerComposeRes, configRes, instructionsRes] = await Promise.all(
[
fetch(`/blueprints/${templateId}/docker-compose.yml`),
fetch(`/blueprints/${templateId}/template.toml`),
fetch(`/blueprints/${templateId}/instructions.md`),
]
);

const dockerCompose = dockerComposeRes.ok
? await dockerComposeRes.text()
: null;
const config = configRes.ok ? await configRes.text() : null;

setTemplateFiles({ dockerCompose, config });
// Guard against SPA fallbacks that return index.html with a 200 status
// for templates that don't have an instructions.md file.
const instructionsIsMarkdown =
instructionsRes.ok &&
!(instructionsRes.headers.get("content-type") || "").includes(
"text/html"
);
const instructions = instructionsIsMarkdown
? await instructionsRes.text()
: null;

setTemplateFiles({ dockerCompose, config, instructions });
} catch (err) {
console.error("Error fetching template files:", err);
setTemplateFiles({ dockerCompose: null, config: null });
setTemplateFiles({ dockerCompose: null, config: null, instructions: null });
} finally {
setModalLoading(false);
}
Expand Down
Loading
Loading