mirror of
https://github.com/Sudo-JHare/FHIRFLARE-IG-Toolkit.git
synced 2025-09-17 18:35:02 +00:00
396 lines
13 KiB
Bash
396 lines
13 KiB
Bash
#!/bin/bash
|
|
|
|
# --- Configuration ---
|
|
REPO_URL_HAPI="https://github.com/hapifhir/hapi-fhir-jpaserver-starter.git"
|
|
REPO_URL_CANDLE="https://github.com/FHIR/fhir-candle.git"
|
|
CLONE_DIR_HAPI="hapi-fhir-jpaserver"
|
|
CLONE_DIR_CANDLE="fhir-candle"
|
|
SOURCE_CONFIG_DIR="hapi-fhir-Setup"
|
|
CONFIG_FILE="application.yaml"
|
|
|
|
# --- Define Paths ---
|
|
SOURCE_CONFIG_PATH="../${SOURCE_CONFIG_DIR}/target/classes/${CONFIG_FILE}"
|
|
DEST_CONFIG_PATH="${CLONE_DIR_HAPI}/target/classes/${CONFIG_FILE}"
|
|
|
|
APP_MODE=""
|
|
CUSTOM_FHIR_URL_VAL=""
|
|
SERVER_TYPE=""
|
|
CANDLE_FHIR_VERSION=""
|
|
|
|
# --- Error Handling Function ---
|
|
handle_error() {
|
|
echo "------------------------------------"
|
|
echo "An error occurred: $1"
|
|
echo "Script aborted."
|
|
echo "------------------------------------"
|
|
exit 1
|
|
}
|
|
|
|
# === MODIFIED: Prompt for Installation Mode ===
|
|
get_mode_choice() {
|
|
echo ""
|
|
echo "Select Installation Mode:"
|
|
echo "1. Lite (Excludes local HAPI FHIR Server - No Git/Maven/Dotnet needed)"
|
|
echo "2. Custom URL (Uses a custom FHIR Server - No Git/Maven/Dotnet needed)"
|
|
echo "3. Hapi (Includes local HAPI FHIR Server - Requires Git & Maven)"
|
|
echo "4. Candle (Includes local FHIR Candle Server - Requires Git & Dotnet)"
|
|
|
|
while true; do
|
|
read -r -p "Enter your choice (1, 2, 3, or 4): " choice
|
|
case "$choice" in
|
|
1)
|
|
APP_MODE="lite"
|
|
break
|
|
;;
|
|
2)
|
|
APP_MODE="standalone"
|
|
get_custom_url_prompt
|
|
break
|
|
;;
|
|
3)
|
|
APP_MODE="standalone"
|
|
SERVER_TYPE="hapi"
|
|
break
|
|
;;
|
|
4)
|
|
APP_MODE="standalone"
|
|
SERVER_TYPE="candle"
|
|
get_candle_fhir_version
|
|
break
|
|
;;
|
|
*)
|
|
echo "Invalid input. Please try again."
|
|
;;
|
|
esac
|
|
done
|
|
echo "Selected Mode: $APP_MODE"
|
|
echo "Server Type: $SERVER_TYPE"
|
|
echo
|
|
}
|
|
|
|
# === NEW: Prompt for Custom URL ===
|
|
get_custom_url_prompt() {
|
|
local confirmed_url=""
|
|
while true; do
|
|
echo
|
|
read -r -p "Please enter the custom FHIR server URL: " custom_url_input
|
|
echo
|
|
echo "You entered: $custom_url_input"
|
|
read -r -p "Is this URL correct? (Y/N): " confirm_url
|
|
if [[ "$confirm_url" =~ ^[Yy]$ ]]; then
|
|
confirmed_url="$custom_url_input"
|
|
break
|
|
else
|
|
echo "URL not confirmed. Please re-enter."
|
|
fi
|
|
done
|
|
|
|
while true; do
|
|
echo
|
|
read -r -p "Please re-enter the URL to confirm it is correct: " custom_url_input
|
|
if [ "$custom_url_input" = "$confirmed_url" ]; then
|
|
CUSTOM_FHIR_URL_VAL="$custom_url_input"
|
|
echo
|
|
echo "Custom URL confirmed: $CUSTOM_FHIR_URL_VAL"
|
|
break
|
|
else
|
|
echo
|
|
echo "URLs do not match. Please try again."
|
|
confirmed_url="$custom_url_input"
|
|
fi
|
|
done
|
|
}
|
|
|
|
# === NEW: Prompt for Candle FHIR version ===
|
|
get_candle_fhir_version() {
|
|
echo ""
|
|
echo "Select the FHIR version for the Candle server:"
|
|
echo "1. R4 (4.0)"
|
|
echo "2. R4B (4.3)"
|
|
echo "3. R5 (5.0)"
|
|
while true; do
|
|
read -r -p "Enter your choice (1, 2, or 3): " choice
|
|
case "$choice" in
|
|
1)
|
|
CANDLE_FHIR_VERSION=r4
|
|
break
|
|
;;
|
|
2)
|
|
CANDLE_FHIR_VERSION=r4b
|
|
break
|
|
;;
|
|
3)
|
|
CANDLE_FHIR_VERSION=r5
|
|
break
|
|
;;
|
|
*)
|
|
echo "Invalid input. Please try again."
|
|
;;
|
|
esac
|
|
done
|
|
}
|
|
|
|
|
|
# Call the function to get mode choice
|
|
get_mode_choice
|
|
|
|
# === Conditionally Execute Server Setup ===
|
|
case "$SERVER_TYPE" in
|
|
"hapi")
|
|
echo "Running Hapi server setup..."
|
|
echo
|
|
|
|
# --- Step 0: Clean up previous clone (optional) ---
|
|
echo "Checking for existing directory: $CLONE_DIR_HAPI"
|
|
if [ -d "$CLONE_DIR_HAPI" ]; then
|
|
echo "Found existing directory, removing it..."
|
|
rm -rf "$CLONE_DIR_HAPI"
|
|
if [ $? -ne 0 ]; then
|
|
handle_error "Failed to remove existing directory: $CLONE_DIR_HAPI"
|
|
fi
|
|
echo "Existing directory removed."
|
|
else
|
|
echo "Directory does not exist, proceeding with clone."
|
|
fi
|
|
echo
|
|
|
|
# --- Step 1: Clone the HAPI FHIR server repository ---
|
|
echo "Cloning repository: $REPO_URL_HAPI into $CLONE_DIR_HAPI..."
|
|
git clone "$REPO_URL_HAPI" "$CLONE_DIR_HAPI"
|
|
if [ $? -ne 0 ]; then
|
|
handle_error "Failed to clone repository. Check Git installation and network connection."
|
|
fi
|
|
echo "Repository cloned successfully."
|
|
echo
|
|
|
|
# --- Step 2: Navigate into the cloned directory ---
|
|
echo "Changing directory to $CLONE_DIR_HAPI..."
|
|
cd "$CLONE_DIR_HAPI" || handle_error "Failed to change directory to $CLONE_DIR_HAPI."
|
|
echo "Current directory: $(pwd)"
|
|
echo
|
|
|
|
# --- Step 3: Build the HAPI server using Maven ---
|
|
echo "===> Starting Maven build (Step 3)..."
|
|
mvn clean package -DskipTests=true -Pboot
|
|
if [ $? -ne 0 ]; then
|
|
echo "ERROR: Maven build failed."
|
|
cd ..
|
|
handle_error "Maven build process resulted in an error."
|
|
fi
|
|
echo "Maven build completed successfully."
|
|
echo
|
|
|
|
# --- Step 4: Copy the configuration file ---
|
|
echo "===> Starting file copy (Step 4)..."
|
|
echo "Copying configuration file..."
|
|
INITIAL_SCRIPT_DIR=$(pwd)
|
|
ABSOLUTE_SOURCE_CONFIG_PATH="${INITIAL_SCRIPT_DIR}/../${SOURCE_CONFIG_DIR}/target/classes/${CONFIG_FILE}"
|
|
|
|
echo "Source: $ABSOLUTE_SOURCE_CONFIG_PATH"
|
|
echo "Destination: target/classes/$CONFIG_FILE"
|
|
|
|
if [ ! -f "$ABSOLUTE_SOURCE_CONFIG_PATH" ]; then
|
|
echo "WARNING: Source configuration file not found at $ABSOLUTE_SOURCE_CONFIG_PATH."
|
|
echo "The script will continue, but the server might use default configuration."
|
|
else
|
|
cp "$ABSOLUTE_SOURCE_CONFIG_PATH" "target/classes/"
|
|
if [ $? -ne 0 ]; then
|
|
echo "WARNING: Failed to copy configuration file. Check if the source file exists and permissions."
|
|
echo "The script will continue, but the server might use default configuration."
|
|
else
|
|
echo "Configuration file copied successfully."
|
|
fi
|
|
fi
|
|
echo
|
|
|
|
# --- Step 5: Navigate back to the parent directory ---
|
|
echo "===> Changing directory back (Step 5)..."
|
|
cd .. || handle_error "Failed to change back to the parent directory."
|
|
echo "Current directory: $(pwd)"
|
|
echo
|
|
;;
|
|
|
|
"candle")
|
|
echo "Running FHIR Candle server setup..."
|
|
echo
|
|
|
|
# --- Step 0: Clean up previous clone (optional) ---
|
|
echo "Checking for existing directory: $CLONE_DIR_CANDLE"
|
|
if [ -d "$CLONE_DIR_CANDLE" ]; then
|
|
echo "Found existing directory, removing it..."
|
|
rm -rf "$CLONE_DIR_CANDLE"
|
|
if [ $? -ne 0 ]; then
|
|
handle_error "Failed to remove existing directory: $CLONE_DIR_CANDLE"
|
|
fi
|
|
echo "Existing directory removed."
|
|
else
|
|
echo "Directory does not exist, proceeding with clone."
|
|
fi
|
|
echo
|
|
|
|
# --- Step 1: Clone the FHIR Candle server repository ---
|
|
echo "Cloning repository: $REPO_URL_CANDLE into $CLONE_DIR_CANDLE..."
|
|
git clone "$REPO_URL_CANDLE" "$CLONE_DIR_CANDLE"
|
|
if [ $? -ne 0 ]; then
|
|
handle_error "Failed to clone repository. Check Git and Dotnet SDK installation and network connection."
|
|
fi
|
|
echo "Repository cloned successfully."
|
|
echo
|
|
|
|
# --- Step 2: Navigate into the cloned directory ---
|
|
echo "Changing directory to $CLONE_DIR_CANDLE..."
|
|
cd "$CLONE_DIR_CANDLE" || handle_error "Failed to change directory to $CLONE_DIR_CANDLE."
|
|
echo "Current directory: $(pwd)"
|
|
echo
|
|
|
|
# --- Step 3: Build the FHIR Candle server using Dotnet ---
|
|
echo "===> Starting Dotnet build (Step 3)..."
|
|
dotnet publish -c Release -f net9.0 -o publish
|
|
if [ $? -ne 0 ]; then
|
|
handle_error "Dotnet build failed. Check Dotnet SDK installation."
|
|
fi
|
|
echo "Dotnet build completed successfully."
|
|
echo
|
|
|
|
# --- Step 4: Navigate back to the parent directory ---
|
|
echo "===> Changing directory back (Step 4)..."
|
|
cd .. || handle_error "Failed to change back to the parent directory."
|
|
echo "Current directory: $(pwd)"
|
|
echo
|
|
;;
|
|
|
|
*) # APP_MODE is Lite, no SERVER_TYPE
|
|
echo "Running Lite setup, skipping server build..."
|
|
if [ -d "$CLONE_DIR_HAPI" ]; then
|
|
echo "Found existing HAPI directory in Lite mode. Removing it to avoid build issues..."
|
|
rm -rf "$CLONE_DIR_HAPI"
|
|
fi
|
|
if [ -d "$CLONE_DIR_CANDLE" ]; then
|
|
echo "Found existing Candle directory in Lite mode. Removing it to avoid build issues..."
|
|
rm -rf "$CLONE_DIR_CANDLE"
|
|
fi
|
|
mkdir -p "${CLONE_DIR_HAPI}/target/classes"
|
|
mkdir -p "${CLONE_DIR_HAPI}/custom"
|
|
touch "${CLONE_DIR_HAPI}/target/ROOT.war"
|
|
touch "${CLONE_DIR_HAPI}/target/classes/application.yaml"
|
|
mkdir -p "${CLONE_DIR_CANDLE}/publish"
|
|
touch "${CLONE_DIR_CANDLE}/publish/fhir-candle.dll"
|
|
echo "Placeholder files and directories created for Lite mode build."
|
|
echo
|
|
;;
|
|
esac
|
|
|
|
# === MODIFIED: Update docker-compose.yml to set APP_MODE and HAPI_FHIR_URL and DOCKERFILE ===
|
|
echo "Updating docker-compose.yml with APP_MODE=$APP_MODE and HAPI_FHIR_URL..."
|
|
DOCKER_COMPOSE_TMP="docker-compose.yml.tmp"
|
|
DOCKER_COMPOSE_ORIG="docker-compose.yml"
|
|
|
|
HAPI_URL_TO_USE="https://fhir.hl7.org.au/aucore/fhir/DEFAULT/"
|
|
if [ -n "$CUSTOM_FHIR_URL_VAL" ]; then
|
|
HAPI_URL_TO_USE="$CUSTOM_FHIR_URL_VAL"
|
|
elif [ "$SERVER_TYPE" = "candle" ]; then
|
|
HAPI_URL_TO_USE="http://localhost:5826/fhir/${CANDLE_FHIR_VERSION}"
|
|
else
|
|
HAPI_URL_TO_USE="http://localhost:8080/fhir"
|
|
fi
|
|
|
|
DOCKERFILE_TO_USE="Dockerfile.lite"
|
|
if [ "$SERVER_TYPE" = "hapi" ]; then
|
|
DOCKERFILE_TO_USE="Dockerfile.hapi"
|
|
elif [ "$SERVER_TYPE" = "candle" ]; then
|
|
DOCKERFILE_TO_USE="Dockerfile.candle"
|
|
fi
|
|
|
|
cat << EOF > "$DOCKER_COMPOSE_TMP"
|
|
version: '3.8'
|
|
services:
|
|
fhirflare:
|
|
build:
|
|
context: .
|
|
dockerfile: ${DOCKERFILE_TO_USE}
|
|
ports:
|
|
EOF
|
|
|
|
if [ "$SERVER_TYPE" = "candle" ]; then
|
|
cat << EOF >> "$DOCKER_COMPOSE_TMP"
|
|
- "5000:5000"
|
|
- "5001:5826"
|
|
EOF
|
|
else
|
|
cat << EOF >> "$DOCKER_COMPOSE_TMP"
|
|
- "5000:5000"
|
|
- "8080:8080"
|
|
EOF
|
|
fi
|
|
|
|
cat << EOF >> "$DOCKER_COMPOSE_TMP"
|
|
volumes:
|
|
- ./instance:/app/instance
|
|
- ./static/uploads:/app/static/uploads
|
|
- ./logs:/app/logs
|
|
EOF
|
|
|
|
if [ "$SERVER_TYPE" = "hapi" ]; then
|
|
cat << EOF >> "$DOCKER_COMPOSE_TMP"
|
|
- ./instance/hapi-h2-data/:/app/h2-data # Keep volume mounts consistent
|
|
- ./hapi-fhir-jpaserver/target/ROOT.war:/usr/local/tomcat/webapps/ROOT.war
|
|
- ./hapi-fhir-jpaserver/target/classes/application.yaml:/usr/local/tomcat/conf/application.yaml
|
|
EOF
|
|
elif [ "$SERVER_TYPE" = "candle" ]; then
|
|
cat << EOF >> "$DOCKER_COMPOSE_TMP"
|
|
- ./fhir-candle/publish/:/app/fhir-candle-publish/
|
|
EOF
|
|
fi
|
|
|
|
cat << EOF >> "$DOCKER_COMPOSE_TMP"
|
|
environment:
|
|
- FLASK_APP=app.py
|
|
- FLASK_ENV=development
|
|
- NODE_PATH=/usr/lib/node_modules
|
|
- APP_MODE=${APP_MODE}
|
|
- APP_BASE_URL=http://localhost:5000
|
|
- HAPI_FHIR_URL=${HAPI_URL_TO_USE}
|
|
EOF
|
|
|
|
if [ "$SERVER_TYPE" = "candle" ]; then
|
|
cat << EOF >> "$DOCKER_COMPOSE_TMP"
|
|
- ASPNETCORE_URLS=http://0.0.0.0:5826
|
|
EOF
|
|
fi
|
|
|
|
cat << EOF >> "$DOCKER_COMPOSE_TMP"
|
|
command: supervisord -c /etc/supervisord.conf
|
|
EOF
|
|
|
|
if [ ! -f "$DOCKER_COMPOSE_TMP" ]; then
|
|
handle_error "Failed to create temporary docker-compose file ($DOCKER_COMPOSE_TMP)."
|
|
fi
|
|
|
|
# Replace the original docker-compose.yml
|
|
mv "$DOCKER_COMPOSE_TMP" "$DOCKER_COMPOSE_ORIG"
|
|
echo "docker-compose.yml updated successfully."
|
|
echo
|
|
|
|
# --- Step 6: Build Docker images ---
|
|
echo "===> Starting Docker build (Step 6)..."
|
|
docker-compose build --no-cache
|
|
if [ $? -ne 0 ]; then
|
|
handle_error "Docker Compose build failed. Check Docker installation and docker-compose.yml file."
|
|
fi
|
|
echo "Docker images built successfully."
|
|
echo
|
|
|
|
# --- Step 7: Start Docker containers ---
|
|
echo "===> Starting Docker containers (Step 7)..."
|
|
docker-compose up -d
|
|
if [ $? -ne 0 ]; then
|
|
handle_error "Docker Compose up failed. Check Docker installation and container configurations."
|
|
fi
|
|
echo "Docker containers started successfully."
|
|
echo
|
|
|
|
echo "===================================="
|
|
echo "Script finished successfully! (Mode: $APP_MODE)"
|
|
echo "===================================="
|
|
exit 0
|