Author: Titouan Chambe
Date: 2024-04-29

# Hosting ‘FossilSimShiny’ on a Web Server

#### Titouan Chambe

#### 2024-04-29

This vignette provides information on how to host the `FossilShinyApp` on a web server.
Specifically, while we’ll only look at serving the app on `Debian 11`, this guide can easily be adapted for any `Linux` based web server and for any app for that matter.

## Contents

- Preface
- Dependencies
  - R
  - Dependencies for building a Shiny server from source
  - R packages we need
- Installing Shiny Server
- Putting the app on the server
- Firewall tweaks
- Starting Shiny Server

## Preface

This guide will assume you know basic `bash` commands and have already setup a `ssh` connection to your web server.

## Dependencies

Let’s start by installing all the dependencies we’ll need to compile and run our shiny web server. Connect via `ssh` to your web server and install the following packages.

### R

Some dependencies used by `FossilSim` require a rather recent version of `R`. At the time of making this, on `debian bullseye`, you need a newer version of R rather than the one supplied by the advanced packaging tool `apt`.
This means we’ll need to add a `PPA` in order to get a more recent version of `R` as to fully support the `FossilSim` package, which we obviously need.
First open the file at `/etc/apt/sources.list` to add the `R` `PPA` to your sources list:

    nano /etc/apt/sources.list

Add the line `deb http://cloud.r-project.org/bin/linux/debian bullseye-cran40/` as shown below to add the `PPA`.
If you are using a different `distro`, you can use https://CRAN.R-project.org/bin/linux/ to find the right `PPA`.
Your source file should look like this:

    # deb http://mirrors.online.net/debian bullseye main

    deb http://mirrors.online.net/debian bullseye main non-free contrib
    deb-src http://mirrors.online.net/debian bullseye main non-free contrib

    deb http://security.debian.org/debian-security bullseye-security main contrib n>
    deb-src http://security.debian.org/debian-security bullseye-security main contr>

    # R 4.2.0
    deb http://cloud.r-project.org/bin/linux/debian bullseye-cran40/

Then press `CTRL+X` to quit and `Y` to save.
Finally, you can install `R`.

    apt-get update
    apt-get install r-base r-base-dev

You can verify your `R` version by using the `R` command.

    $ R

    R version 4.2.0 (2022-04-22) -- "Vigorous Calisthenics"

### Dependencies for building a Shiny server from source

These are the dependencies you’ll need to build shiny server. Depending on your distribution they may already be pre-installed.

- `Python 3.6+`, pre-installed on `Debian 11`.

Use `which python3` to verify it is installed. You should get something like `/usr/bin/python3` if it’s correctly installed.

- `cmake`

Use `sudo apt-get install cmake`.

- `gcc`

Should be pre-installed. Author’s note: we need `gcc 4.8`or newer which means you cannot use this guide with a`Debian 9<`server.

- `g++`

Should be pre-installed.

- `git`

Use `sudo apt-get install git`.

### R packages we need

Any `R` packages used by the app needs to be installed for all users. This means we need to install both the shiny package and the `FossilSim` package for all users.

    sudo su - -c "R -e \"install.packages('shiny', repos='https://cran.rstudio.com/')\""
    sudo su - -c "R -e \"install.packages('FossilSim')\""

## Installing Shiny Server

Note: most of this part is referenced from here.
Once all of the prerequisites have been satisfied, you can use the following commands to download and install Shiny Server.

    # Clone the repository from GitHub
    git clone https://github.com/rstudio/shiny-server.git

    # Get into a temporary directory in which we'll build the project
    cd shiny-server
    mkdir tmp
    cd tmp

    # Install our private copy of Node.js
    ../external/node/install-node.sh

    # Add the bin directory to the path so we can reference node
    DIR=`pwd`
    PATH=$DIR/../bin:$PATH

    # Use cmake to prepare the make step. Modify the "--DCMAKE_INSTALL_PREFIX"
    # if you wish the install the software at a different location.
    cmake -DCMAKE_INSTALL_PREFIX=/usr/local ../
    # Get an error here? Check the "How do I set the cmake Python version?" question below

    # Compile native code and install npm dependencies
    make
    mkdir ../build
    (cd .. && ./bin/npm install)

    # Install the software at the predefined location
    sudo make install

    # Install default config file
    sudo mkdir -p /etc/shiny-server
    sudo cp ../config/default.config /etc/shiny-server/shiny-server.conf

    # Place a shortcut to the shiny-server executable in /usr/bin
    sudo ln -s /usr/local/shiny-server/bin/shiny-server /usr/bin/shiny-server

    # Create shiny user. On some systems, you may need to specify the full path to 'useradd'
    sudo useradd -r -m shiny

    # Create log, config, and application directories
    sudo mkdir -p /var/log/shiny-server
    sudo mkdir -p /srv/shiny-server
    sudo mkdir -p /var/lib/shiny-server
    sudo chown shiny /var/log/shiny-server
    sudo mkdir -p /etc/shiny-server

    # I added this command
    sudo chown shiny:shiny /var/lib/shiny-server/

## Putting the app on the server

The `/srv/shiny-server` directory is where we house our apps. I recommend creating a new directory: `/srv/shiny-server/FossilSimShinyApp/`.

Then, you can grab the `app.R` file, the `/www/` folder and the `/R/` folder from here and copy them to `/srv/shiny-server/FossilSimShinyApp/`.

## Firewall tweaks

By default, Shiny Server is set to use port 3838. Author’s note: I have no idea why they chose this port.
You’ll need to open the port.
If you are using uncomplicated firewall, you can run the command: `sudo ufw allow 3838`

Furthermore you can change the port used in `/etc/shiny-server/shiny-server.conf`.

## Starting Shiny Server

As you probably noticed, during the installation, we created a new user called shiny. We’ll use this user to start and stop our shiny operations.

Let’s start our shiny server. First, log in as shiny.

    su shiny

If you’ve followed everything correctly, you should be able to start the shiny server by typing:

    shiny-server

    [2022-05-10T13:56:44.320] [INFO] shiny-server - Shiny Server v1.5.19.0 (Node.js v16.14.0)
    [2022-05-10T13:56:44.324] [INFO] shiny-server - Using config file "/etc/shiny-server/shiny-server.conf"
    [2022-05-10T13:56:44.435] [INFO] shiny-server - Starting listener on http://[::]:3838

You should then be able to access your app using any web browser and going to the following web address:

    http:// your ip address :3838/FossilSimShiny/

## Further Reading

- Administrative guide to shiny server