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
| Variable | Default | Purpose |
|---|---|---|
NUXT_APP_URL | http://localhost:3000 | Base for download and magic links |
NUXT_LANGUAGE | en | Interface and e-mail language: en, de, fr, es, it, nl, pl, uk, pt or cs |
NUXT_TIMEZONE | Europe/Berlin | Zone dates are displayed in |
NUXT_STORAGE_PATH | ./storage | Where uploads live |
NUXT_MAX_FILE_SIZE_MB | 2048 | Per-file limit |
NUXT_MAX_FILES_PER_TRANSFER | 50 | Files per transfer |
NUXT_DEFAULT_RETENTION_DAYS | 14 | Pre-selected retention; 0 = no expiry |
NUXT_EXPIRY_WARNING_HOURS | 24 | Lead time on the warning mail; 0 disables |
NUXT_DRAFT_MAX_AGE_HOURS | 24 | When an abandoned upload is swept |
NUXT_SESSION_MAX_AGE_DAYS | 7 | Member session lifetime |
NUXT_GUEST_SESSION_MAX_AGE_HOURS | 12 | Guest 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.
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.