captainVersion: 4
services:
$$cap_appname-api:
image: philosowaffle/peloton-to-garmin:api-stable
restart: unless-stopped
environment:
TZ: $$cap_tz
Api__HostUrl: "http://*:8080"
volumes:
- $$cap_appname-api-data:/app/data
- $$cap_appname-api-output:/app/output
caproverExtra:
containerHttpPort: '8080'
notExposeAsWebApp: 'true'
$$cap_appname:
depends_on:
- $$cap_appname-api
image: philosowaffle/peloton-to-garmin:webui-stable
restart: unless-stopped
environment:
TZ: $$cap_tz
Api__HostUrl: "http://srv-captain--$$cap_appname-api:8080"
WebUI__HostUrl: "http://*:8080"
caproverExtra:
containerHttpPort: '8080'
caproverOneClickApp:
variables:
- id: $$cap_tz
label: Timezone
defaultValue: 'Australia/Sydney'
description: Your timezone (e.g., America/New_York, Europe/London, Asia/Tokyo)
validRegex: /.{1,}/
instructions:
start: |-
Peloton to Garmin (P2G) syncs your Peloton workouts to Garmin Connect.
This deployment uses environment variables for configuration - no manual config files needed!
Features:
- Automatically sync Peloton workouts (Bike, Tread, Rower, Strength, Meditation, etc.)
- Upload to Garmin Connect
- Earn Garmin badges and challenge credits
- Convert workouts to JSON/TCX/FIT formats
- Counts towards VO2 Max and Training Stress Scores
Note: After deployment, you'll need to run one command to fix volume permissions (one-time setup).
end: |-
✅ P2G has been deployed!
🔧 ONE-TIME SETUP REQUIRED (Fix Volume Permissions):
SSH into your CapRover server and run these commands:
```bash
docker service scale srv-captain--$$cap_appname-api=0
docker run --rm \
-v captain--$$cap_appname-api-data:/data \
-v captain--$$cap_appname-api-output:/output \
busybox sh -c "chown -R 1015:1015 /data /output && chmod -R 755 /data /output"
docker service scale srv-captain--$$cap_appname-api=1
```
This fixes permissions so the API can write to its data directory (P2G runs as user 1015:1015 per official docs).
⏱️ Wait 30 seconds after running the commands, then access your P2G Web UI at:
🎯 http://$$cap_appname.$$cap_root_domain
📝 Next Steps:
1. Open the web interface
2. Navigate to **Settings**
3. Configure your **Peloton credentials** (email and password)
4. Configure your **Garmin Connect credentials**
5. Set up sync options (workout types, polling interval, etc.)
6. Start syncing your workouts!
🔍 Troubleshooting:
- If WebUI shows "Failed to fetch from API": Check that both services are running
- If API logs show permission errors: Re-run the permission fix commands above
- Check logs in CapRover: Apps → $$cap_appname → Logs
📚 Documentation: https://philosowaffle.github.io/peloton-to-garmin/
💬 Peloton Tag: #PelotonToGarmin
🔐 Note: This Web UI version stores credentials encrypted at rest.
⚙️ Technical Details:
- Uses ASP.NET Core environment variable configuration (Api__HostUrl, WebUI__HostUrl)
- Docker User: p2g:p2g (1015:1015) per official P2G documentation
- API accessible internally at: http://srv-captain--$$cap_appname-api:8080
displayName: Peloton to Garmin (P2G)
isOfficial: false
description: Sync your Peloton workouts to Garmin Connect. Supports Bike, Tread, Rower, Meditation, Strength, and more. Uses environment variables for easy configuration.
documentation: https://philosowaffle.github.io/peloton-to-garmin/
Please tell us what app you'd like to see on CapRover as a one-click app.
This is a free and simple app to sync your Peloton workouts to Garmin. By setting this up as a CapRover one-click-app it'll be even easier for anyone to set up this app to sync their data.
Do you know if there is any official Docker image for the app?
Yes - P2G publishes Docker images to both DockerHub and GitHub Package.
Draft one-click-app yml: