Add Creed self-host template - #1043
Conversation
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.
built with Refined Cloudflare Pages Action⚡ Cloudflare Pages Deployment
|
There was a problem hiding this comment.
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
creedblueprint with a source-build Docker Compose setup. - Added Dokploy
template.tomlvariables/env wiring plus an embedded deployment/setup README via mounts. - Registered the template via per-blueprint
meta.jsonand includedcreed.svgbranding.
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. |
| ports: | ||
| - 3000 |
| build: | ||
| context: https://github.com/connorhpbrn/creed.git | ||
| dockerfile_inline: | |
| [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 = "" | ||
|
|
| { | ||
| "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.
There was a problem hiding this comment.
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.versionis currently a short git SHA, but the build is pinned to a full commit SHA indocker-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 |
| 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"] |
There was a problem hiding this comment.
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.contextpoints at the default branch of the upstream repo, so this template is not reproducible and can break wheneverconnorhpbrn/creedchanges. Sincemeta.jsonalready 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-alpinetag. 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
| FROM node:20-alpine AS builder | ||
| WORKDIR /app |
|
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 Even if the root build passed, the runner stage would still break at HEAD: the Next.js output now lives in context: https://github.com/connorhpbrn/creed.git#e9b096d6d68fef6df336338bc9965a94ab62f75e2. The Fix: move the With exactly those two changes I deployed the template on a live Dokploy instance and it works end to end: the build succeeds, {"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: |
There was a problem hiding this comment.
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.
|
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:
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. |
There was a problem hiding this comment.
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",
|
Re-tested at ba0a906 after the fixes — both issues are resolved:
Deployed on a test instance: build from source completed in ~3 min, container running, |
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
creedtemplate (blueprints/creed/) for self-hosting Creed - a personal context file (creed.md) that AI agents read before answering and propose updates to.CREED_ENCRYPTION_SECRETis auto-generated. Creed requires a real Supabase project (Auth, RLS, realtime, schema pushed viasupabase 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 mountedREADME.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 ifNEXT_PUBLIC_SITE_URLis unset.Test plan
node build-scripts/generate-meta.js --checkpasses (501 templates validated)docker compose build --no-cachesucceeds against the upstream repodocker compose upboots the container;GET /returns 200GET /api/healthreturns 200 withstatus: "degraded"anddb.error: "supabase_admin_not_configured"when Supabase is unset, matching the documented behavior