Skip to content

Add Didacta template - #1080

Open
va360labs wants to merge 1 commit into
Dokploy:canaryfrom
va360labs:add-didacta-template
Open

Add Didacta template#1080
va360labs wants to merge 1 commit into
Dokploy:canaryfrom
va360labs:add-didacta-template

Conversation

@va360labs

Copy link
Copy Markdown

What is this PR about?

New PR of Didacta — a fair-code, self-hosted LMS: course authoring, a public catalog with checkout, enrollment and invitation flows, gamification, certificates, reporting and a module marketplace. Tenants are isolated at the database level with PostgreSQL RLS.

The blueprint ships the app image plus Postgres and Redis, and handles the two things that are easy to get wrong when wiring this by hand:

  • Postgres must be pgvector/pgvector:pg16. The baseline migration runs CREATE EXTENSION "vector", so a plain postgres:16 fails on first boot with no obvious clue.
  • One 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 [[config.domains]] only targets port 3000.

DIDACTA_SETUP_TOKEN is generated with ${password:32}. It protects the creation of the first admin account while the instance is still empty; generating it here means the user opens https://<domain>/setup?token=<DIDACTA_SETUP_TOKEN> instead of digging it out of the container logs.

TENANT_SETTINGS_ENC_KEY is deliberately left unset: the app generates a 32-byte hex key on first boot and persists it in the data volume. Setting it from the blueprint with a helper that does not produce exactly 64 hex characters would break secret encryption (SSO, per-tenant SMTP, Stripe) silently.

Links: didacta.io · docs · source · image ghcr.io/va360labs/didacta-community (public, no login required).

Checklist

Before submitting this PR, please make sure that:

  • I have read the suggestions in the README.md file https://github.com/Dokploy/templates?tab=readme-ov-file#general-requirements-when-creating-a-template
  • I have tested the template in my instance, so the maintainers don't spend time trying to figure out what's wrong. — see Testing below for exactly what was exercised. I don't run a Dokploy instance, so I tested this exact docker-compose.yml with the .env that template.toml generates, and deployed the same stack on another PaaS end to end. The PR preview is the last mile.
  • I have added tests that demonstrate that my correction works or that my new feature works. — not applicable to a template.

node build-scripts/generate-meta.js --check passes (515 templates validated).

Issues related (if applicable)

None.

Testing

Brought up this exact docker-compose.yml with the .env produced from [config.env] (resolving ${domain}, ${password:64} and ${password:32} the way Dokploy does), on Docker Compose v2:

  • First boot applied migrations, enabled pgvector, applied the RLS policies and the role grants, and logged that the runtime connection is derived to the non-superuser role — which is what makes tenant isolation real.
  • GET /healthz and GET /api/v1/setup/status both answered through port 3000, confirming a single domain is all the proxy needs.
  • Creating the first tenant and admin account via POST /setup/init succeeded, and the public catalog and sign-in pages rendered.

The same image and topology were then deployed on a self-hosted Coolify instance (Docker Compose), where all three containers reached healthy and the first-run setup link worked over a real domain — so the app side of this blueprint is verified on a proxy-fronted PaaS, not just locally.

Screenshots or Videos

The course editor of the running instance:

Didacta running

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.
@dosubot dosubot Bot added size:M This PR changes 30-99 lines, ignoring generated files. template New template request labels Aug 12, 2026
@github-actions

github-actions Bot commented Aug 12, 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 2cccad8

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M This PR changes 30-99 lines, ignoring generated files. template New template request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant