Skip to content

Add Creed self-host template - #1043

Merged
Siumauricio merged 5 commits into
Dokploy:canaryfrom
Simciutoja:canary
Aug 6, 2026
Merged

Add Creed self-host template#1043
Siumauricio merged 5 commits into
Dokploy:canaryfrom
Simciutoja:canary

Conversation

@Simciutoja

@Simciutoja Simciutoja commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

Creed is your personal context profile. One file that captures who you are: values, goals, work, preferences, constraints, people, health, routines. Any AI you talk to knows you instantly instead of starting from zero every conversation

Summary

  • Adds a new creed template (blueprints/creed/) for self-hosting Creed - a personal context file (creed.md) that AI agents read before answering and propose updates to.
  • Builds the app from source via an inline multi-stage Node 20 Dockerfile (the upstream repo doesn't ship an official image), since it's a stateless Next.js app.
  • Only CREED_ENCRYPTION_SECRET is auto-generated. Creed requires a real Supabase project (Auth, RLS, realtime, schema pushed via supabase db push), which can't be provisioned from within a docker-compose deploy - so Supabase/Stripe/OpenRouter/Resend/GitHub OAuth vars are left blank, with step-by-step setup instructions in the mounted README.md.
  • NEXT_PUBLIC_* vars are passed as Docker build args (not just container env), since Next.js inlines them at build time and the app fails the build outright if NEXT_PUBLIC_SITE_URL is unset.

Test plan

  • node build-scripts/generate-meta.js --check passes (501 templates validated)
  • docker compose build --no-cache succeeds against the upstream repo
  • docker compose up boots the container; GET / returns 200
  • GET /api/health returns 200 with status: "degraded" and db.error: "supabase_admin_not_configured" when Supabase is unset, matching the documented behavior
  • Preview-link BASE64 import test in a live Dokploy instance (per repo README step 9)

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.
Copilot AI review requested due to automatic review settings July 23, 2026 16:13
@dosubot dosubot Bot added size:L This PR changes 100-499 lines, ignoring generated files. new-template labels Jul 23, 2026
@github-actions

github-actions Bot commented Jul 23, 2026

Copy link
Copy Markdown
built with Refined Cloudflare Pages Action

⚡ Cloudflare Pages Deployment

Name Status Preview Last Commit
templates ✅ Ready (View Log) Visit Preview ba0a906

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a new Dokploy blueprint (blueprints/creed/) for self-hosting the open-source Creed Next.js app, including template metadata, configuration, and a logo.

Changes:

  • Added a new creed blueprint with a source-build Docker Compose setup.
  • Added Dokploy template.toml variables/env wiring plus an embedded deployment/setup README via mounts.
  • Registered the template via per-blueprint meta.json and included creed.svg branding.

Reviewed changes

Copilot reviewed 3 out of 4 changed files in this pull request and generated 4 comments.

File Description
blueprints/creed/docker-compose.yml Adds a build-from-source Compose service for running Creed.
blueprints/creed/template.toml Defines Dokploy variables, domain mapping, env configuration, and a mounted README with setup steps.
blueprints/creed/meta.json Registers the Creed template metadata (id/name/version/links/tags/logo).
blueprints/creed/creed.svg Adds the template logo asset.

Comment thread blueprints/creed/docker-compose.yml Outdated
Comment on lines +64 to +65
ports:
- 3000
Comment on lines +4 to +6
build:
context: https://github.com/connorhpbrn/creed.git
dockerfile_inline: |
Comment thread blueprints/creed/template.toml Outdated
Comment on lines +12 to +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 = ""

Comment thread blueprints/creed/meta.json Outdated
{
"id": "creed",
"name": "Creed",
"version": "latest",
- 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
Updated the build context URL to the main branch.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 3 out of 4 changed files in this pull request and generated 3 comments.

Comments suppressed due to low confidence (1)

blueprints/creed/meta.json:4

  • meta.json.version is currently a short git SHA, but the build is pinned to a full commit SHA in docker-compose.yml (context: ...#e9b096d6d68fef6df336338bc9965a94ab62f75e). Using the full SHA here as well makes the template version unambiguous and clearly tied to the build input.
  "version": "e9b096d",

host = "${main_domain}"

env = [
"NEXT_PUBLIC_SITE_URL=https://${main_domain}",
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
Comment on lines +26 to +35
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"]
Copilot AI review requested due to automatic review settings July 23, 2026 19:25

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 3 out of 4 changed files in this pull request and generated 1 comment.

Comments suppressed due to low confidence (2)

blueprints/creed/docker-compose.yml:6

  • build.context points at the default branch of the upstream repo, so this template is not reproducible and can break whenever connorhpbrn/creed changes. Since meta.json already declares a specific commit-like version (e9b096d), the git build context should be pinned to that same ref.
    build:
      context: https://github.com/connorhpbrn/creed.git
      dockerfile_inline: |

blueprints/creed/docker-compose.yml:27

  • The runtime stage also uses the moving node:20-alpine tag. Pin this to the same specific Node/Alpine version as the builder stage so runtime security/behavior changes are intentional.
        FROM node:20-alpine AS runner
        WORKDIR /app

Comment on lines +7 to +8
FROM node:20-alpine AS builder
WORKDIR /app
@Siumauricio

Copy link
Copy Markdown
Contributor

Thanks for the contribution — the template is well put together (the mounted README with the Supabase setup steps is a nice touch), but as-is it fails to deploy on a live Dokploy instance for two independent reasons. I tested it today and both are confirmed, along with the fixes:

1. The build context must stay pinned. In 5b4c211 you reverted the pin from 1b8b9b3 back to main, and upstream moved to a monorepo on 2026-08-02 (5260f7f "move creed into a monorepo"), which now breaks the inline Dockerfile:

0.659 sh: tsc: not found
0.661 npm error Lifecycle script `build` failed with error:
0.661 npm error code 127
0.661 npm error workspace creed-cli@0.2.2
failed to solve: process "/bin/sh -c npm run build" did not complete successfully: exit code: 127

Even if the root build passed, the runner stage would still break at HEAD: the Next.js output now lives in apps/creed/.next (not /app/.next), there is no root next.config.ts, and the root package.json has no start script. Please restore the pin (it also matches the "version": "e9b096d" you already declare in meta.json; version bumps can update the pin deliberately later):

      context: https://github.com/connorhpbrn/creed.git#e9b096d6d68fef6df336338bc9965a94ab62f75e

2. The env array in template.toml is in the wrong TOML table. It's placed after the [[config.domains]] header, so it parses as a key inside the domain entry instead of config.env. Dokploy imports the template with an empty environment — every ${VAR} in the compose resolves to an empty string, and even with the pin restored the build dies with:

[cause]: Error: NEXT_PUBLIC_SITE_URL is not set. Set it to the deployed origin (e.g. https://your-deploy.vercel.app) ...
> Build error occurred
Error: Failed to collect page data for /_not-found

Fix: move the env = [ ... ] block up so it sits directly under [config], before [[config.domains]] (see e.g. blueprints/activepieces/template.toml for the convention).

With exactly those two changes I deployed the template on a live Dokploy instance and it works end to end: the build succeeds, GET / returns 200 with the Creed landing page, and GET /api/health returns the documented degraded state:

{"status":"degraded","components":{"api":{"ok":true},"db":{"ok":false,"error":"supabase_admin_not_configured"},"auth":{"ok":false,"error":"supabase_admin_not_configured"}}}

Everything else checks out: generate-meta.js --check passes, no host ports / container_name / external networks, and the README mount imports cleanly. Could you push those two changes? Happy to merge after that.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 3 out of 4 changed files in this pull request and generated no new comments.

Suppressed comments (2)

blueprints/creed/template.toml:14

  • This template defaults NEXT_PUBLIC_SITE_URL to https, which can cause incorrect redirects/URLs when Dokploy TLS isn’t enabled yet or in plain-HTTP deployments. Most other templates default public URL variables to http (e.g., pocket-id’s APP_URL and linkwarden’s NEXTAUTH_URL), letting users switch to https when needed.
env = [
  "NEXT_PUBLIC_SITE_URL=https://${main_domain}",
  "NEXT_PUBLIC_SUPABASE_URL=",

blueprints/creed/docker-compose.yml:5

  • The build context points at the repo default branch tip, but meta.json is versioned as commit "e9b096d". This makes deploys non-reproducible and can silently ship a different app version than the template metadata indicates. Pin the git build context to the same ref as the template version (and quote it so the YAML # isn’t treated as a comment).
      context: https://github.com/connorhpbrn/creed.git

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.
Copilot AI review requested due to automatic review settings August 3, 2026 18:51
@Simciutoja

Copy link
Copy Markdown
Contributor Author

Thanks for the detailed review and for verifying the deploy, it's my first time contributing to so big projects, so is my first mistake :>

Both fixes are in:

  1. Restored the build context pin to e9b096d (matches meta.json version)
  2. Moved env under [config], before [[config.domains]]

This is my first time contributing a template like this, so sorry for the mistakes - thanks again for catching them and walking through the fixes. Happy to adjust further if anything else comes up.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 3 out of 4 changed files in this pull request and generated no new comments.

Suppressed comments (2)

blueprints/creed/template.toml:9

  • Repo templates typically default self-hosted base URLs to http:// (letting the proxy/SSL layer handle HTTPS). Using https:// here can be misleading for deployments without TLS enabled yet, and it diverges from most other blueprints’ URL env defaults (e.g. hoarder’s NEXTAUTH_URL and chatwoot’s FRONTEND_URL). Consider switching to http:// unless Creed explicitly requires https at runtime/build time.
env = [
  "NEXT_PUBLIC_SITE_URL=https://${main_domain}",
  "NEXT_PUBLIC_SUPABASE_URL=",
  "NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY=",

blueprints/creed/meta.json:4

  • meta.json version is a short commit hash, but docker-compose.yml pins the build context to the full SHA. Keeping these aligned makes it easier to reproduce builds and avoids ambiguity if the short hash ever collides.
  "version": "e9b096d",

@Siumauricio

Copy link
Copy Markdown
Contributor

Re-tested at ba0a906 after the fixes — both issues are resolved:

  • Build context is now pinned to commit e9b096d, matching meta.json's version.
  • env now sits under [config] (parses as config.env), no longer inside [[config.domains]].

Deployed on a test instance: build from source completed in ~3 min, container running, GET / returns 200 («Creed - Personal context for your agents.») and GET /api/health returns 200 with supabase_admin_not_configured for db/auth, which is the documented behavior until an external Supabase project is configured. LGTM.

@Siumauricio
Siumauricio merged commit ebeeb58 into Dokploy:canary Aug 6, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

new-template size:L This PR changes 100-499 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants