Davvy is deployed as a Dockerized Laravel application.
Supported/common targets:
- Railway
- Coolify
- Generic Docker hosts
Container entrypoint performs:
php artisan app:preflight- Optional DB bootstrap (
migrateand optionaldb:seed) - Laravel caches (
config,route,view) - Starts
php-fpmplusnginxonPORT(default8080)
For PostgreSQL, DB bootstrap is serialized with a PG advisory lock so multi-replica startup does not race.
See full reference: Configuration Reference
Minimum production variables:
APP_ENV=productionAPP_DEBUG=falseAPP_KEY(unique secret, not the local compose dev key)APP_URLAPP_LOCALEAPP_FALLBACK_LOCALEAPP_SUPPORTED_LOCALESDB_CONNECTION=pgsqlDB_HOSTDB_PORTDB_DATABASEDB_USERNAMEDB_PASSWORDSESSION_SECURE_COOKIE=true
Common Davvy feature/runtime vars:
ENABLE_PUBLIC_REGISTRATIONENABLE_OWNER_SHARE_MANAGEMENTENABLE_DAV_COMPATIBILITY_MODEENABLE_CONTACT_MANAGEMENTENABLE_CONTACT_CHANGE_MODERATIONAPP_LOCALEAPP_FALLBACK_LOCALEAPP_SUPPORTED_LOCALESCONTACT_CHANGE_REQUEST_RETENTION_DAYSENABLE_AUTOMATED_BACKUPSBACKUPS_LOCAL_ENABLEDBACKUPS_LOCAL_PATHBACKUPS_S3_ENABLEDBACKUPS_S3_DISKBACKUPS_S3_PREFIXBACKUPS_SCHEDULE_TIMESBACKUPS_TIMEZONEBACKUPS_WEEKLY_DAYBACKUPS_MONTHLY_DAYBACKUPS_YEARLY_MONTHBACKUPS_YEARLY_DAYBACKUPS_RETENTION_DAILYBACKUPS_RETENTION_WEEKLYBACKUPS_RETENTION_MONTHLYBACKUPS_RETENTION_YEARLYRUN_SCHEDULERDAV_LOG_CLIENT_TRAFFICCORS_ALLOWED_ORIGINSCORS_ALLOWED_ORIGIN_PATTERNSCORS_ALLOWED_METHODSCORS_ALLOWED_HEADERSCORS_MAX_AGECORS_SUPPORTS_CREDENTIALSRUN_DB_MIGRATIONSRUN_DB_SEEDDEFAULT_ADMIN_EMAILDEFAULT_ADMIN_PASSWORDTRUSTED_PROXIESMAIL_MAILERMAIL_HOSTMAIL_PORTMAIL_USERNAMEMAIL_PASSWORDMAIL_ENCRYPTIONMAIL_FROM_ADDRESSMAIL_FROM_NAMEONBOARDING_REQUIRE_PUBLIC_EMAIL_VERIFICATIONONBOARDING_SEND_EMAILSONBOARDING_INVITE_EXPIRES_HOURSONBOARDING_VERIFICATION_EXPIRES_HOURSONBOARDING_EXPOSE_LINKS_WITHOUT_MAILER
Note on ENABLE_PUBLIC_REGISTRATION:
- Public registration is ultimately controlled by
app_settingsand admin toggles. - If seeding runs, public registration is initialized to disabled.
Backup scheduler note:
- When
RUN_SCHEDULER=true(default), the container runsphp artisan schedule:workfor periodic jobs (automated backups + milestone horizon roll-forward sync). - If you set
RUN_SCHEDULER=false, you must runphp artisan schedule:runexternally every minute. - When
RUN_QUEUE_WORKER=true(default), the container runsphp artisan queue:workfor queued jobs (including admin backup run/restore operations). - If you set
RUN_QUEUE_WORKER=falsewithQUEUE_CONNECTION != sync, run queue workers externally.
Onboarding mailer note:
- If onboarding should deliver real email links, configure a working mail transport (
MAIL_MAILER=smtpplus SMTP credentials or another non-logmailer) and setONBOARDING_SEND_EMAILS=true. - If no working mail transport is configured, keep
ONBOARDING_SEND_EMAILS=false; otherwise onboarding delivery attempts fail and API fallback-link behavior depends onONBOARDING_EXPOSE_LINKS_WITHOUT_MAILER.
This repository includes railway.toml and production Dockerfile support.
Recommended flow:
- Create Railway project and connect repo.
- Provision PostgreSQL.
- Set environment variables.
- Deploy.
- Optionally scale replicas.
- Verify:
/upreturns 200- logs include
Preflight checks passed. /davis reachable
See checklists:
Davvy supports two Coolify deployment patterns:
Use repository compose.yml as the application definition.
- Create a Docker Compose application from this repository.
- Configure domain + HTTPS in Coolify.
- Configure health check path
/up. - Set required app/service variables (for example:
APP_KEY,SERVICE_URL_APP,POSTGRES_DB,SERVICE_USER_POSTGRES,SERVICE_PASSWORD_POSTGRES). - Keep Coolify UI variable values literal (avoid storing template expressions like
${VAR:-default}in the UI). - Deploy.
- Optionally scale app replicas; keep database topology intentional for your environment.
If you prefer a single-service application definition, you can still deploy from the repository Dockerfile and provide database connectivity via external/PostgreSQL service variables.
See checklists:
docker build -t davvy .
docker run -p 8080:8080 --env-file .env davvyEnsure DB connectivity is available before container startup.
- Keep
SESSION_DRIVER=databasewhen running multiple replicas. - Set
TRUSTED_PROXIES=*(or explicit proxy IPs) behind managed reverse proxies. - Keep
RUN_DB_SEED=falseafter initial bootstrap. - Use HTTPS and stable
APP_KEY. - Set
APP_KEYvia platform secrets and keep it consistent across replicas. - Runtime startup will fail if
APP_ENV=productionandAPP_KEYmatches the local compose development key.
The bundled Nginx config enables:
gzipcompression for common text and font asset types.- Long-lived immutable caching for versioned frontend assets under
/build/assets/*. - Revalidation for
/build/manifest.jsonso new deploys pick up current asset hashes.
Expected cache behavior:
/build/assets/*:Cache-Control: public, immutablewith ~1 year TTL./build/manifest.json:Cache-Control: no-cache, must-revalidate.