Self-Hosting Fasten Health with Docker Compose
What Is Fasten Health?
Fasten Health is a self-hosted personal health record aggregator. It connects to healthcare providers via the FHIR protocol (the healthcare industry standard for data exchange) to pull your medical records — lab results, prescriptions, immunizations, visits — into one private dashboard. Instead of logging into five different patient portals, you query one local database. Your health data never leaves your server.
Updated February 2026: Verified with latest Docker images and configurations.
Prerequisites
- A Linux server (Ubuntu 22.04+ recommended)
- Docker and Docker Compose installed (guide)
- 512 MB of free RAM
- 2 GB of free disk space
- A domain name (optional, for remote access)
Docker Compose Configuration
Create a docker-compose.yml file:
services:
fasten:
image: ghcr.io/fastenhealth/fasten-onprem:v1.1.3
container_name: fasten-health
restart: unless-stopped
ports:
- "9090:8080"
volumes:
- fasten_data:/opt/fasten/db
- fasten_cache:/opt/fasten/cache
environment:
# Log level: trace, debug, info, warn, error
- LOG_LEVEL=info
# JWT signing key — CHANGE THIS to a random 32+ character string
- JWT_ISSUER_KEY=changeme_generate_a_random_string_here
volumes:
fasten_data:
fasten_cache:
Fasten Health uses SQLite internally — no external database required. The application binary is statically compiled in Go and runs in a minimal container.
Start the stack:
docker compose up -d
Initial Setup
- Open
https://your-server-ip:9090in your browser (Fasten serves HTTPS by default) - Create your account — this is the first and only user account
- Navigate to Sources to connect healthcare providers
- Search for your provider (e.g., “Kaiser Permanente”, “MyChart”) and authenticate with your patient portal credentials
- Fasten pulls your records via FHIR — this may take a few minutes for large medical histories
Fasten supports 25,000+ FHIR-enabled healthcare institutions in the US. Search by hospital name, health system, or insurance provider.
Configuration
Connecting Healthcare Providers
Each provider connection authenticates separately via OAuth. Fasten acts as a SMART on FHIR client:
| Step | What Happens |
|---|---|
| Search | Find your provider in Fasten’s directory |
| Authenticate | Log in to your patient portal via OAuth popup |
| Sync | Fasten pulls available FHIR resources (labs, meds, conditions) |
| Dashboard | Records appear in condition-specific dashboards |
Records update when you manually trigger a re-sync. Automatic background sync is planned but not yet implemented.
Condition Dashboards
Fasten organizes records into condition-specific views. If you have diabetes-related records, a diabetes dashboard shows relevant lab results (A1C, glucose), medications, and visit history together. This is generated automatically from your FHIR data — no manual categorization needed.
Data Storage
All data is stored locally in SQLite:
fasten_datavolume: database files with your health recordsfasten_cachevolume: cached provider metadata
No data is sent to external servers. Fasten doesn’t phone home, track usage, or require an internet connection after the initial provider sync.
Reverse Proxy
Nginx Proxy Manager configuration:
- Scheme: https (Fasten serves HTTPS internally)
- Forward Hostname: fasten-health
- Forward Port: 8080
- Enable SSL with Let’s Encrypt
For Caddy:
health.yourdomain.com {
reverse_proxy https://fasten-health:8080 {
transport http {
tls_insecure_skip_verify
}
}
}
Backup
Back up the SQLite database:
docker compose stop fasten
docker run --rm -v fasten_data:/data -v $(pwd):/backup alpine tar czf /backup/fasten-backup.tar.gz /data
docker compose start fasten
Your health records are irreplaceable. Schedule automated backups and store copies offsite.
Troubleshooting
Provider not found in search
Symptom: Your healthcare provider doesn’t appear when searching. Fix: Fasten’s provider directory covers FHIR-enabled US institutions. If your provider isn’t listed, they may not support FHIR, or they may use a parent health system’s portal (try searching for the health system name instead of the individual hospital).
OAuth authentication fails
Symptom: The provider login popup shows an error or redirects back without connecting.
Fix: Ensure your Fasten instance is accessible via HTTPS — many providers require the callback URL to use TLS. Check that your JWT_ISSUER_KEY is set and the container has been restarted after changing it.
Records incomplete after sync
Symptom: Some records are missing after syncing a provider. Fix: Not all providers expose all FHIR resource types. Lab results and medications are most commonly available. Imaging, notes, and full visit records depend on the provider’s FHIR implementation. Re-sync to check for newly available data.
Resource Requirements
- RAM: ~80 MB idle, ~150 MB during sync
- CPU: Low (Go binary, minimal background work)
- Disk: ~100 MB for application, plus data growth based on number of records and providers
Verdict
Fasten Health solves a real problem: your medical records are scattered across multiple patient portals with no unified view. It’s the only self-hosted option that actually connects to healthcare providers via FHIR rather than requiring manual data entry. The dashboard is functional and the setup is straightforward.
The limitation is scope — it’s a record aggregator, not a health tracker. It doesn’t track workouts, weight, or daily metrics. For that, pair it with Endurain (fitness tracking) or wger (workout management). Fasten handles the medical data; other tools handle the daily health data.
Related
Get self-hosting tips in your inbox
Get the Docker Compose configs, hardware picks, and setup shortcuts we don't put in articles. Weekly. No spam.
Comments