From 3ee30ec60dbeb31c76b392a9a59d0597ff087e2f Mon Sep 17 00:00:00 2001 From: Venkatesh Babu Date: Fri, 24 May 2024 11:41:56 +0530 Subject: [PATCH 1/4] Change valid from for keys to a day in past --- install/scripts/update_bap_config.sh | 10 ++++------ install/scripts/update_bpp_config.sh | 9 +++++---- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/install/scripts/update_bap_config.sh b/install/scripts/update_bap_config.sh index c4aa61a..be65d06 100755 --- a/install/scripts/update_bap_config.sh +++ b/install/scripts/update_bap_config.sh @@ -50,14 +50,12 @@ echo "Your Private Key: $private_key" echo "Your Public Key: $public_key" -valid_from=$(date -u +"%Y-%m-%dT%H:%M:%S.%3NZ") - if [[ $(uname -s ) == 'Darwin' ]];then - valid_from=$(date -u +"%Y-%m-%dT%H:%M:%S.%000Z") - valid_until=$(date -u -v+1y +"%Y-%m-%dT%H:%M:%S.%000Z") + valid_from=$(date -u -v-1d +"%Y-%m-%dT%H:%M:%S.%000Z") + valid_until=$(date -u -v+3y +"%Y-%m-%dT%H:%M:%S.%000Z") else - valid_from=$(date -u +"%Y-%m-%dT%H:%M:%S.%3NZ") - valid_until=$(date -u -d "+1 year" +"%Y-%m-%dT%H:%M:%S.%3NZ") + valid_from=$(date -u -d "-1 day" +"%Y-%m-%dT%H:%M:%S.%3NZ") + valid_until=$(date -u -d "+3 year" +"%Y-%m-%dT%H:%M:%S.%3NZ") fi type=BAP diff --git a/install/scripts/update_bpp_config.sh b/install/scripts/update_bpp_config.sh index fbd450d..e20cc3a 100755 --- a/install/scripts/update_bpp_config.sh +++ b/install/scripts/update_bpp_config.sh @@ -52,12 +52,13 @@ get_keys if [[ $(uname -s ) == 'Darwin' ]];then - valid_from=$(date -u +"%Y-%m-%dT%H:%M:%S.%000Z") - valid_until=$(date -u -v+1y +"%Y-%m-%dT%H:%M:%S.%000Z") + valid_from=$(date -u -v-1d +"%Y-%m-%dT%H:%M:%S.%000Z") + valid_until=$(date -u -v+3y +"%Y-%m-%dT%H:%M:%S.%000Z") else - valid_from=$(date -u +"%Y-%m-%dT%H:%M:%S.%3NZ") - valid_until=$(date -u -d "+1 year" +"%Y-%m-%dT%H:%M:%S.%3NZ") + valid_from=$(date -u -d "-1 day" +"%Y-%m-%dT%H:%M:%S.%3NZ") + valid_until=$(date -u -d "+3 year" +"%Y-%m-%dT%H:%M:%S.%3NZ") fi + type=BPP From 70148123be231bd52e12637a7748eb1cb7657b07 Mon Sep 17 00:00:00 2001 From: Venkatesh Babu <154209057+vbabuEM@users.noreply.github.com> Date: Tue, 11 Jun 2024 13:15:12 +0530 Subject: [PATCH 2/4] Update user_guide.md with upgrade instructions --- docs/user_guide.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/docs/user_guide.md b/docs/user_guide.md index 5045b7a..26aabaf 100644 --- a/docs/user_guide.md +++ b/docs/user_guide.md @@ -15,6 +15,7 @@ - [Connecting BAP Beckn Adapter to BAP Software](#connecting-bap-beckn-adapter-to-bapbuyer-side-software) - [Connecting BPP Beckn Adapter to BPP Software](#connecting-bpp-beckn-adapter-to-bppseller-side-software) - [Running Beckn-ONIX locally](#running-beckn-onix-locally) +- [Upgrading to a new version](#upgrading-to-a-new-version) - [Appendix A - subdomain/domain name configuration](#appendix-a---registering-or-adding-domain-or-subdomains) - [Appendix B - Nginx reverse proxy configuration](#appendix-b---nginx-reverse-proxy-configuration) @@ -242,6 +243,15 @@ Refer to the [core specification](https://github.com/beckn/protocol-specificatio - In order for people new to Beckn who want to try out Beckn on their own machine, choose the option to "Set up a network on your local machine" in the main screen. The all in one installation has preconfigured values for variables and so pretty much does not ask for any input. +## Upgrading to a new version +- The following commands illustrate upgrade of the docker image for Protocol Server (here BPP). Use similar process for other components + +``` +docker compose -f docker-compose-bpp.yml down +docker rmi fidedocker/protocol-server +docker compose -f docker-compose-bpp.yml up -d +``` + ## Appendix A - Registering or adding domain or subdomains All the components of Beckn network need to be publicly accessible. Using domain names for them is the easiest. There are two options for domain names. One is a separate domain name for each component(e.g. registrybp.io). Second is to use subdomains for the individual componetns (e.g. onix-registry.becknprotocol.io , onix-gateway.becknprotocol.io etc). Which one of these two to use depends on the business requirement. For example if an organization is the network facilitator, they might go for a domain name for the registry instead of subdomain. In the examples given above we have primarily used subdomain approach. From ec7dcd50dcd3b33a4259d54206305fa7acd2e996 Mon Sep 17 00:00:00 2001 From: Venkatesh Babu Date: Tue, 2 Jul 2024 08:56:55 +0530 Subject: [PATCH 3/4] Added reverse proxy configuration diagram --- docs/images/reverse_proxy_configuration.png | Bin 0 -> 48422 bytes docs/{ => notes}/sample_nginx_configurations.md | 4 +++- docs/setup_walkthrough.md | 9 ++++++++- docs/user_guide.md | 7 ++++++- 4 files changed, 17 insertions(+), 3 deletions(-) create mode 100644 docs/images/reverse_proxy_configuration.png rename docs/{ => notes}/sample_nginx_configurations.md (98%) diff --git a/docs/images/reverse_proxy_configuration.png b/docs/images/reverse_proxy_configuration.png new file mode 100644 index 0000000000000000000000000000000000000000..144df8525740c83ea976613b647fb2c83154b6f2 GIT binary patch literal 48422 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 SDp8OEE)U#Zx7#iOss913-cZp1 literal 0 HcmV?d00001 diff --git a/docs/sample_nginx_configurations.md b/docs/notes/sample_nginx_configurations.md similarity index 98% rename from docs/sample_nginx_configurations.md rename to docs/notes/sample_nginx_configurations.md index 66fc99f..03d191e 100644 --- a/docs/sample_nginx_configurations.md +++ b/docs/notes/sample_nginx_configurations.md @@ -1,6 +1,8 @@ # Nginx sample configuration for the different components -This document lists the various Nginx configuration sample files used in the demo. These use the URLs used as example in the user guide and demo walkthrough. These can be used as a reference. +This document lists the various Nginx configuration sample files used in the demo. These use the URLs used as example in the user guide and demo walkthrough. These can be used as a reference. This diagram illustrates the proxy_pass configuration (which is the primary part required) of all the nodes. If you know reverse proxy configuration, this diagram is all you need and you can ignore the rest of this page. + +![Reverse Proxy Configuration](../images/reverse_proxy_configuration.png) ## Nginx sample configuration for Registry diff --git a/docs/setup_walkthrough.md b/docs/setup_walkthrough.md index 26f209c..eedcbe5 100644 --- a/docs/setup_walkthrough.md +++ b/docs/setup_walkthrough.md @@ -17,7 +17,12 @@ For the sake of illustration, all the urls are shown as subdomains of becknproto Some of the outputs listed below might be different when you run the script for the first time. The output depends on whether the required docker containers are present in the machine or not. -Note: Due to a [known issue](https://github.com/beckn/beckn-onix/issues/11), on certain machines, when the script is run for the first time, it errors out complaining about permission error in accessing docker daemon. Till this issue is fixed, the work around is to exit the terminal and restart the installation in a new terminal. +Run the following two commands on all machines where the script is being run for the first time. Login to a new shell for the command to take effect and continue with the installation. Not doing so will result in docker permisssion error + +``` +sudo groupadd docker +sudo usermod -aG docker $USER +``` Please refer to the [Beckn-ONIX User Guide](./user_guide.md) for detailed explanation of the below steps. @@ -48,6 +53,8 @@ The following diagram shows a conceptual view of a multi-node Bekn network that - https://onix-bpp-client.becknprotocol.io to port 6001 on the machine - https://onix-bpp.becknprotocol.io to port 6002 on the machine +![Reverse Proxy Configuration Illustrated](./images/reverse_proxy_configuration.png) + - This guide assumes you have a marketplace or a headless store and want to set it up to work with the Beckn network. It is still useful for people who are developing the buyer side software and want to set it up with the network. In such cases a [sandbox](https://github.com/beckn/beckn-sandbox) might be required to mimic a marketplace or a headless shop. ## Create a new network and install the registry diff --git a/docs/user_guide.md b/docs/user_guide.md index 26aabaf..fe2060a 100644 --- a/docs/user_guide.md +++ b/docs/user_guide.md @@ -40,6 +40,10 @@ The following diagram shows a conceptual view of a multi-node Beckn network. The ![Typical deployment](./images/sample_deployment.png) +The following diagram shows the reverse proxy configuration (referred to also in the individual installations below) using the URLs used in the examples. Refer to this diagram during the reverse proxy configuration steps. + +![Reverse Proxy Configuration](./images/reverse_proxy_configuration.png) + **Use of docker and reference implementations** Docker compose and docker are extensively used in the installation and running of the various component software. Similarly the Beckn-ONIX installer, itself being a reference implementation, installs the reference implentation of the Beckn Adapter for the BAP and BPP, reference implementation of the registry and gateway. In order to interact with the internals of these components, we will need to enter the container. Familiarity with Docker will be useful in working with the installation. To list the running containers use `docker ps`. Similarly for example to connect to a container and browse it using shell, use `docker exec -it bap-client sh` @@ -244,6 +248,7 @@ Refer to the [core specification](https://github.com/beckn/protocol-specificatio - In order for people new to Beckn who want to try out Beckn on their own machine, choose the option to "Set up a network on your local machine" in the main screen. The all in one installation has preconfigured values for variables and so pretty much does not ask for any input. ## Upgrading to a new version + - The following commands illustrate upgrade of the docker image for Protocol Server (here BPP). Use similar process for other components ``` @@ -288,4 +293,4 @@ In the role of reverse proxy, Nginx will forward communication that came on a pa [This document](https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/) explains the configuration of reverse proxy using proxy_pass -You can find sample Nginx configuration for the Registry, Gateway, BAP and BPP [here](./sample_nginx_configurations.md) +You can find sample Nginx configuration for the Registry, Gateway, BAP and BPP [here](./notes/sample_nginx_configurations.md) From 0fd21c8bb889d8698e1dda636f6ca135e954aaa0 Mon Sep 17 00:00:00 2001 From: Ravi Prakash Date: Thu, 4 Jul 2024 17:43:37 +0530 Subject: [PATCH 4/4] Update README.md Added disclaimer --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 47d7a0c..7b55a96 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,8 @@ Beckn-ONIX is [FIDE](https://fide.org/) project aimed at easing setup and maintainance of a [Beckn](https://becknprotocol.io/) Network using reference implementations. Objectives include setting up reliable, configurable and fast Beckn network as a virtual appliance. This initiative is independent of the evolution of the Beckn protocol. This effort is also aimed at inviting contributions from the community to create secure, reliable builds for production environments. +> Disclaimer : Beckn-onix is a reference implementation of the Beckn-onix stack. It is a reference application only and has not been tested for production environmens. However, implementers can fork this repository and build it for scale. The maintainer of this repository holds no liabillity for deployments of this application in production environments. + ## GUI Installer There is a community contributed browser based GUI installer to install multi-node reference implementation Beckn network. Refer to the [Installation Guide](./onix-gui/GUI/README.md) and [wizard guide](./onix-gui/README.md) for details.