Skip to content

Commit

Permalink
modular reverse proxy
Browse files Browse the repository at this point in the history
  • Loading branch information
delcroip committed Apr 16, 2024
1 parent 7644510 commit cb7e588
Show file tree
Hide file tree
Showing 13 changed files with 173 additions and 29 deletions.
38 changes: 11 additions & 27 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,35 +1,19 @@
# openIMIS Frontend Reference Implementation : Windows Docker
# openIMIS frontend assembly

This repository holds the configuration files for the openIMIS Frontend Reference Implementation:
## running

- Legacy web application
- Modular front end
this repository builds:

Please look for the direction on the openIMIS Wiki: https://openimis.atlassian.net/wiki/spaces/OP/pages/963182705/MO1.1+Install+the+modular+openIMIS+using+Docker
- a docker image `ghcr.io/openimis/openimis-fe` that can be use in a docker compose
- a minified js application that can be served by any webserver (see release)

Note: the modular frontend is part of the release ZIP of the legacy webapp, if the modular frontend need to be changed then new modular frontend static files need to be placed in /inetroot/www/openIMIS/front
the build content is defined by the openimis.json file

Note 2: The docker file can be change to build first the frontend by uncommenting the "downloader" related lines.

This repo branches, tags,... are maintained by openIMIS official delivery team who use it to build the official openIMIS Docker images containing the official modules (versions) list.

In case of troubles, please consult/contact our service desk via our [ticketing site](https://openimis.atlassian.net/servicedesk/customer).

# openIMIS Frontend Reference Implementation : Linux

This repository holds the configuration files for the openIMIS Frontend Reference Implementation.
It serves 2 distinct use cases:

- developers who want to implement new modules or modify existing frontend modules of openIMIS
- distributors who want to assemble modules into a Docker image for delivery

Note: please, refer to [openIMIS Frontend localisation](i18n.md) to provide translations and bind user's language to a locale for data format (dates, numbers,...)

This repo branches, tags,... are maintained by openIMIS official delivery team who use it to build the official openIMIS Docker images containing the official modules (versions) list.

In case of troubles, please consult/contact our service desk via our [ticketing site](https://openimis.atlassian.net/servicedesk/customer).

[![License: AGPL v3](https://img.shields.io/badge/License-AGPL%20v3-blue.svg)](https://www.gnu.org/licenses/agpl-3.0)
more information for:

- [docker Windows](/docs/WINDOWS_DOCKER.md)
- [docker Linux](/docs/LINUX_DOCKER.md)
- [reverse proxy toward other openIMIS services](/docs/reverse_proxy.md)

## Developers setup

Expand Down
21 changes: 21 additions & 0 deletions conf/locations/backend.loc
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@

location /${REACT_APP_API_URL}/ {

proxy_pass http://${backend};
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
proxy_set_header X-Forwarded-Proto https;
}
location = /check_user/ {
internal;
proxy_pass_request_body off;
proxy_set_header Content-Length "";
proxy_set_header X-Original-URI $request_uri;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://${backend}/${REACT_APP_API_URL}/core/users/current_user/;
}


3 changes: 3 additions & 0 deletions conf/locations/certbot.loc
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
10 changes: 10 additions & 0 deletions conf/locations/frontend.loc
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@


location / {
return 302 https://$host/${PUBLIC_URL}/;
}

location /${PUBLIC_URL} {
try_files $uri $uri/ /${PUBLIC_URL}/index.html;
#error_page 404 $scheme://$host/front/;
}
14 changes: 14 additions & 0 deletions conf/locations/lightning.loc
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@

location /lightning/ {

rewrite /lightning/(.*) /$1 break;
proxy_pass http://${lightning};
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-Host $server_name;


}

13 changes: 13 additions & 0 deletions conf/locations/opensearch.loc
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@

location /opensearch/ {
auth_request /check_user/;
proxy_pass http://${opensearch};
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-Host $server_name;
proxy_set_header Authorization "Basic YourBasicToken";

}

14 changes: 14 additions & 0 deletions conf/locations/restapi.loc.bk
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@


location /${ROOT_MOBILEAPI}/ {

#this rewrite rule is required to remove "ROOT_MOBILEAPI" because implicite rule (/ at the end of the url) donc work with variable
rewrite /${ROOT_MOBILEAPI}/(.*) /$1 break;
proxy_pass http://${restapi};
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-Host $server_name;

}
4 changes: 4 additions & 0 deletions conf/variables/var.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
set $backend "backend:8000";
set $opensearch "opensearch-dashboards:5601";
set $lightning "lightning:4000";
set $frontend "lightning:4000";
15 changes: 15 additions & 0 deletions docs/LINUX_DOCKER.MD
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# openIMIS Frontend Reference Implementation : Linux

This repository holds the configuration files for the openIMIS Frontend Reference Implementation.
It serves 2 distinct use cases:

- developers who want to implement new modules or modify existing frontend modules of openIMIS
- distributors who want to assemble modules into a Docker image for delivery

Note: please, refer to [openIMIS Frontend localisation](i18n.md) to provide translations and bind user's language to a locale for data format (dates, numbers,...)

This repo branches, tags,... are maintained by openIMIS official delivery team who use it to build the official openIMIS Docker images containing the official modules (versions) list.

In case of troubles, please consult/contact our service desk via our [ticketing site](https://openimis.atlassian.net/servicedesk/customer).

[![License: AGPL v3](https://img.shields.io/badge/License-AGPL%20v3-blue.svg)](https://www.gnu.org/licenses/agpl-3.0)
16 changes: 16 additions & 0 deletions docs/WINDOWS_DOCKER.MD
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# openIMIS Frontend Reference Implementation : Windows Docker

This repository holds the configuration files for the openIMIS Frontend Reference Implementation:

- Legacy web application
- Modular front end

Please look for the direction on the openIMIS Wiki: https://openimis.atlassian.net/wiki/spaces/OP/pages/963182705/MO1.1+Install+the+modular+openIMIS+using+Docker

Note: the modular frontend is part of the release ZIP of the legacy webapp, if the modular frontend need to be changed then new modular frontend static files need to be placed in /inetroot/www/openIMIS/front

Note 2: The docker file can be change to build first the frontend by uncommenting the "downloader" related lines.

This repo branches, tags,... are maintained by openIMIS official delivery team who use it to build the official openIMIS Docker images containing the official modules (versions) list.

In case of troubles, please consult/contact our service desk via our [ticketing site](https://openimis.atlassian.net/servicedesk/customer).
16 changes: 16 additions & 0 deletions docs/reverse_proxy.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# reverse proxy

openIMIS serves different service base on URI, the default are:

- /api/: backend
- /front/: frontend
- /lightning/: lightning
- /opensearch/: opensearch
- /restapi/: C# restAPI (discontinued)


to allow user to easily change the revers proxy the conf/locations folder contains a file per service,

changing the file extension or removing the file will remove the reverse proxy configuration

file update can be made, but one must be careful when using variable because at the container start, all ENV system variable will be substituted by their value (see entrypoints.sh to see how it is done)
34 changes: 32 additions & 2 deletions script/entrypoint.sh
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,46 @@ if [ ! -f "/etc/letsencrypt/live/${NEW_OPENIMIS_HOST}/fullchain.pem" ]; then
cp -a /etc/nginx/ssl/live/host/. /etc/letsencrypt/live/${NEW_OPENIMIS_HOST}/
fi
REF=$(date +'%m%d%Y%p')
[ ${FORCE_RELOAD} -eq 1 ] && REDIRECT_TAIL="&${REF}" || REDIRECT_TAIL=''
[[ ${FORCE_RELOAD} -eq 1 ]] && REDIRECT_TAIL="&${REF}" || REDIRECT_TAIL=''
rm -f /etc/nginx/conf.d/openIMIS.confs
rm -f /etc/nginx/conf.d/default.conf
cp /conf/openimis.conf /etc/nginx/conf.d/openIMIS.conf

VARS_TO_REPLACE="$(printenv | grep -Eo "^([A-Z_]*)" | xargs -I % echo \$\{%\}, | xargs)"
echo "replacing ENV vars in openIMIS.conf"
envsubst "\${REDIRECT_TAIL}, ${VARS_TO_REPLACE::-1}" < /conf/openimis.conf > /etc/nginx/conf.d/openIMIS.conf

# add the parts
if [ -d '/conf/locations' ]; then
echo "loading the location specific conf in openIMIS.conf"
if [ ! -d '/etc/nginx/conf.d/locations' ]; then
mkdir -p /etc/nginx/conf.d/locations
else
rm /etc/nginx/conf.d/locations/*
fi
if [ ! -d '/etc/nginx/conf.d/variables' ]; then
mkdir -p /etc/nginx/conf.d/variables
fi
cp /conf/variables/var.conf /etc/nginx/conf.d/variables/var.conf
multiline_content="#include the configuration use in the loc files\ninclude conf.d/variables/var.conf;\n# include the loc files\ninclude conf.d/locations/*.loc;"
echo "cleaning old config"

# Use sed to replace ###PLACEHOLDER### with multiline content
sed -i "s|###INCLUDE_PLACEHOLDER###|${multiline_content}|g" /etc/nginx/conf.d/openIMIS.conf
for file in /conf/locations/*
do
[ -f "$file" ] || continue
filename=$(basename "$file")
echo "${file} saved in /etc/nginx/conf.d/locations/$filename"
envsubst "${VARS_TO_REPLACE::-1}" < "$file" > "/etc/nginx/conf.d/locations/$filename"
done

fi

ln -s -f /usr/share/nginx/html /usr/share/nginx/html/${PUBLIC_URL}
echo "Hosting on https://""$NEW_OPENIMIS_HOST"
echo "root uri $PUBLIC_URL"
echo "root api $REACT_APP_API_URL"
echo "root restapi $ROOT_MOBILEAPI"

exec "$@"

4 changes: 4 additions & 0 deletions test.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
#include the configuration use in the loc files
include location/var.conf
# include the loc files
include location/*.loc

0 comments on commit cb7e588

Please sign in to comment.