-
Notifications
You must be signed in to change notification settings - Fork 0
Home
vizER is an interactive web application developed using Shiny R package. In order to make it available on the Internet, Shiny developments need to be deployed on a web server.
On the other hand, as all Shiny apps contain R code, they also need to be deployed on a specific web server able to understand R language such as Shiny Server and RStudio Server.
In this particular case, as we were interested in publishing vizER on a pre-defined URL, we chose the RStudio Server as the most suitable option for that purpose. However, the Open Source Edition of RStudio Server revealed a potential drawback: the usage of vizER was only possible for one single user at a time. For that reason, because we need enterprise features but stay open source, we decided to use ShinyProxy.
In this tutorial, we will, therefore, show how to deploy vizER on an Apache Server by making use of ShinyProxy.
All configurations detailed in this tutorial have been tested on a CentOS 7 machine.
- Java 8 or higher
- Docker. We need to install Docker because ShinyProxy requires it.
- ShinyProxy
- ShinyProxy can be downloaded here.
- Once it has been downloaded, ShinyProxy can be installed on a CentOS7 machine as follows:
sudo yum install shinyproxy_2.3.0_x86_64.rpm
ShinyProxy needs to connect to the Docker daemon to spin up the containers for the Shiny apps. By default, ShinyProxy will do so on port 2375 of the docker host. In order to allow for connections on port 2375, the docker startup options need to be edited.
So, first, we have to edit the Docker configuration file:
sudo systemctl edit docker
Secondly, we add the following lines at the end of the file:
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H unix:// -D -H tcp://127.0.0.1:2375
Finally, we restart the Docker service:
sudo systemctl daemon-reload
sudo systemctl restart docker
Additionally, we add the following line into our Rprofile.site file:
local({
options(shiny.port = 3838, shiny.host = "0.0.0.0")
})
Docker images are built from instructions detailed within a Dockerfile. In this case, our Dockerfile will contain a collection of instructions representing the following elements:
- A pre-existing Docker image that contains the installation of R within a particular operating system.
- The installation of all R packages that are dependencies of Shiny R package.
- The folder that contains all files of our Shiny app vizER.
Now that the Dockerfile has been created, we need to build the Docker image of vizER by using the following command. Please, be aware that it is essential to be located within the same folder that Dockerfile is:
sudo docker build -t vizER .
The configuration of ShinyProxy happens in a single file called 'application.yml'. If we want to ShinyProxy recognise the Docker image of a Shiny app, it has to be specified within the specs block.
For further details, please visit the application.yml file generated for vizER or the official documentation.
## Configuring Apache
Finally, to deploy vizER at the http://servername/browser/ URL, we have to add the following lines into the Apache configuration file placed within the path */etc/httpd/conf.d/*:
```s
<Proxy *>
Allow from localhost
</Proxy>
RedirectMatch permanent ^/browser$ /browser/
RewriteEngine on
RewriteCond %{HTTP:Upgrade} =websocket
RewriteRule /browser/(.*) ws://0.0.0.0:2525/browser/$1 [P,L]
RewriteCond %{HTTP:Upgrade} !=websocket
RewriteRule /browser/(.*) http://0.0.0.0:2525/browser/$1 [P,L]
ProxyPass /browser/ http://0.0.0.0:2525/browser/ connectiontimeout=3000 timeout=3000
ProxyPassReverse /browser/ http://0.0.0.0:2525/browser/
Header edit Location ^/ /browser/
ProxyRequests Off
And restart Apache:
sudo apachectl restart
The last step consists of running the generated Docker image of vizER by making use of ShinyProxy. For that purpose, and within the same folder where the application.yml file has been placed, we execute the following line:
java -jar shinyproxy-2.0.5.jar
If everything has gone as expected, vizER should now be reachable at http://servername/browser/.