Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

modular reverse proxy #130

Merged
merged 2 commits into from
Apr 17, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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 ${OPENSEARCH_BASIC_TOKEN}";

}

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
Loading