Skip to content

Installation

  • Docker and Docker Compose (v2+)
  • An LLM provider — either an Ollama instance running on your network, or a Claude API key
Terminal window
git clone https://github.com/giovi321/asclepius.git
cd asclepius
# Start the application
docker compose up -d

The container boots with sensible defaults; no settings.yaml is required up front. Open http://localhost:8070, complete the first-launch wizard, then configure your LLM provider, OCR settings, and other options from the Settings page in the webui. Saved settings are persisted to ./data/settings.yaml (the host-side bind mount of /data/config/). See Configuration for the full reference of every option you can tune.

This starts two services from the same image:

  • asclepius-core — the full application (admin, pipeline, settings, doctor-share admin) on port 8070 (mapped from container port 8000). Keep this one on the LAN.
  • asclepius-share — the same image started with ASCLEPIUS_MODE=share. Mounts only the doctor-share routes (/api/share/* plus the /share/... SPA pages); every admin or patient route returns 404. Bind it to a public TLS proxy if you want outside doctors to reach a shared record. Default host port 8071. See Doctor shares → Publishing the share surface.

If you do not plan to expose share access to the internet, you can simply leave the share service running on 127.0.0.1:8071 (no harm done), or remove it from docker-compose.yml. The core service is fully functional on its own.

Each container includes:

  • Python 3.13 + FastAPI backend
  • Pre-built React frontend (served as static files)
  • Tesseract OCR with English, Italian, German, French, and Spanish language packs

You can set environment variables in a .env file alongside docker-compose.yml, or directly in the compose file:

Application env vars are prefixed with ASCLEPIUS_. The TZ variable is a plain Linux timezone name consumed by the container.

VariableDescriptionDefault
ASCLEPIUS_SECRET_KEYSession signing key (change in production!)change-me-in-production
ASCLEPIUS_ANTHROPIC_API_KEYPopulates the Claude credential/provider api_key if one exists
ASCLEPIUS_OLLAMA_URLPopulates the Ollama credential/provider base_url if one exists
ASCLEPIUS_GOOGLE_VISION_KEYPopulates ocr.google_vision_key and flips cloud_ocr_enabled on
ASCLEPIUS_COOKIE_SECURETruthy value forces Secure cookies (set behind HTTPS)false
ASCLEPIUS_CORS_ORIGINSComma-separated list of allowed CORS origins
ASCLEPIUS_VAULT_PATHOverrides vault.root_path and all sub-paths/vault
ASCLEPIUS_DB_PATHOverrides database.path/vault/asclepius.sqlite
ASCLEPIUS_CONFIG_PATHPath to settings.yamlconfig/settings.yaml
ASCLEPIUS_ENVdevelopment or production (affects log formatting)production
ASCLEPIUS_MODEcore (full app) or share (public doctor-share surface only)core
ASCLEPIUS_PORTHost port for asclepius-core (LAN-only)8070
ASCLEPIUS_SHARE_PORTHost port for asclepius-share (publishable behind TLS)8071
ASCLEPIUS_SHARE_PUBLIC_URLPublic origin pinned into every share link the admin copies (e.g. https://med.example.com). Required for split-host deployments; leave empty when admin and doctor reach Asclepius on the same hostname.""
FORWARDED_ALLOW_IPSuvicorn trust list for X-Forwarded-* headers. * accepts any source (safe inside a private Docker network); override to your reverse-proxy’s IP for stricter defaults.*
TZContainer timezone (IANA timezone name)Europe/Zurich

Example .env file:

ASCLEPIUS_SECRET_KEY=your-random-secret-key-at-least-32-chars
ASCLEPIUS_ANTHROPIC_API_KEY=sk-ant-api03-...
TZ=Europe/Zurich

Unprefixed names (SECRET_KEY, ANTHROPIC_API_KEY, etc.) are not read by the backend. If your orchestration tooling exposes those, map them to the ASCLEPIUS_-prefixed names in docker-compose.yml via environment: substitution.

If you run Ollama on the same machine as Asclepius, add an Ollama entry to llm.providers:

credentials:
- id: "cred-ollama-main"
name: "Ollama (host)"
type: "ollama"
base_url: "http://host.docker.internal:11434" # Docker Desktop
# base_url: "http://192.168.1.100:11434" # Or use the host IP
max_concurrent: 1
llm:
providers:
- id: "ollama-1"
type: "ollama"
name: "Qwen on Ollama"
enabled: true
priority: 1
credential_id: "cred-ollama-main"
model: "qwen2.5"
timeout: 120

If Ollama runs on a different machine, use that machine’s IP or hostname. Vision-LLM providers reference the same credential, see LLM & OCR Configuration for the Vision-LLM flow.

The default docker-compose.yml mounts two directories:

Host PathContainer PathPurpose
./vault/vaultAll documents, organized files, and the SQLite database
./config/configsettings.yaml configuration file
  1. Open http://localhost:8070
  2. On first launch (no users in the database), a setup wizard appears
  3. Create your admin account (username, password, display name)
  4. Create your first patient profile, pre-filled with your display name, with optional date of birth and sex
  5. After completing the wizard, you are automatically logged in and redirected to the dashboard

For development, you can run the backend and frontend separately. See Development Setup for details.