I recently embarked upon the strange, complicated journey of building a personal Shiny server. This is how I did it:
Step 1: Amazon Web Services Account
Sign up for one. AWS has a generous free tier: you get enough computing time on EC2 to run a small server continuously every month for a year. After your year is up, they’ll start charging you for the server, but it isn’t expensive. (For comparison, I’m running a t2-micro, which runs full-time about $9.50/month).
Step 2: Provision an EC2 Instance
Once you’ve set up your AWS account (complete with credit card information, uncomfortable as that may be), head over to the EC2 Launch Wizard. Select the “Ubuntu Server 14.04 LTS (HVM), SSD Volume Type”. Most of the default configuration settings will be good enough, so just click “Next” through steps 3, 4 and 5. Step 6 (“Configure Security Groups”) is rather important, so let’s stop there a moment. It will allow SSH connections by default, but this isn’t permissive enough. We need to be able to connect using HTTP (so people who visit the server on the web will be able to see things). Click “Add Rule” and select “HTTP” from the dropdown on the left. If you want to install RStudio, do this one more time, only leave the left dropdown alone and put 8787 in the “Port Range” box, and “Anywhere” on the dropdown on the right. Here’s what this configuration should look like:
Click “Review and Launch.” Now, when you click “Launch” on the next screen, it doesn’t immediately launch your new virtual machine. Instead, it brings up a VERY IMPORTANT dialogue. Here’s what it looks like:
Be absolutely certain that you create a new Key Pair, name it, and download it somewhere you’ll be able to find it. Once you’ve done that, you click “Launch Instances” and your instance will start booting up. Go to the Instances Screen to see your server.
Step 3: SSH to your new Instance
From the instances screen, you can see a bunch of information about the server. The only thing about which we’re interested is the Public IP, which should be in one of the rightwardly columns. Copy that IP Address so you can paste it into the command below.
If you’re on an Apple or *nix system, just open a terminal emulator, cd to the directory where you downloaded that secret key, and enter this:
ssh -i RStudio.pem ubuntu@YOUR.PUBLIC.IP
…where YOUR.PUBLIC.IP is the IP address you copied from the beginning of this step. This should give you a welcome message and a command prompt controlling the server.
If you have any problems, you can right-click on your instance in the instances menu and select “Connect”, which will give you much more verbose instructions about how to do this. Plus a handy Java Applet if you are overcome by despair!
Step 4: Install R
From your SSH connection, let’s install R. Ubuntu provides a version of R, but they don’t keep it up to date, so we want to add a CRAN link to our sources list.
sudo echo 'deb http://cran.rstudio.com/bin/linux/ubuntu trusty/' >> /etc/apt/sources.list
Now, we need to add the security key for R, update the software list, and install R:
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E084DAB9
sudo apt-get update
sudo apt-get -y install r-cran
Step 5 (optional): Install RStudio
You don’t need RStudio to have or run Shiny Server, but it’s incredibly convenient to have both running on the same server. That way, you have an R console that can edit the files in-place, and changes can be tested as quickly as you can change tabs and refresh.
RStudio maintains the step-by-step guide to installing RStudio, but here’s the short list of commands you need to run:
sudo apt-get -y install gdebi-core libapparmor1
sudo gdebi rstudio-server-0.98.1103-amd64.deb
This gets RStudio on your system, but it doesn’t permit logins by default. That’s because it uses a password for authentication, but the only eligible user on the system (ubuntu) is only configured to login by private key (remember that RStudio.pem file?). To create a password for yourself:
sudo passwd ubuntu
> Enter new UNIX password:
> Retype new UNIX password:
> passwd: password updated successfully
Remember that password: whenever you go to your RStudio instance, you’ll need it to login. Which, by the way, you are now able to do. Open your web browser and surf to http://YOUR.PUBLIC.IP:8787/ and enter username “ubuntu” and that password you just set. You should now be looking at the glorious RStudio interface, right in your browser! Take a moment to rejoice.
Step 6: Install Shiny Server
Once again, RStudio maintains the step-by-step guide to installing Shiny Server, but here’s the shortlist of requisite commands:
sudo su - -c "R -e \"install.packages(c('shiny','rmarkdown'), repos='http://cran.rstudio.com/')\""
sudo apt-get -y install gdebi-core
sudo gdebi shiny-server-184.108.40.2063-amd64.deb
Step 7: Configure Shiny Server
Check out the Administrator’s guide for much more detailed instructions. Here are the only two config changes I made:
When it’s installed, Shiny server creates a new user on the system. This is all well and good, but it means that you’re going to get weird permissions errors that you can only fix by prepending ‘sudo’ to most of your commands, which is generally bad practice. Furthermore, R packages are local to users, meaning that any packages you install using RStudio (if you installed RStudio Server) won’t be accessible to your Shiny Applications. Thus, to fix all this, run these commands:
sudo sed -i 's/run_as shiny;/run_as ubuntu;/g' /etc/shiny-server/shiny-server.conf
sudo chown -R ubuntu /srv/shiny-server/
sudo chgrp -R ubuntu /srv/shiny-server/
When you type in a URL, it doesn’t usually contain a port number. By default, HTTP uses port 80, so http://aaboyles.com is (usually) equivalent to http://aaboyles.com:80. Shiny server, however, uses port 3838 by default. If you want to give out an address without a port for the Shiny Apps you host, you should change the port number in the Shiny Configuration file. To do that, run this command:
sudo sed -i 's/3838/80/g' /etc/shiny-server/shiny-server.conf
sudo shiny-server restart
You should be able to visit http://YOUR.PUBLIC.IP and see the Shiny Server landing page, complete with two demo apps.
Step 8: Load up your Shiny Apps
The easiest way to get Shiny apps is usually to clone them with git, so let’s install git, and cd into the server’s served directory:
sudo apt-get -y install git
From here, you only need to git clone your shiny apps, and they’ll be publically available at http://YOUR.PUBLIC.IP/REPO.
Rejoice! Bask in the glory of your greatness! You have conquered Shiny Server!