Complete sign-up pipeline: email registration via Logto Experience API, SMTP email verification, and self-service trial tenant creation. Layer 1 — Logto config: - Bootstrap Phase 8b: SMTP email connector with branded HTML templates - Bootstrap Phase 8c: enable SignInAndRegister (email+password sign-up) - Dockerfile installs official Logto connectors (ensures SMTP available) - SMTP env vars in docker-compose, installer templates, .env.example Layer 2 — Experience API (ui/sign-in/experience-api.ts): - Registration flow: initRegistration → sendVerificationCode → verifyCode → addProfile (password) → identifyUser → submit - Sign-in auto-detects email vs username identifier Layer 3 — Custom sign-in UI (ui/sign-in/SignInPage.tsx): - Three-mode state machine: signIn / register / verifyCode - Reads first_screen=register from URL query params - Toggle links between sign-in and register views Layer 4 — Post-registration onboarding: - OnboardingService: reuses VendorTenantService.createAndProvision(), adds calling user to Logto org as owner, enforces one trial per user - OnboardingController: POST /api/onboarding/tenant (authenticated only) - OnboardingPage.tsx: org name + auto-slug form - LandingRedirect: detects zero orgs → redirects to /onboarding - RegisterPage.tsx: /platform/register initiates OIDC with firstScreen Installers (install.sh + install.ps1): - Both prompt for SMTP config in SaaS mode - CLI args, env var capture, cameleer.conf persistence Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2.8 KiB
Installer
Deployment Modes
The installer (installer/install.sh) supports two deployment modes:
Multi-tenant SaaS (DEPLOYMENT_MODE=saas) |
Standalone (DEPLOYMENT_MODE=standalone) |
|
|---|---|---|
| Containers | traefik, postgres, clickhouse, logto, cameleer-saas | traefik, postgres, clickhouse, server, server-ui |
| Auth | Logto OIDC (SaaS admin + tenant users) | Local auth (built-in admin, no identity provider) |
| Tenant management | SaaS admin creates/manages tenants via UI | Single server instance, no fleet management |
| PostgreSQL | cameleer-postgres image (multi-DB init) |
Stock postgres:16-alpine (server creates schema via Flyway) |
| Use case | Platform vendor managing multiple customers | Single customer running the product directly |
Standalone mode generates a simpler compose with the server running directly. No Logto, no SaaS management plane, no bootstrap. The admin logs in with local credentials at /.
Compose templates
The installer uses static docker-compose templates in installer/templates/. Templates are copied to the install directory and composed via COMPOSE_FILE in .env:
docker-compose.yml— shared infrastructure (traefik, postgres, clickhouse)docker-compose.saas.yml— SaaS mode (logto, cameleer-saas)docker-compose.server.yml— standalone mode (server, server-ui)docker-compose.tls.yml— overlay: custom TLS cert volumedocker-compose.monitoring.yml— overlay: external monitoring network
SMTP configuration
Both installers (install.sh and install.ps1) prompt for SMTP settings in SaaS mode when the user opts in ("Configure SMTP for email verification?"). SMTP is required for self-service sign-up — without it, only admin-created users can sign in.
Env vars: SMTP_HOST, SMTP_PORT (default 587), SMTP_USER, SMTP_PASS, SMTP_FROM_EMAIL (default noreply@<PUBLIC_HOST>). Passed to the cameleer-logto container. The bootstrap script (Phase 8b) discovers the SMTP connector factory and creates the connector with Cameleer-branded email templates.
CLI args: --smtp-host, --smtp-port, --smtp-user, --smtp-pass, --smtp-from-email (bash) / -SmtpHost, -SmtpPort, -SmtpUser, -SmtpPass, -SmtpFromEmail (PS1). Persisted in cameleer.conf for upgrades/reconfigure.
Env var naming convention
CAMELEER_AGENT_*— agent config (consumed by the Java agent)CAMELEER_SERVER_*— server config (consumed by cameleer-server)CAMELEER_SAAS_*— SaaS management plane configCAMELEER_SAAS_PROVISIONING_*— "SaaS forwards this to provisioned tenant servers"SMTP_*— email delivery config for Logto (consumed by bootstrap, SaaS mode only)- No prefix (e.g.
POSTGRES_PASSWORD,PUBLIC_HOST) — shared infrastructure, consumed by multiple components