O Raspberry Pi é um mini computador do tamanho de um cartão de crédito, que pode ter diversas utilidades. É bastante indicado para quem deseja aprender a programar e não quer investir num hardware mais caro. No início de 2019 decidi comprar um (modelo 3 B+) para ter contato com linux e desenvolver alguns projetos que eu tinha em mente. Um deles era instalar o shiny server open souce nele e utiliza-lo como servidor web para algumas das minhas aplicações feitas no shiny.

Neste tutorial vou ensinar como instalar o shiny server open souce num Raspberry Pi. Eu utilizei como sistema operacional o raspbian stretch e acessei o Raspberry Pi pelo VNC Viewer com o meu notebook. O cartão de memória que utilizei foi um Kingston 16GB classe 10.


Vamos lá…

Primeiro vamos atualizar nosso sistema.

sudo apt update && sudo apt full-upgrade

Adicionando memória SWAP no Raspberry. Como o Raspberry 3 B+ tem apenas 1GB de memória RAM, é importante adicionar mémoria SWAP para ajudar nessa limitação.

sudo /bin/dd if=/dev/zero of=/var/swap.1 bs=1M count=3072
sudo /sbin/mkswap /var/swap.1
sudo /sbin/swapon /var/swap.1
sudo sh -c 'echo "/var/swap.1 swap swap defaults 0 0 " >> /etc/fstab'

Configurando memória SWAP.

sudo nano /etc/sysctl.conf

adicionando o seguinte código na última linha do arquivo:

vm.swappiness=10

Instalando o R. A versão presente na biblioteca do Raspberry é a 3.3.3, verifique se as aplicações que você deseja hospedar no servidor utilizam pacotes que não são compatíveis com essa versão do R. No meu caso essa versão já é o suficente para rodar as aplicações que tenho. Se deseja utilizar uma versão mais nova do R é preciso instalar o programa direto da fonte. Alguns autores das minhas referências fizeram isso e documentaram, basta apenas replicar os comandos da sessão de instalar o R.

sudo apt-get install r-base r-base-core r-base-dev

Instalando pacotes. Esses são necessários para que o nosso shiny server funcione corretamente. Caso sua aplicação precise de mais pacotes você deverá instala-los da mesma forma que esses. Esta operação é a mais demorada do tutorial e a que exige mais memória do raspberry.

sudo su - -c "R -e \"install.packages('later', repos='http://cran.rstudio.com/')\""
sudo su - -c "R -e \"install.packages('fs', repos='http://cran.rstudio.com/')\""
sudo su - -c "R -e \"install.packages('Rcpp', repos='http://cran.rstudio.com/')\""
sudo su - -c "R -e \"install.packages('httpuv', repos='http://cran.rstudio.com/')\""
sudo su - -c "R -e \"install.packages('mime', repos='http://cran.rstudio.com/')\""
sudo su - -c "R -e \"install.packages('jsonlite', repos='http://cran.rstudio.com/')\""
sudo su - -c "R -e \"install.packages('digest', repos='http://cran.rstudio.com/')\""
sudo su - -c "R -e \"install.packages('htmltools', repos='http://cran.rstudio.com/')\""
sudo su - -c "R -e \"install.packages('xtable', repos='http://cran.rstudio.com/')\""
sudo su - -c "R -e \"install.packages('R6', repos='http://cran.rstudio.com/')\""
sudo su - -c "R -e \"install.packages('Cairo', repos='http://cran.rstudio.com/')\""
sudo su - -c "R -e \"install.packages('sourcetools', repos='http://cran.rstudio.com/')\""
sudo su - -c "R -e \"install.packages('shiny', repos='http://cran.rstudio.com/')\""
sudo su - -c "R -e \"install.packages('rmarkdown', repos='http://cran.rstudio.com/', dependencies = TRUE)\""

Instalando o cmake. Sempre consultar a versão mais recente no site https://cmake.org/files/.

wget https://cmake.org/files/v3.15/cmake-3.15.3.tar.gz # Check for the latest version on https://cmake.org/files/
tar xzf cmake-3.15.3.tar.gz
cd cmake-3.15.3
./configure; make
sudo make install
cd

Agora vamos começar a instalar o shiny server. O shiny server atualmente só fornece binário pré construído para a arquitetura de 64 bits de alguns sistemas operacionais linux, ou seja, não há como instalar da maneira mais comum. Para instalar o shiny server no Raspberry Pi que utiliza uma arquitetura ARM e um sistema operacional próprio é preciso criar o shiny server a partir de sua fonte disponível no github.

git clone https://github.com/rstudio/shiny-server.git
cd shiny-server
DIR=`pwd`
PATH=$DIR/bin:$PATH
mkdir tmp
cd tmp
PYTHON=`which python`

$PYTHON --version # verifique se a versão do seu python é 2.6.X ou 2.7.X. Caso contrario nao funcionará
# se por acaso sua versao do python for diferente das versões mencionadas use PYTHON=`which python26`

sudo cmake -DCMAKE_INSTALL_PREFIX=/usr/local -DPYTHON="$PYTHON" ../
sudo make
mkdir ../build
sed -i '8s/.*/NODE_SHA256=af2106b08f68e0884caa505ea7e695facc5b4cd356f1e08258899e94cc4c5df0/' ../external/node/install-node.sh # node-v10.15.3-linux-armv7l.tar.xz
sed -i 's/linux-x64.tar.xz/linux-armv7l.tar.xz/' ../external/node/install-node.sh
(cd .. && sudo ./external/node/install-node.sh)
(cd .. && ./bin/npm --python="${PYTHON}" install --no-optional)
(cd .. && ./bin/npm --python="${PYTHON}" rebuild)
sudo make install
cd
sudo ln -s /opt/shiny-server/bin/shiny-server /usr/bin/shiny-server
sudo useradd -r -m shiny
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
cd
sudo wget \
https://raw.githubusercontent.com/rstudio/shiny-server/master/config/default.config \
-O /etc/shiny-server/shiny-server.conf
sudo chmod 777 -R /srv

Adicionando parâmetros aos shiny-server.service (autostart).

sudo nano /lib/systemd/system/shiny-server.service 

Cole estes códigos e salve o arquivo.

#!/usr/bin/env bash
[Unit]
Description=ShinyServer
[Service]
Type=simple
ExecStart=/usr/bin/shiny-server
Restart=always
# Environment="LANG=en_US.UTF-8"
ExecReload=/bin/kill -HUP $MAINPID
ExecStopPost=/bin/sleep 5
RestartSec=1
[Install]
WantedBy=multi-user.target

Configurando o autostart e iniciando o shiny server.

sudo chown shiny /lib/systemd/system/shiny-server.service
sudo systemctl daemon-reload
sudo systemctl enable shiny-server
sudo systemctl start shiny-server

Adicionando permissões aos usuários.

sudo groupadd shiny-apps
sudo usermod -aG shiny-apps pi
sudo usermod -aG shiny-apps shiny
cd /srv/shiny-server
sudo chown -R pi:shiny-apps .
sudo chmod g+w .
sudo chmod g+s .

Adicionando exemplos.

mkdir /srv/shiny-server/sample-apps
sudo cp -r shiny-server/samples/sample-apps/* /srv/shiny-server/sample-apps
sudo cp shiny-server/samples/welcome.html /srv/shiny-server/index.html

Adicionando o pandoc e o pandoc-citeproc para dentro do shiny-server.

cd
sudo apt-get install pandoc
sudo apt-get install pandoc-citeproc
sudo cp /usr/bin/pandoc /usr/local/shiny-server/ext/pandoc
sudo cp /usr/bin/pandoc-citeproc /usr/local/shiny-server/ext/pandoc-citeproc
cd
sudo systemctl restart shiny-server

Para visualizar se tudo está ocorrendo bem com o seu servidor execute esse comando. (A mensagem de warning é normal).

sudo shiny-server

Se tudo ocorreu bem seu shiny server estará pronto para uso. Para visualizar vá até um navegador (pode ser do Raspberry ou de qualquer navegador conectado a mesma rede de internet que o Raspberry) e acesse esse endereço (Necessário saber o IP do seu Raspberry).

seuIP:3838

Caso tudo tenha ocorrido bem e você conseguiu vizualizar a página defaut do shiny-server, seu servidor para apps shiny está funcionando perfeitamente e pronto para uso. Para adicionar suas aplicações ao servidor basta adicionar os arquivos necessários para sua aplicação rodar dentro de uma pasta sample-apps em:

/srv/shiny-server/sample-apps

Referências

https://community.rstudio.com/t/setting-up-your-own-shiny-server-rstudio-server-on-a-raspberry-pi-3b/18982

https://blog.adelmofilho.com/2019-03-07-raspberry/

https://steemit.com/tutorial/@m4rk.h4nn4/how-to-install-and-run-shiny-server-on-the-raspberry-pi-3-and-raspian-jassie-lite

http://www.gayantha.net/Shiny_Server.html