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.yamland 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,.tcxor.gpxfiles yourself. Importing from Strava is still fully supported.
1. Stop your containers
Section titled “1. Stop your containers”> docker compose stop2. Keep your config directory mounted
Section titled “2. Keep your config directory mounted”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.
3. Update docker-compose.yml
Section titled “3. Update docker-compose.yml”Point both containers at the new image
The Docker image was renamed. Point both the app and the daemon container to the new image:
services: app: image: robiningelbrecht/dreeve:latest # or: ghcr.io/dreeveapp/dreeve:latest
daemon: image: robiningelbrecht/dreeve:latest # or: ghcr.io/dreeveapp/dreeve:latestAdd 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.
volumes: # ... keep your existing volumes as they are, and add: - ./watch:/var/www/watchA full example lives on the installation page.
4. Add the new environment variables
Section titled “4. Add the new environment variables”Add these to your .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=adminADMIN_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.
5. Pull the new image and migrate
Section titled “5. Pull the new image and migrate”> docker compose pull> docker compose up -dThe 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:
> docker compose logs -f appNow generate your admin password hash, put it in .env, and recreate the containers so they pick it up:
> docker compose exec app bin/console security:hash-password> docker compose up -dLog in at /admin and verify that your settings were migrated correctly.
6. Clean up the old configuration
Section titled “6. Clean up the old configuration”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:
volumes: - ./config:/var/www/config/app # <-- delete this lineThen recreate the containers and delete your local config directory. From here on, config.yaml is ignored:
everything is edited in the admin panel.
> docker compose up -d7. 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 (
imgSrcon gear maintenance components and on gear) is dropped. Upload the images again in the admin panel. - Purchase prices. The prices you configured under
gearinconfig.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.
8. Run an import
Section titled “8. Run an import”> docker compose exec app bin/console app:import:files> docker compose exec app bin/console app:import:stravaWhere did my configuration go?
Section titled “Where did my configuration go?”| v4 | v5 |
|---|---|
config.yaml → general, appearance, metrics, zwift, import | Admin panel → Settings |
config.yaml → dashboard | Admin panel → Dashboard |
config.yaml → integrations (AI, notifications) | Admin panel → Settings → Integrations |
config.yaml → daemon (cron schedules) | Admin panel → Settings → Daemon |
gear-maintenance.yaml | Admin panel → Gear → Gear maintenance |
| Custom gear in YAML | Admin panel → Gear |
config.yaml → gear (purchase prices) | Admin panel → Gear, not migrated |
imgSrc images in YAML | Admin panel, re-uploaded, not migrated |
Other things worth knowing
Section titled “Other things worth knowing”- The database file was renamed from
strava.dbtodreeve.db. An existingstrava.dbkeeps 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_MODEtofileslater on. Activities already imported from Strava stay where they are.