Pull pre-built images and try Cannelle in three commands. Or check out the source, run it locally, and bake your own images for deployment.
Not ready to install anything yet? There is a fully working demo you can explore right now — no sign-up, no email address of your own required. It comes pre-loaded with sample data and resets every day, so you can click around freely without worrying about breaking anything.
// how to log in
Enter demo@cannelle.io on the login page and click Send me my magic link. No password, no inbox of your own needed — the link is handled automatically.
The fastest way to see Cannelle running. Pre-built images include everything — the database, both apps, and automatic migrations. No Node.js or PostgreSQL required on your machine.
The docker/ folder ships with an .env.example. Copy it and set these values before starting:
| variable | description |
|---|---|
| BASE_URL | Public URL of the Community app (e.g. https://app.example.com) |
| JWT_SECRET | 32 hex chars — openssl rand -hex 32 |
| HASHID_SALT | 16 hex chars — openssl rand -hex 16 |
| ENCRYPTION_KEY | 32 hex chars — openssl rand -hex 32 |
| ENCRYPTION_SALT | 16 hex chars — openssl rand -hex 16 |
| COMMUNITY_TAG / ATELIER_TAG | Image tag — defaults to latest. Pin to a release (e.g. 1.2.0) for stability. |
For the full variable reference see the configuration docs →
1. go to the docker folder and configure
cd docker
cp .env.example .env
# Edit .env — set your domain, secrets, and SMTP config2. pull images and start
docker compose up -d3. open the app
# Community app → http://localhost:3000
# Atelier portal → http://localhost:3001| service | description |
|---|---|
| db | PostgreSQL 17 — data persisted in a named volume |
| migrate | Runs prisma migrate deploy once on startup, then exits |
| community | Internal staff app on port 3000 |
| atelier | External user portal on port 3001 |
| docker compose up -d | Start all services in the background |
| docker compose down | Stop all services |
| docker compose logs -f community | Tail logs for the Community app |
| docker compose restart community | Restart a single service |
| docker compose pull | Pull the latest images |
Check out the source, run both apps locally with hot reload, and make changes. When you're ready, build your own Docker images and deploy them to your own container repository.
1. clone the repository
git clone https://github.com/cannelleio/community.git
cd cannelle-sveltekit2. install dependencies
npm install3. configure environment
cp .env.example .env
# Edit .env — at minimum set DATABASE_URL and the four secret variables4. generate secrets
openssl rand -hex 32 # JWT_SECRET
openssl rand -hex 16 # HASHID_SALT
openssl rand -hex 32 # ENCRYPTION_KEY
openssl rand -hex 16 # ENCRYPTION_SALT5. generate the Prisma client and run migrations
npm run db:generate
npm run db:migrate6. start dev servers
npm run dev
# Community app → http://localhost:5173
# Atelier portal → http://localhost:5174// tip
Email in development: SMTP is optional. Magic links are printed to the server console if SMTP is not configured.
For the full variable reference — required fields, SMTP, S3, Atelier, and more — see the configuration docs →
| npm run dev | Start dev servers for all workspaces |
| npm run dev --workspace=@cannelle/community | Dev server for Community only |
| npm run check | TypeScript validation across the monorepo |
| npm run svelte-check | Svelte syntax and type checking |
| npm run lint | ESLint |
| npm run format | Prettier auto-format |
| npm run test | Run all tests |
| npm run build | Production build for all packages and apps |
Once you're happy with your changes, build production images and push them to your registry. Use the same Docker Compose setup to deploy.
npm run build
# Build and tag images
docker build -f docker/community.Dockerfile -t your-registry/cannelle-community:latest .
docker build -f docker/atelier.Dockerfile -t your-registry/cannelle-atelier:latest .
# Push and deploy
docker push your-registry/cannelle-community:latest
docker push your-registry/cannelle-atelier:latestCannelle requires PostgreSQL 17. The schema is managed with Prisma. When using Docker Compose, migrations run automatically on startup. For an external or managed database, run them once manually before your first deploy.
DATABASE_URL="postgresql://user:password@your-host:5432/cannelle?schema=public" \
npx prisma migrate deploy --schema=packages/core/prisma/schema.prisma| npm run db:generate | Regenerate the Prisma client after schema changes |
| npm run db:migrate | Apply pending migrations to the database |
| npm run db:push | Push schema directly (dev only — skips migration history) |
| npm run db:studio | Open Prisma Studio to browse data in a browser UI |
We recommend Docker Compose with a reverse proxy. It handles TLS termination, restarts on failure, and keeps the database isolated behind the compose network. The checklist below covers everything to address before going live.
docker compose -f docker-compose.yml -f docker-compose.proxy.yml up -dThe proxy compose file adds Nginx with automatic Let's Encrypt certificates. Point your domain to the server, set BASE_URL in your .env, and you're done.
Domain and DNS — Point your domain (e.g. app.example.com) to your server's IP address before starting.
TLS / HTTPS — Run behind Nginx, Caddy, or Traefik for HTTPS. The proxy compose file includes a Let's Encrypt config.
Secrets management — Use Docker secrets or a secrets manager — never commit your .env to version control.
Database backups — Schedule automated pg_dump or use your cloud provider's managed backup feature.
Upload persistence — Always mount the uploads volume. Files are lost on container restart without it.
S3 for file storage — Consider S3 over local storage for durability and scalability in production.
Resource allocation — Puppeteer (PDF generation) requires ~512 MB RAM. Allocate at least 1 GB to each app container.
WebSocket support — Ensure your reverse proxy forwards upgrade headers for the Community app WebSocket connection.
server {
listen 443 ssl;
server_name app.example.com;
ssl_certificate /etc/letsencrypt/live/app.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/app.example.com/privkey.pem;
location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}If you prefer not to use Docker in production, build the apps and run them directly with Node under PM2 or systemd.
npm install
npm run db:generate
npm run db:migrate
npm run build
# Start Community app
node apps/community/build/index.js
# Start Atelier portal (separate process / PM2 / systemd)
node apps/atelier/build/index.jsThe full documentation covers architecture, API reference, configuration, and advanced deployment options.