Skip to content

Use PostgreSQL

Choose PostgreSQL during the first-run wizard when you want a separate database service or native ticket AI Assistant chat. RatelDesk supports both a bundled PostgreSQL 16 service and an external server.

The target database must be empty for a new installation. Choosing another provider does not migrate an existing SQLite instance.

In the extracted release directory, add a unique password to your protected .env:

RATELDESK_VERSION=0.1.2-beta.17
RATELDESK_POSTGRES_PASSWORD=replace-with-a-long-random-password

Start both Compose files before completing setup:

Terminal window
docker compose --env-file .env -f docker-compose.release.yml \
-f docker-compose.postgres.yml config --quiet
docker compose --env-file .env -f docker-compose.release.yml \
-f docker-compose.postgres.yml up -d

Select PostgreSQL in Storage and enter:

FieldValue
Hostpostgres
Port5432
Databaserateldesk
Usernamerateldesk
PasswordThe value you set in .env
Require TLSUnchecked for this private bundled server

The sidecar persists its data in rateldesk-postgres-data. Keep the overlay in later Compose commands.

Provision an empty database and a dedicated role that can apply the RatelDesk migrations. The initial migration creates the standard uuid-ossp extension; make it available on the server and allow the setup role to create it, or have your database administrator install it first. Setup does not require pgvector.

Start the normal release stack, open /setup and select PostgreSQL. Enter the external host, port, database and credentials. Enable Require TLS when the database endpoint is configured for TLS. Check connectivity from the API container’s network, rather than only from your workstation.

The wizard checks the target before creating its schema. An unrelated non-empty database or an already-initialized RatelDesk database is not accepted as a new installation.

The completed setup stores its database settings in protected bootstrap state. Keep that state and its Data Protection keys with the database backup.

For an unattended first run, the included docker-compose.external-postgres.yml maps these operator inputs:

InputMeaning
RATELDESK_POSTGRES_CONNECTION_STRINGPostgreSQL connection string
RATELDESK_BOOTSTRAP_ADMIN_EMAILFirst administrator email
RATELDESK_BOOTSTRAP_ADMIN_DISPLAY_NAMEAdministrator display name
RATELDESK_BOOTSTRAP_ADMIN_PASSWORDPassphrase of at least 15 characters
RATELDESK_BOOTSTRAP_ORGANIZATION_NAMEInitial organization
RATELDESK_BOOTSTRAP_APPLICATION_URLPublic HTTPS application URL
RATELDESK_BOOTSTRAP_TIME_ZONE_IDOptional IANA time zone; defaults to UTC

Supply the values through protected deployment configuration, start with the base and external overlay, then explicitly invoke:

Terminal window
docker compose --env-file .env -f docker-compose.release.yml \
-f docker-compose.external-postgres.yml exec api \
dotnet /app/Helpdesk.API.dll --initialize-unattended

After initialization, remove the unattended inputs and that bootstrap overlay, then recreate the services with the normal deployment files while preserving all volumes. Startup does not automatically run unattended initialization.

RatelDesk 0.1.2-beta.17 · Reviewed 2026-10-30
Product home · Release downloads · Report a documentation issue