Skip to main content

Database

Dyma uses PostgreSQL 16 (Hetzner-hosted in production) with Prisma ORM in dyma-api. Redis backs realtime pub/sub, rate limits, and BullMQ workers.

Local development​

cd dyma-api
docker compose up -d
cp .env.example .env
npx prisma migrate dev
npx prisma db seed
npm run start:dev

Default local ports (when host ports conflict):

ServiceURL
Postgrespostgresql://dyma:dyma@localhost:5434/dyma
Redisredis://localhost:6380
APIhttp://localhost:4000/v1
Swaggerhttp://localhost:4000/docs

Schema domains​

DomainTablesPurpose
Identityusers, wallets, user_emails, oauth_accountsWallet-first auth; encrypted email
RBACroles, permissions, role_permissions, user_roles, project_membersPlatform and project roles
Platform configplatform_settings, feature_flags, platform_credentialsAdmin-managed keys (AES-256-GCM)
Catalogtask_types, project_categories, quest_categories, tagsDynamic task catalog
Pricingplans, subscriptions, usage_countersPlans, quotas, billing
Contentprojects, campaigns, questsProject → Campaign → Quest
Submissionssubmissions, verification_attempts, moderation_queueVerification state machine
Filesfiles, submission_filesHetzner S3 metadata
SEO / OGseo_profiles, og_templates, og_assetsPer-entity SEO and OG renders
AIai_providers, ai_prompt_templates, ai_generation_logsAdmin prompts (no PII in logs)
API accessapi_keysHashed project/platform keys
Auditaudit_logsCredential rotation, admin actions
Notificationsnotification_preferences, notification_outboxSES email queue

Migrations​

CommandWhen
npx prisma migrate devLocal schema changes
npx prisma migrate deployStaging / production (Hetzner)
npx prisma db seedSeed plans, 67 task types, roles, default OG template

Seed data​

  • Plans: Free, Starter, Growth, Pro, Enterprise
  • Task types: imported from @dyma-io/shared TASK_TYPE_CATALOG
  • Roles: super_admin, dyma_moderator, project_admin, project_moderator
  • OG template: default 1200×630 layout with non-disableable Dyma logo

Production operations (Hetzner)​

  • TLS required for Postgres connections
  • App DB user with least privilege (no superuser)
  • Daily backups: Hetzner snapshots + pg_dump to object storage
  • Optional connection pooling via PgBouncer or Prisma Accelerate
  • Redis key namespaces: cache:, ratelimit:, pubsub:, queue:

Environment variables​

See dyma-api/.env.example for DATABASE_URL, REDIS_URL, JWT_SECRET, CREDENTIALS_MASTER_KEY, and integration fallbacks.