All configuration is done through the .env file in the root of the selfhosted repo. Sensitive values (passwords, API keys) are stored as Docker secrets in ./secrets/ — see Docker Secrets for details.
| Variable | Description | Default |
|---|
PROJECT_NAME | Docker Compose project name | solyto |
SOLYTO_VERSION | Version tag for solyto images | latest |
These are the domain names pointing to your server. Each service gets its own (sub)domain.
| Variable | Description | Example |
|---|
API_DOMAIN | Domain for the API | api.example.com |
APP_DOMAIN | Domain for the frontend | app.example.com |
DAV_DOMAIN | Domain for CalDAV/CardDAV | dav.example.com |
ACME_EMAIL | Email for Let’s Encrypt certificate notifications | admin@example.com |
| Variable | Description | Default |
|---|
APP_NAME | Application display name | solyto |
APP_URL | Full URL to the API | https://${API_DOMAIN} |
FRONTEND_URL | Full URL to the frontend | https://${APP_DOMAIN} |
APP_ENV | Application environment | production |
APP_DEBUG | Enable debug mode | false |
APP_TIMEZONE | Default application timezone | UTC |
| Variable | Description | Default |
|---|
NODE_ENV | Node.js environment | production |
PUBLIC_API_URL | URL the frontend uses to reach the API | https://${API_DOMAIN} |
PUBLIC_DISABLE_DEV_REQUESTS | Hide the Dev Requests section | true |
PUBLIC_REDIRECT_AFTER_LOGOUT | URL to redirect to after logout | ${APP_URL} |
PUBLIC_LEGAL_NOTICE_URL | Link for the legal notice button | (empty) |
PUBLIC_PRIVACY_URL | Link for the privacy policy button | (empty) |
PUBLIC_TERMS_URL | Link for the terms of service button | (empty) |
Set PUBLIC_DISABLE_DEV_REQUESTS=true to hide the Dev Requests link and disable the route entirely (the default on self-hosted instances, since requests wouldn’t reach the solyto team). Set any of the PUBLIC_*_URL variables to show a legal-notice button linking to your own imprint, privacy policy, or terms.
| Variable | Description | Default |
|---|
MARIADB_VERSION | MariaDB image version | 12 |
POSTGRES_VERSION | PostgreSQL image version | 17 |
REDIS_VERSION | Redis image version | 7.4.1 |
| Variable | Description | Default |
|---|
DB_CONNECTION | Database driver | mariadb |
DB_HOST | MariaDB hostname | mariadb |
DB_PORT | MariaDB port | 3306 |
DB_DATABASE | Database name | api |
Credentials (DB_USER, DB_PASSWORD) are read from Docker secrets (db_user, db_password). The MariaDB root password is read from mariadb_root_password.
| Variable | Description | Default |
|---|
DAV_DB_HOST | PostgreSQL hostname | postgres |
DAV_DB_PORT | PostgreSQL port | 5432 |
DAV_DB_DATABASE | DAV database name | dav |
Credentials are read from Docker secrets (dav_db_user, dav_db_password). The PostgreSQL root password is read from postgres_root_password.
| Variable | Description | Default |
|---|
REDIS_CLIENT | Redis client library | phpredis |
REDIS_HOST | Redis hostname | redis |
REDIS_PORT | Redis port | 6379 |
REDIS_PASSWORD | Redis password | (from Docker secret) |
REDIS_PREFIX | Key prefix for this instance | solyto_ |
| Variable | Description | Default |
|---|
TRUSTED_PROXIES | Trusted proxy IPs (needed when using an external reverse proxy) | (empty) |
| Variable | Description | Default |
|---|
TIMEZONE | Server timezone | UTC |
This affects PHP and queue worker timezone settings.
| Variable | Description | Default |
|---|
AI_BASE_URL | OpenAI-compatible API base URL | (empty — OpenAI default) |
AI_MODEL | Default AI model | gpt-4o-mini |
The API key is stored in the ai_api_key Docker secret. This is only needed if you want to use library recommendations.
| Variable | Description | Default |
|---|
MAILGUN_DOMAIN | Mailgun domain for sending email | (empty) |
MAIL_FROM_ADDRESS | Sender email address | noreply@example.com |
MAIL_FROM_NAME | Sender display name | solyto |
The Mailgun secret is stored in the mailgun_secret Docker secret.
| Variable | Description | Default |
|---|
IMAGE_DRIVER | Image processing backend | intervention |
Options:
intervention — uses the Intervention Image PHP library (default, no extra service needed)
imgproxy — uses the standalone imgproxy service for better performance with large images
When IMAGE_DRIVER=imgproxy, the imgproxy container is started and credentials are read from the imgproxy_key and imgproxy_salt Docker secrets.
| Variable | Description | Default |
|---|
TELEGRAM_DEBUG_CHAT_ID | Chat ID for debug notifications | (empty) |
Telegram bot credentials are stored in Docker secrets (solyto_bot_telegram_token, solyto_bot_webhook_token). See Telegram Bot for setup instructions.
After editing .env, restart the affected services:
Docker Compose detects changes in .env and recreates containers with the new values.