Docker

The published image is multi-architecture — linux/amd64 and linux/arm64 — so it runs on an ARM box as happily as on an ordinary server.

florianstrasser/lokaltransfer:latest

Tags follow each release: 0.1.5, 0.1, 0 and latest.

The database inside the image

The container carries its own MySQL 8 and starts it only when no external database is configured. Set NUXT_MYSQL_HOST and the built-in server never starts at all — no wasted memory, no second copy of your data.

That makes the first run a single command with nothing to set up first, while a real deployment can point at a managed database without carrying a database it does not use.

Volumes

docker run -d \
  --name lokaltransfer \
  -p 3000:3000 \
  -v lokaltransfer-storage:/app/storage \
  -v lokaltransfer-db:/var/lib/mysql \
  -e NUXT_APP_URL=https://transfer.example.com \
  florianstrasser/lokaltransfer:latest

Both are required for anything you intend to keep:

  • /app/storage — the uploaded files.
  • /var/lib/mysql — the built-in database. Omit it when using an external one.

Without them, both live in the container's writable layer and vanish the first time you recreate the container. That is the mistake worth avoiding before it costs you real transfers.

With an external database

docker run -d \
  --name lokaltransfer \
  -p 3000:3000 \
  -v lokaltransfer-storage:/app/storage \
  -e NUXT_APP_URL=https://transfer.example.com \
  -e NUXT_MYSQL_HOST=db.example.com \
  -e NUXT_MYSQL_DATABASE=lokaltransfer \
  -e NUXT_MYSQL_USER=lokaltransfer \
  -e NUXT_MYSQL_PASSWORD=secret \
  -e NUXT_MYSQL_SSL=true \
  florianstrasser/lokaltransfer:latest

If your host offers an internal and an external address for the database, use whichever one the container can actually resolve. They are frequently different, and the internal one often does not resolve from outside the provider's network.

docker compose

services:
  lokaltransfer:
    image: florianstrasser/lokaltransfer:latest
    restart: unless-stopped
    ports:
      - "3000:3000"
    environment:
      NUXT_APP_URL: https://transfer.example.com
      NUXT_ADMIN_EMAIL: you@example.com
      NUXT_ADMIN_PASSWORD: a-long-password
      NUXT_EMAIL_HOST: mail.example.com
      NUXT_EMAIL_USER: noreply@example.com
      NUXT_EMAIL_PASS: secret
    volumes:
      - storage:/app/storage
      - db:/var/lib/mysql

volumes:
  storage:
  db:

Configuration from a file

The entrypoint loads /app/.env if you mount one, so a host panel that only offers a file can still configure the instance. Real environment variables always win over the file, so --env-file and compose environment: keep working as expected.

Health

The image declares a HEALTHCHECK against /api/health, which also verifies the database connection. An instance that cannot reach its database reports unhealthy rather than sitting in a load balancer's rotation serving errors.