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

  1. Open https://your-server-ip:9090 in your browser (Fasten serves HTTPS by default)
  2. Create your account — this is the first and only user account
  3. Navigate to Sources to connect healthcare providers
  4. Search for your provider (e.g., “Kaiser Permanente”, “MyChart”) and authenticate with your patient portal credentials
  5. 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:

StepWhat Happens
SearchFind your provider in Fasten’s directory
AuthenticateLog in to your patient portal via OAuth popup
SyncFasten pulls available FHIR resources (labs, meds, conditions)
DashboardRecords 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_data volume: database files with your health records
  • fasten_cache volume: 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
        }
    }
}

Reverse Proxy Setup

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.

Backup Strategy

Troubleshooting

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.

Comments