Skip to main content
VoicEra ships with working defaults so the stack starts on the first try. They are development defaults. This page lists all of them and what each one protects.

There is no default user

No seeded account, no default login. The first POST /users/signup creates the user, an organisation, and a super_admin membership. Whoever signs up first owns the deployment — do it immediately after starting.

Generated secrets

make application-up (which wraps ./scripts/start-application-services.sh) generates these into .env when blank, and never overwrites an existing value. Generate by hand:
PROVIDER_AUTH_ENCRYPTION_KEY is one-way. There is no recovery path and no re-encryption tool: rotating it orphans every stored credential, and each organisation must re-enter every provider key. Back it up with the same care as the database.
If SECRET_KEY is blank, the API does not fail — apps/api/app/auth.py logs a warning and generates a temporary key at import. Tokens then die on every restart, and separate replicas reject each other’s. Always set it.

Shipped defaults

These are in .env.example and docker-compose.yaml. Change every one before exposing anything. MONGODB_USER and MONGODB_PASSWORD are used twice — as the PostgreSQL superuser and as the FerretDB credentials. Changing them changes both.
Changing database credentials after the volume exists does not update the PostgreSQL user. Either set them before the first start, or change the password inside Postgres as well.

Other defaults worth knowing

Full list in Environment variables.

Before you expose this

  • Signed up the first user
  • Changed MONGODB_PASSWORD
  • Changed MINIO_ROOT_PASSWORD and the matching access keys
  • Changed REDIS_PASSWORD
  • Confirmed all three generated secrets are non-empty
  • Backed up PROVIDER_AUTH_ENCRYPTION_KEY somewhere safe
  • Stopped publishing the MinIO console publicly
  • Put TLS in front of the API and runtime
Full guidance: Security hardening.