Skip to content

Migrating from v4 to v5

v5 introduces a complete rebranding from “Statistics for Strava” to Dreeve. Next to the rename, two things changed that affect every existing installation:

  • Configuration moved out of config.yaml and into the admin panel. Your settings now live in the database and are edited from the browser.
  • Strava is no longer required. The new default import mode is files, where you supply .fit, .tcx or .gpx files yourself. Importing from Strava is still fully supported.
Terminal window
> docker compose stop

On its first start, v5 reads your config.yaml and gear-maintenance.yaml and writes every setting into the database.

So for now, do not delete config.yaml and do not remove the ./config volume. You clean those up in step 6, after the migration has run.

Point both containers at the new image

The Docker image was renamed. Point both the app and the daemon container to the new image:

docker-compose.yml
services:
app:
image: robiningelbrecht/dreeve:latest
# or: ghcr.io/dreeveapp/dreeve:latest
daemon:
image: robiningelbrecht/dreeve:latest
# or: ghcr.io/dreeveapp/dreeve:latest

Add the watch volume (only if you want to import files)

If you plan to use IMPORT_MODE=files, add the new ./watch volume to both containers. If you stick to importing from Strava, skip this and move on to step 4.

docker-compose.yml
volumes:
# ... keep your existing volumes as they are, and add:
- ./watch:/var/www/watch

A full example lives on the installation page.

Add these to your .env:

.env
# Existing Strava users want "stravaApi" here, it keeps your current import behaviour.
# The default is "files".
IMPORT_MODE=stravaApi
# The URL you reach the app on. Include the port if you use one.
APP_URL=http://localhost:8080
# Used to sign the admin session cookie. Set it to any long random string.
APP_SECRET=change-me-to-a-long-random-string
# Admin panel credentials. Leave the hash empty for now, you generate it in step 5.
ADMIN_USERNAME=admin
ADMIN_PASSWORD_HASH=''

Your STRAVA_CLIENT_ID, STRAVA_CLIENT_SECRET and STRAVA_REFRESH_TOKEN stay exactly as they are, and PUID and PGID are unchanged too. PROXY_HOST and PROXY_PORT no longer do anything and can be deleted.

Terminal window
> docker compose pull
> docker compose up -d

The app container runs the database migrations on startup. This is where your YAML configuration is copied into the database, so watch the logs and make sure it finishes without errors:

Terminal window
> docker compose logs -f app

Now generate your admin password hash, put it in .env, and recreate the containers so they pick it up:

Terminal window
> docker compose exec app bin/console security:hash-password
> docker compose up -d

Log in at /admin and verify that your settings were migrated correctly.

Once you have confirmed your settings are in the admin panel, the YAML files have done their job. Remove the config volume from both containers in docker-compose.yml:

docker-compose.yml
volumes:
- ./config:/var/www/config/app # <-- delete this line

Then recreate the containers and delete your local config directory. From here on, config.yaml is ignored: everything is edited in the admin panel.

Terminal window
> docker compose up -d

7. Re-upload your images and re-enter your purchase prices

Section titled “7. Re-upload your images and re-enter your purchase prices”

Two things are not carried over by the migration and have to be set up again in the admin panel:

  • Images. Every image you referenced from YAML (imgSrc on gear maintenance components and on gear) is dropped. Upload the images again in the admin panel.
  • Purchase prices. The prices you configured under gear in config.yaml (on gear, custom gear and recording devices) are not migrated. Enter them again in the admin panel, on the gear or recording device settings pages.
Terminal window
> docker compose exec app bin/console app:import:files
v4v5
config.yamlgeneral, appearance, metrics, zwift, importAdmin panel → Settings
config.yamldashboardAdmin panel → Dashboard
config.yamlintegrations (AI, notifications)Admin panel → Settings → Integrations
config.yamldaemon (cron schedules)Admin panel → Settings → Daemon
gear-maintenance.yamlAdmin panel → Gear → Gear maintenance
Custom gear in YAMLAdmin panel → Gear
config.yamlgear (purchase prices)Admin panel → Gear, not migrated
imgSrc images in YAMLAdmin panel, re-uploaded, not migrated
  • The database file was renamed from strava.db to dreeve.db. An existing strava.db keeps working, you do not have to rename anything.
  • The docs moved to docs.dreeve.app, and the repository to dreeveapp/dreeve.
  • Strava is now optional, not central. If you would rather stop dealing with API keys and rate limits, you can switch IMPORT_MODE to files later on. Activities already imported from Strava stay where they are.