First Run
Fire Arrow Server is distributed as a pre-built Docker image from the Evoleen Public ACR (Azure Container Registry):
evoleenpublicacr.azurecr.io/fire-arrow-server-azure
Images are tagged with the release version (e.g. 0.0.60) and latest.
License
Fire Arrow Server requires a valid license. Contact Evoleen to obtain one for your deployment.
The simplest way to inject a license into the Docker container is via environment variables:
docker run -p 8080:8080 \
-e FIRE_ARROW_LICENSE_SOURCE=inline \
-e FIRE_ARROW_LICENSE_CONTENT="<your-license-string>" \
-e FIRE_ARROW_LICENSE_DEPLOYMENT_ID="<your-deployment-id>" \
-e FIRE_ARROW_LICENSE_RUNTIME_ENVIRONMENT=nonprod \
evoleenpublicacr.azurecr.io/fire-arrow-server-azure:latest
Alternatively, you can configure the license in your application.yaml (see Licensing for all options).
Running the Default Image
The default image ships with an in-memory H2 database, so you can start exploring immediately without any external dependencies beyond the license:
docker run -p 8080:8080 \
-e FIRE_ARROW_LICENSE_SOURCE=inline \
-e FIRE_ARROW_LICENSE_CONTENT="<your-license-string>" \
-e FIRE_ARROW_LICENSE_DEPLOYMENT_ID="<your-deployment-id>" \
-e FIRE_ARROW_LICENSE_RUNTIME_ENVIRONMENT=nonprod \
evoleenpublicacr.azurecr.io/fire-arrow-server-azure:latest
This starts Fire Arrow Server on port 8080 with REST and GraphQL enabled. When the server is ready you'll see:
A FHIR has been lit on this server
The in-memory database is ephemeral — all data is lost when the container stops. For persistent storage, set up PostgreSQL as described below.
Setting Up PostgreSQL
Fire Arrow Server uses PostgreSQL as its primary data store in production. Any recent version (14+) is supported.
Installing PostgreSQL
macOS (Homebrew)
brew install postgresql@16
brew services start postgresql@16
Ubuntu / Debian
sudo apt update
sudo apt install -y postgresql
sudo systemctl enable --now postgresql
Windows
Download and run the installer from the official PostgreSQL site. The installer includes pgAdmin and a command-line shell.
You can also use a managed PostgreSQL service (e.g. Azure Database for PostgreSQL, AWS RDS, or Google Cloud SQL) — just note the host, port, and credentials for the next step.
Creating the Database
Connect to your PostgreSQL instance as a superuser (e.g. postgres) and run:
CREATE USER hapi WITH PASSWORD 'hapi';
CREATE DATABASE hapi OWNER hapi;
\c hapi
GRANT ALL ON SCHEMA public TO hapi;
This creates a user hapi with password hapi, a database hapi owned by that user, and grants the necessary permissions on the public schema.
On PostgreSQL 15+ the default privileges on the public schema were tightened. The explicit GRANT ALL ON SCHEMA public TO hapi; ensures Fire Arrow Server can create and manage its tables.
Configuring the Datasource
Point Fire Arrow Server at your PostgreSQL instance by passing environment variables to the container:
docker run -p 8080:8080 \
-e FIRE_ARROW_LICENSE_SOURCE=inline \
-e FIRE_ARROW_LICENSE_CONTENT="<your-license-string>" \
-e FIRE_ARROW_LICENSE_DEPLOYMENT_ID="<your-deployment-id>" \
-e FIRE_ARROW_LICENSE_RUNTIME_ENVIRONMENT=nonprod \
-e SPRING_DATASOURCE_URL=jdbc:postgresql://localhost:5432/hapi \
-e SPRING_DATASOURCE_USERNAME=hapi \
-e SPRING_DATASOURCE_PASSWORD=hapi \
-e SPRING_DATASOURCE_DRIVER_CLASS_NAME=org.postgresql.Driver \
evoleenpublicacr.azurecr.io/fire-arrow-server-azure:latest
Alternatively, create an application.yaml file and mount it into the container (see Custom Configuration below):
spring:
datasource:
url: jdbc:postgresql://localhost:5432/hapi
username: hapi
password: hapi
driver-class-name: org.postgresql.Driver
When running the Docker container with --network host or docker-compose, localhost refers to the container itself. Use host.docker.internal (macOS/Windows) or the host's IP address to reach a PostgreSQL instance running on the Docker host.
Custom Configuration
The image supports two mechanisms for overriding the bundled defaults, listed from highest to lowest precedence:
- Environment variables — use Spring Boot's relaxed binding (dots become underscores, uppercase), e.g.
SPRING_DATASOURCE_URL - External config file — mount or copy a YAML file to
/config/application.yaml
Mounting a Configuration File
You can mount a local configuration file into the container:
docker run -p 8080:8080 \
-v ./my-application.yaml:/config/application.yaml:ro \
evoleenpublicacr.azurecr.io/fire-arrow-server-azure:latest
Building a Derived Image
For production deployments, build a derived image that bakes in your configuration:
FROM evoleenpublicacr.azurecr.io/fire-arrow-server-azure:0.0.60
COPY application.yaml /config/application.yaml
This lets you pin a specific version and bundle environment-specific settings (authentication providers, database connection, authorization rules, etc.) directly into the image. Build args and environment variables can be used for values that differ between environments:
FROM evoleenpublicacr.azurecr.io/fire-arrow-server-azure:0.0.60
ARG MY_OIDC_URI
ENV MY_OIDC_URI=${MY_OIDC_URI}
COPY application.yaml /config/application.yaml
Explore the Server
Once the server is up, you have three interfaces available:
Swagger UI
Browse and test every FHIR REST endpoint interactively. See the FHIR REST API overview for details.
http://localhost:8080/fhir/swagger-ui/index.html
GraphQL
Send GraphQL queries via POST. See GraphQL API overview for query types and patterns.
POST http://localhost:8080/fhir/$graphql
You can use any HTTP client, or the built-in GraphQL explorer in the admin UI (see below).
Admin Web UI
Manage and inspect your FHIR server through a browser-based administration interface. See the Web UI overview for a full walkthrough.
http://localhost:8080/admin/
The admin UI provides a GraphQL explorer, resource browser, and configuration overview.
Next Steps
Now that the server is running, head to Minimal Configuration to learn how to configure authentication, authorization, and other features. You may also want to review:
- Configuration Reference - the full reference for
application.yaml - Deployment - production deployment with Docker and PostgreSQL