mirror of
https://gitlab.com/signalytic/client-external/streamline/streamline-emr.git
synced 2026-09-11 18:51:31 +00:00
statistics docker setup, cleanup on sync script, added supervisord
This commit is contained in:
@@ -1,23 +1,34 @@
|
|||||||
FROM php:cli
|
FROM php:cli
|
||||||
|
|
||||||
# Install required dependencies
|
RUN apt-get update && apt-get install -y \
|
||||||
RUN apt-get update && apt-get install -y cron unzip curl && rm -rf /var/lib/apt/lists/*
|
cron \
|
||||||
|
unzip \
|
||||||
|
curl \
|
||||||
|
libpng-dev \
|
||||||
|
libjpeg-dev \
|
||||||
|
supervisor \
|
||||||
|
&& pecl install redis \
|
||||||
|
&& docker-php-ext-install pdo pdo_mysql gd \
|
||||||
|
&& docker-php-ext-enable redis \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
RUN docker-php-ext-install pdo pdo_mysql
|
RUN curl -sS https://getcomposer.org/installer | \
|
||||||
|
php -- --install-dir=/usr/local/bin --filename=composer
|
||||||
|
|
||||||
RUN apt-get update && apt-get install -y libpng-dev libjpeg-dev \
|
|
||||||
&& pecl install redis && docker-php-ext-enable redis
|
|
||||||
|
|
||||||
# Copy the cron job script
|
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
COPY fetch_and_send.php /app/fetch_and_send.php
|
|
||||||
|
# install composer dependencies
|
||||||
|
COPY . .
|
||||||
|
|
||||||
|
RUN composer install
|
||||||
|
|
||||||
COPY crontab /etc/cron.d/crontab
|
COPY crontab /etc/cron.d/crontab
|
||||||
RUN chmod +x /app/fetch_and_send.php
|
|
||||||
|
|
||||||
# Give execution rights on the cron job file
|
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
|
||||||
RUN chmod 0644 /etc/cron.d/crontab && crontab /etc/cron.d/crontab
|
|
||||||
|
|
||||||
RUN touch /var/log/cron.log && touch /app/statistics.log
|
RUN chmod 0644 /etc/cron.d/crontab \
|
||||||
|
&& crontab /etc/cron.d/crontab \
|
||||||
|
&& touch /var/log/cron.log /app/sync.log \
|
||||||
|
&& chmod +x /app/sync.php
|
||||||
|
|
||||||
# Start cron in the foreground
|
CMD ["supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"]
|
||||||
CMD ["cron", "-f"]
|
|
||||||
@@ -1 +1 @@
|
|||||||
00 23 * * * php /app/fetch_and_send.php >> /var/log/cron.log 2>&1
|
00 23 * * * /usr/local/bin/php /app/sync.php >> /var/log/cron.log 2>&1
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
[supervisord]
|
||||||
|
nodaemon=true
|
||||||
|
|
||||||
|
[program:cron]
|
||||||
|
command=cron -f
|
||||||
|
autorestart=true
|
||||||
|
|
||||||
|
[program:sync-cron-log]
|
||||||
|
command=tail -f /var/log/cron.log
|
||||||
|
autorestart=true
|
||||||
|
|
||||||
|
[program:sync]
|
||||||
|
command=/usr/local/bin/php /app/sync.php
|
||||||
|
autorestart=true
|
||||||
+13
-40
@@ -1,29 +1,4 @@
|
|||||||
<?php
|
<?php
|
||||||
/**
|
|
||||||
* Data Synchronization Script
|
|
||||||
*
|
|
||||||
* @filename sync.php
|
|
||||||
* @description Performs periodic data synchronization between local & remote database
|
|
||||||
* @author conrad96
|
|
||||||
* @date 2025-03-26
|
|
||||||
* @license MIT
|
|
||||||
*
|
|
||||||
* @usage Executed via cronjob at configured intervals
|
|
||||||
*
|
|
||||||
* Overview:
|
|
||||||
* - Check available services e.g Redis, MySQL
|
|
||||||
* - Perform periodic query fetch
|
|
||||||
* - Check Internet connectivity before uploading payload.
|
|
||||||
* - Saving query result set to redis cache
|
|
||||||
* - Upload cached data
|
|
||||||
*
|
|
||||||
* Cron Configuration Example:
|
|
||||||
* execution of sync.php after every hour
|
|
||||||
* 0 + + + php /app/sync.php >> /var/log/sync.log 2>&1
|
|
||||||
*
|
|
||||||
* Monitoring:
|
|
||||||
* - script monitoring logs are saved in sync.log
|
|
||||||
*/
|
|
||||||
require __DIR__ . "/vendor/autoload.php";
|
require __DIR__ . "/vendor/autoload.php";
|
||||||
|
|
||||||
use GuzzleHttp\Client;
|
use GuzzleHttp\Client;
|
||||||
@@ -100,11 +75,8 @@ class sync{
|
|||||||
'timeout' => 3.0,
|
'timeout' => 3.0,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
# init fetch data
|
# fetch data
|
||||||
$this->payload = $this->fetchData();
|
$db_data = $this->fetchData();
|
||||||
|
|
||||||
# check / upload cache
|
|
||||||
$this->uploadCache();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function startSync(){
|
function startSync(){
|
||||||
@@ -116,7 +88,13 @@ class sync{
|
|||||||
|
|
||||||
$response = $this->http->get($this->server_status_url, [
|
$response = $this->http->get($this->server_status_url, [
|
||||||
'timeout'=> 10,
|
'timeout'=> 10,
|
||||||
'http_errors'=> true
|
'http_errors'=> true,
|
||||||
|
'headers' => [
|
||||||
|
'Accept' => 'application/json',
|
||||||
|
'X-Requested-With' => 'XMLHttpRequest'
|
||||||
|
],
|
||||||
|
'verify'=> true,
|
||||||
|
'allow_redirects'=> false
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$status_code = $response->getStatusCode();
|
$status_code = $response->getStatusCode();
|
||||||
@@ -126,7 +104,8 @@ class sync{
|
|||||||
|
|
||||||
$this->logger->debug("Internet connection available.", ["status_code"=> $status_code, "response"=> $response_body]);
|
$this->logger->debug("Internet connection available.", ["status_code"=> $status_code, "response"=> $response_body]);
|
||||||
|
|
||||||
$upload = $this->uploadData(); # upload payload
|
$upload_cache = $this->uploadCache();
|
||||||
|
if(!$upload_cache) throw new Exception("Upload failed. [". $upload_cache."]");
|
||||||
|
|
||||||
$this->logger->info("Internet connection available. uploading data.", ["upload"=> $upload]);
|
$this->logger->info("Internet connection available. uploading data.", ["upload"=> $upload]);
|
||||||
|
|
||||||
@@ -134,7 +113,6 @@ class sync{
|
|||||||
}catch(Exception $ex){
|
}catch(Exception $ex){
|
||||||
$this->logger->error($ex->getMessage());
|
$this->logger->error($ex->getMessage());
|
||||||
|
|
||||||
$this->saveToCache($this->payload);
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -286,7 +264,7 @@ class sync{
|
|||||||
$this->logger->debug("Fetched: ". $data);
|
$this->logger->debug("Fetched: ". $data);
|
||||||
$this->logger->info("Queries executed successfully. data saved.", ['size'=> strlen($data)]);
|
$this->logger->info("Queries executed successfully. data saved.", ['size'=> strlen($data)]);
|
||||||
|
|
||||||
return $data;
|
return $this->saveToCache($data);
|
||||||
}catch(Exception $ex){
|
}catch(Exception $ex){
|
||||||
$this->logger->error($ex->getMessage());
|
$this->logger->error($ex->getMessage());
|
||||||
return false;
|
return false;
|
||||||
@@ -295,9 +273,6 @@ class sync{
|
|||||||
|
|
||||||
public function uploadData($endpoint = null, $data = null)
|
public function uploadData($endpoint = null, $data = null)
|
||||||
{
|
{
|
||||||
if(is_null($endpoint)) $endpoint= $this->endpoint;
|
|
||||||
if(is_null($data)) $data= $this->payload;
|
|
||||||
|
|
||||||
$this->logger->info("Uploading payload.", ["url"=> $this->server. $this->endpoint ]);
|
$this->logger->info("Uploading payload.", ["url"=> $this->server. $this->endpoint ]);
|
||||||
|
|
||||||
try{
|
try{
|
||||||
@@ -330,8 +305,6 @@ class sync{
|
|||||||
}catch(Exception $ex){
|
}catch(Exception $ex){
|
||||||
$this->logger->error($ex->getMessage());
|
$this->logger->error($ex->getMessage());
|
||||||
|
|
||||||
$this->saveToCache($data);
|
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -394,7 +367,7 @@ class sync{
|
|||||||
$iterator = null;
|
$iterator = null;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
//get all keys with data: pattern
|
//get all keys
|
||||||
$result = $this->redis->scan($iterator, 'data:*');
|
$result = $this->redis->scan($iterator, 'data:*');
|
||||||
|
|
||||||
if ($result !== false) $keys = array_merge($keys, $result);
|
if ($result !== false) $keys = array_merge($keys, $result);
|
||||||
|
|||||||
Reference in New Issue
Block a user