Compare commits

..
31 Commits
Author SHA1 Message Date
admin fad6d3913e Merge branch 'develop' into 'main'
v3.4 updates

See merge request signalytic/client-external/streamline/streamline-emr!28
2026-08-28 11:04:49 +00:00
admin 4578b8cd30 removed unused vars 2026-08-28 13:31:22 +03:00
admin 119908dfec - review cleanups 2026-08-28 13:04:44 +03:00
adminandGitLab Duo d2a4558a39 Apply 1 suggestion(s) to 1 file(s)
Co-authored-by: GitLab Duo <gitlab-duo@gitlab.com>
2026-08-28 09:48:30 +00:00
adminandGitLab Duo 605702f19f Apply 1 suggestion(s) to 1 file(s)
Co-authored-by: GitLab Duo <gitlab-duo@gitlab.com>
2026-08-28 09:45:55 +00:00
adminandGitLab Duo d04fd97791 Apply 1 suggestion(s) to 1 file(s)
Co-authored-by: GitLab Duo <gitlab-duo@gitlab.com>
2026-08-28 09:45:28 +00:00
adminandGitLab Duo d8da3f11eb Apply 1 suggestion(s) to 1 file(s)
Co-authored-by: GitLab Duo <gitlab-duo@gitlab.com>
2026-08-28 09:42:19 +00:00
admin 9f5573b5c9 Merge branch 'ft-3.4' into 'develop'
StreamlinEMR v3.4

See merge request signalytic/client-external/streamline/streamline-emr!27
2026-08-28 09:12:43 +00:00
admin b9c59fede7 - streamline-emr printing bugfixes
- updated version
2026-08-28 11:34:11 +03:00
admin ae235109ab - updated streamline-image tag
- updated package version
- edit source image tags
2026-05-22 10:44:14 +03:00
alec.turner 207bc3a600 Merge branch 'vm-3.2-updates' into 'develop'
Vm 3.2 updates

See merge request signalytic/client-external/streamline/streamline-emr!24
2026-05-08 18:31:05 +00:00
root 28fb0e5c53 bump image and version to 3.2; use latest hosted-app-utils 2026-05-07 16:46:56 +00:00
adminandroot fde938dc9d updated package script 2026-05-07 16:46:56 +00:00
adminandroot 52d336ae20 added clientappctl for app-dev-updates 2026-05-07 16:46:56 +00:00
admin 9010781c60 Merge branch 'ft-streamline-updates' into 'develop'
release-3.1

See merge request signalytic/client-external/streamline/streamline-emr!23
2026-05-06 09:33:26 +00:00
conrad96 40bff8a89d - updated v3.1 image tags
- removed residual scripts
- updated gitignore
2026-04-29 12:39:06 +03:00
alec.turner 0c22190528 Merge branch 'update-3' into 'main'
update image to v3

See merge request signalytic/client-external/streamline/streamline-emr!22
2026-04-17 19:51:38 +00:00
root ad69af376f update image to v3
streamline-emr v3 -> streamlinehealth/streamline:signalytic (79c61263b626)
statistics v3 -> streamlinehealth/streamline:statistics (c4ae505ffef0)
2026-04-17 18:51:42 +00:00
alec.turner 088687ba73 Merge branch 'update-2.7' into 'main'
Release 2.7

See merge request signalytic/client-external/streamline/streamline-emr!20
2025-04-28 20:29:56 +00:00
root 75183da725 update version to 2.7
- streamline image updated to include minor bug fixes
2025-04-28 15:39:01 +00:00
alec.turner 3d2844a59b Merge branch 'update-2.6' into 'main'
Release 2.6

See merge request signalytic/client-external/streamline/streamline-emr!19
2025-04-25 14:41:33 +00:00
root 2c1067c1ae update to version v2.6
- updated streamline image to fix issue with missing database migrations
2025-04-24 21:59:11 +00:00
alec.turner 113d8ba7a8 Merge branch 'develop' into 'main'
Release 2.5

See merge request signalytic/client-external/streamline/streamline-emr!18
2025-04-23 15:05:00 +00:00
alec.turner 9857664bfd Merge branch 'update_statistics_image' into 'develop'
update statistics image and bump version to 2.5

See merge request signalytic/client-external/streamline/streamline-emr!17
2025-04-23 14:04:05 +00:00
root 375bad1f1a update streamline and statistics images
The previous statistics image (2.5-rc1) was replaced with a new version 2.5-rc2.
Version 2.5 is specified in the compose file and currently matches 2.5-rc2. The
streamline-emr image is also updated, now specifying version 2.5. For
consistency, the redis image is re-tagged with 2.5 as well, but the image itself
has not been changed.
2025-04-22 18:13:09 +00:00
root a738c4bb37 update statistics image and bump version to 2.5
The statistics image is updated to the latest available as of 2025-04-22, image
ID e0705e6cb218. This image was retagged with v2.5. The version is also updated
in the config file, now 2.5.
2025-04-22 16:07:39 +00:00
alec.turner 6084f7d6cb Merge branch 'develop' into 'main'
Release 2.4

See merge request signalytic/client-external/streamline/streamline-emr!16
2025-04-11 18:52:49 +00:00
alec.turner 0b68ff9e15 Merge branch '5-statistics-service-overwrites-script-used-for-updates' into 'develop'
Resolve "statistics service overwrites script used for updates"

Closes #5

See merge request signalytic/client-external/streamline/streamline-emr!15
2025-04-11 18:46:18 +00:00
root 77bbb74ebd add helper script build-install-local.sh
This helper script is used to build and install an 'app-only' version of the
package onto the local system. This is intendend to be used on the VM as a way
to quickly test new updates to the configuration files using images already
available on the system. This is MUCH faster than packaging with images.
2025-04-11 17:54:39 +00:00
root bd0919a538 update statistics image to v2.4 and bump config version to v2.4
The updated statistics image now pulls data from the database once per day, but
attempts to upload hourly to prevent large delays due to poor network
connectivity.
2025-04-11 17:53:07 +00:00
alec.turner aa7b64e0b9 remove volumes from statistics service and move environment variables to compose
Previously, two volumes were bound to the statistics service. Both are removed
here. The first volume was a .env file, whose contents are now moved to the
compose file under the 'environment' keyword. The second, enabling persistent
storage for the /app folder, also caused the crucial 'fetch_and_update.php' to
be overwritten. Persistent storage is not currently necessary within this
service.
2025-04-09 16:09:46 -07:00
9 changed files with 192 additions and 90 deletions
+1
View File
@@ -1,3 +1,4 @@
build-packages
.local
vendor/
.vscode/
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "streamline-emr",
"org": "streamline",
"version": "2.3",
"version": "3.4",
"platforms": [
"linux/arm64"
]
+1 -1
View File
@@ -1 +1 @@
FROM streamlinehealth/streamline:signalytic
FROM streamline:signalytic_latest
-62
View File
@@ -1,62 +0,0 @@
#!/bin/bash
#
# Copyright (C) Wendepunkt Medical Innovations, Inc - All Rights Reserved.
# Unauthorized copying of this file, via any medium is strictly prohibited.
# Proprietary and confidential
#
# For information: dev@signalytic.ca
#
#
# Install the streamline-emr application
#
# The caller of this script must check the exit value and possibly do a
# roll-back if it is non-zero. If the exit value is non-zero services have not
# been restarted.
#
# Note: This version resets data from v1 installations
LOCATION="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
if [ "$EUID" -ne 0 ]
then echo "Please run as root"
exit 1
fi
set -e
APP_SLUG="streamline_emr"
ORG_SLUG="streamline"
INSTALL_ROOT="/var/signalytic/clientapps/${ORG_SLUG}/${APP_SLUG}"
VERSION_FILE="${INSTALL_ROOT}/version"
DATA_ROOT="${INSTALL_ROOT}/data"
# stop the application (if installed)
if [ -f ${INSTALL_ROOT}/stop ]; then
${INSTALL_ROOT}/stop
fi
# reset data for any v1 or v2.0 installations
if grep -q "^1." ${VERSION_FILE} || grep -q "^2.0" ${VERSION_FILE}; then
echo "demo installation detected (v$(cat ${VERSION_FILE})) - resetting data"
rm -rf ${DATA_ROOT}
fi
# copy root files (if present)
if [ -d "${LOCATION}/root" ] && [ -n "$(ls -A ${LOCATION}/root)" ]; then
echo "importing root files"
cp -rfv $LOCATION/root/* /
fi
# import docker images (if present)
for f in $(find $LOCATION/images -name "*.img" 2>/dev/null);do
echo "importing docker image: $f"
docker load -i $f
done
for f in $(find $LOCATION/images -name "*.img.xz" 2>/dev/null);do
echo "importing docker image: $f"
xz -d -c $f | docker load
done
# start the application
${INSTALL_ROOT}/start
+1 -2
View File
@@ -5,6 +5,5 @@ LOCATION="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
CONFIG=${CONFIG:-${LOCATION}/config.json}
SRC=${SRC:-${LOCATION}/src}
BUILD_DIR=${BUILD_DIR:-${LOCATION}/build-packages}
INSTALL_SCRIPT=${LOCATION}/install.sh
${LOCATION}/hosted-app-utils/package ${CONFIG} ${SRC} ${INSTALL_SCRIPT} output=${BUILD_DIR} $@
${LOCATION}/hosted-app-utils/package ${CONFIG} ${SRC} output=${BUILD_DIR} $@
+171
View File
@@ -0,0 +1,171 @@
#! /usr/bin/env python3
import sys, os, argparse, json, shutil, tempfile, subprocess, traceback
def run_script(script_path: str) -> int:
"""
Helper to handle subprocess execution
Args:
script_path (str): script path to execute
Returns:
int: 0 if both succeed, 1 if any step fails
"""
if not os.path.exists(script_path):
print(f"Error: Script not found at {script_path}", file=sys.stderr)
return 1
try:
subprocess.run(f'{script_path}', check=True, capture_output=True, text=True)
return 0
except subprocess.CalledProcessError as e:
print(f"Error: {os.path.basename(script_path)} failed (Exit {e.returncode})", file=sys.stderr)
print(f"Details: {e.stderr.strip() or e.stdout.strip()}", file=sys.stderr)
return 1
except PermissionError:
print(f"Error: {os.path.basename(script_path)} is not executable. Check permissions.", file=sys.stderr)
return 1
def handle_start(src_dir, install_path):
"""
Start application
Args:
src_dir (str): Path to source directory (Working directory)
install_path (str): Path to target installation directory
Returns:
int: 0 -> success
"""
try:
# disable app
if os.path.exists(os.path.join(install_path, 'disable')):
subprocess.check_output(f'{install_path}/disable')
# copy all source files to installation path
shutil.copytree(src_dir, install_path, dirs_exist_ok=True)
# start application
if run_script(f'{install_path}/start') != 0:
return 1
return 0
except Exception as ex:
print(f'Error: {ex}')
return 1
def handle_stop(install_path: str):
"""
Stop application
Args:
install_path (str): Path to installation directory
Returns:
int: 0 -> success
"""
if not os.path.exists(os.path.join(install_path, 'stop')):
print(f"Error: stop script not found at {install_path}")
return 1
try:
# stop application
if run_script(f'{install_path}/stop') != 0:
return 1
return 0
except subprocess.CalledProcessError as e:
print(f"Error: Stop script failed with exit code {e.returncode}")
print(f"Output: {e.stderr or e.stdout}")
return 1
def handle_restart(src_path: str, install_path: str):
"""
Restart application
Args:
install_path (str): Path to installation directory
Returns:
int: 0 -> success
"""
if handle_stop(install_path) != 0:
print("Restart aborted: Stop script execution failed.", file=sys.stderr)
return 1
if handle_start(src_path, install_path) != 0:
print("Restart aborted: Start script execution failed.", file=sys.stderr)
return 1
print('Application restarted successfully.')
return 0
# script constants
utils_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir))
working_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
src_path = os.path.join(working_dir, 'src')
CONFIG_JSON = os.path.join(working_dir, 'config.json')
templates_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', 'hosted-app-utils', 'templates'))
template_files = {
f'{templates_dir}/start': f'{working_dir}/src/start',
f'{templates_dir}/stop': f'{working_dir}/src/stop',
f'{templates_dir}/disable': f'{working_dir}/src/disable'
}
# command line arguments
parser = argparse.ArgumentParser(
prog="clientappctl",
description="Manage client application operations. [ start, stop, restart ]")
parser.add_argument("-c", "--config", default=CONFIG_JSON, help=f"Path to application configuration (default: {CONFIG_JSON})")
subparsers = parser.add_subparsers(dest="command", required=True)
start_parser = subparsers.add_parser("start", help="Start the application")
stop_parser = subparsers.add_parser("stop", help="Stop the application")
restart_parser = subparsers.add_parser("restart", help="Restart the application")
def main() -> int:
# parse user args
args = parser.parse_args()
# load configuration
try:
config_path = args.config
if not os.path.exists(config_path):
raise ValueError("Configuration not found.")
with open(config_path) as f:
config_data = json.load(f)
name_slug = config_data['name'].strip().replace(' ', '_').replace('-', '_').lower()
org_slug = config_data['org'].strip().replace(' ', '_').replace('-', '_').lower()
version = config_data['version']
install_path = f'/var/signalytic/clientapps/{org_slug}/{name_slug}'
# copy temp files into working dir
for src, dest in template_files.items():
if not os.path.exists(src):
continue
shutil.copy(src, dest)
if args.command == "start":
print(f"Starting app: {config_data['name']}-{version}")
if not os.path.exists(install_path):
os.makedirs(install_path)
return handle_start(src_path, install_path)
elif args.command == "stop":
print(f"Stopping app: {config_data['name']}-{version}")
return handle_stop(install_path)
elif args.command == "restart":
print(f"Restarting app: {config_data['name']}-{version}")
return handle_restart(src_path, install_path)
else:
raise ValueError('Invalid operation passed.')
except Exception as ex:
print(f'Error: {ex}')
return 1
if __name__ == '__main__':
sys.exit(main())
Executable → Regular
+14 -6
View File
@@ -1,6 +1,6 @@
services:
streamline-emr:
image: registry.gitlab.com/signalytic/client-external/streamline/streamline-emr/streamline-emr/arm64:2.3
image: registry.gitlab.com/signalytic/client-external/streamline/streamline-emr/streamline-emr/arm64:3.4
container_name: streamline-emr
restart: unless-stopped
volumes:
@@ -18,18 +18,26 @@ services:
retries: 5
statistics:
image: registry.gitlab.com/signalytic/client-external/streamline/streamline-emr/statistics/arm64:2.3
image: registry.gitlab.com/signalytic/client-external/streamline/streamline-emr/statistics/arm64:3.1
container_name: streamline-emr-statistics
restart: unless-stopped
volumes:
- "${STATISTICS_ENV:-./resources/statistics.env}:/app/statistics.env"
- "${STATISTICS_DATA_DIR:-./statistics_data}:/app"
environment:
SERVER: https://impactdashboard.streamlinehealth.tech/
SERVER_ENDPOINT: signalytic/receive_data
SERVER_STATUS_URL: signalytic/status
DB_HOST: streamline-emr
DB_DATABASE: streamline
DB_USERNAME: root
DB_PASSWORD: streamline
REDIS_HOST: streamline-emr-redis
REDIS_PORT: 6379
REDIS_TTL: 432000
depends_on:
- streamline-emr
- redis
redis:
image: registry.gitlab.com/signalytic/client-external/streamline/streamline-emr/redis/arm64:2.3
image: registry.gitlab.com/signalytic/client-external/streamline/streamline-emr/redis/arm64:v3
container_name: streamline-emr-redis
restart: unless-stopped
volumes:
-15
View File
@@ -1,15 +0,0 @@
# server endpoint
SERVER=https://impactdashboard.streamlinehealth.tech/
SERVER_ENDPOINT=signalytic/receive_data
SERVER_STATUS_URL=signalytic/status
# Database variables
DB_HOST=streamline-emr
DB_DATABASE=streamline
DB_USERNAME=root
DB_PASSWORD=streamline
# Redis variables
REDIS_HOST=streamline-emr-redis
REDIS_PORT=6379
REDIS_TTL=432000 # 5Days