Configuration

Everything is read through Nuxt's runtimeConfig, so one build can be deployed with different settings. Changing a colour, a limit or the database does not need a rebuild — which is what makes a single published Docker image usable by everyone.

See .env.example in the repository for the full list.

The ones that matter most

VariableDefaultPurpose
NUXT_APP_URLhttp://localhost:3000Base for download and magic links
NUXT_LANGUAGEenInterface and e-mail language: en, de, fr, es, it, nl, pl, uk, pt or cs
NUXT_TIMEZONEEurope/BerlinZone dates are displayed in
NUXT_STORAGE_PATH./storageWhere uploads live
NUXT_MAX_FILE_SIZE_MB2048Per-file limit
NUXT_MAX_FILES_PER_TRANSFER50Files per transfer
NUXT_DEFAULT_RETENTION_DAYS14Pre-selected retention; 0 = no expiry
NUXT_EXPIRY_WARNING_HOURS24Lead time on the warning mail; 0 disables
NUXT_DRAFT_MAX_AGE_HOURS24When an abandoned upload is swept
NUXT_SESSION_MAX_AGE_DAYS7Member session lifetime
NUXT_GUEST_SESSION_MAX_AGE_HOURS12Guest session lifetime

NUXT_APP_URL is the one to get right first. Every download link and every magic link is built from it, so if it is wrong in production, every link you send is wrong.

Database

NUXT_MYSQL_HOST=localhost
NUXT_MYSQL_DATABASE=lokaltransfer
NUXT_MYSQL_USER=root
NUXT_MYSQL_PASSWORD=
NUXT_MYSQL_SSL=false

Set NUXT_MYSQL_SSL=true for a managed database that requires it. Leave it false for a local MySQL — a local server presents a self-signed certificate, and turning TLS on without turning off verification produces a "self-signed certificate in certificate chain" failure at startup.

Timestamps are stored and compared in UTC end to end, whatever NUXT_TIMEZONE says. That variable only changes how a date is rendered for a person.

Mail

NUXT_EMAIL_HOST=mail.example.com
NUXT_EMAIL_PORT=465
NUXT_EMAIL_SECURE=true
NUXT_EMAIL_USER=noreply@example.com
NUXT_EMAIL_PASS=
NUXT_EMAIL_FROM=

NUXT_EMAIL_FROM is separate because many providers require the envelope sender to be the authenticated mailbox while you would rather show a friendlier address. It falls back to NUXT_EMAIL_USER.

Set NUXT_EMAIL_TRANSPORT=json to render mail without sending it. Nothing leaves the machine — useful for trying the app out before SMTP is configured, and what the test suite runs under.

Storage

NUXT_STORAGE_PATH must be on a volume that survives redeploys, and belongs in your backups alongside the database. The two are only consistent together: files without rows are unreachable, and rows without files answer 404.

Uploads live outside public/ and are never served statically. Every download goes through a handler that checks the token and the expiry first, and files are always sent as attachments so an uploaded .html cannot execute on your origin.