Configurando o servidor
Como configurar o servidor para hospedar o site
Esta plataforma funciona sob o paradigma de conter todo o código num só diretório, com o mínimo de alterações no ambiente do servidor. Como estamos usando dois servidores - server shiny para os dashboards e nginx para a parte estática -, depender do mínimo de coisas do ambiente do servidor parece ser uma boa escolha de design. Aparentemente é possível guardar páginas estáticas num shiny server. Embora pareça uma boa ideia depender apenas de um servidor, não está claro para nós se é possível guardar páginas estáticas num shiny server sem que ele incie uma nova sessão de R para cada novo acesso (o que é muito custoso). Além disso, o nginx é uma opção antiga, simples e customizável para servidores, com vasta documentação online. Por conta disso, fizemos a escolha por nginx combinado com shiny server.
shiny server
A instalação do shiny server está documentada no site da posit. As instruções necessárias para um servidor shiny estão contidas num arquivo de nome shiny-server.conf, geralmente guardado em /etc/shiny-server Por default, ele vem assim (sem comentários).
run_as shiny;
server {
listen 3838;
location / {
site_dir /srv/shiny-server;
log_dir /var/log/shiny-server;
directory_index on;
}
}
O argumentos básicos são estes:
run_asdiz em nome de qual usuário a aplicação vai rodar.listené o número da porta em que o site vai rodar, por default é a 3838 (é bom não mexer niso).site_diré a pasta onde devem estar os aplicativos shiny; se você tem um aplicativo numa pasta de nomemeu_appe colá-la no caminho especificado nesse agumento, a aplicação shiny vai rodar emroot:3838/meu_app, em que root é o seu domínio, que pode ser checado viahostname -I.directory_indexpode seronouoff, quando estáonaparece uma página com um índice de todos os projetos emsite_dircaso o usuário acesseroot:3838sem especificar o projeto.
Gerenciadores de serviços
Em servidores linux, há a necessidades de rodar processos em segundo plano, como servidores shiny e nginx. Nesse contexto são usados gerenciadores de serviços do sistema, como service e systemctl. Dentre outras coisas, esses gerenciadores permitem a execução de serviços em segundo plano, a incialização automática de serviços após boot, o gerenciamento de logs, e a padronização de comandos. O systemctl é um sistema mais moderno que service e alguns comandos úteis desses gerenciadores são mostrados abaixo.
| Ação | systemctl | service |
|---|---|---|
| Iniciar serviço | systemctl start serviço |
service serviço start |
| Parar serviço | systemctl stop serviço |
service serviço stop |
| Reiniciar serviço | systemctl restart serviço |
service serviço restart |
| Recarregar config | systemctl reload serviço |
service serviço reload |
| Ver status | systemctl status serviço |
service serviço status |
| Habilitar no boot | systemctl enable serviço |
(não disponível direto) |
| Desabilitar no boot | systemctl disable serviço |
(não disponível direto) |
| Listar serviços | systemctl list-units |
service --status-all |
Também é possível rodar o shiny server em segundo plano via shiny-server &, embora isso não tenha todas as vantagens de um gerenciador, a vantagem dessa abordagem é que ela permite especificar qual o arquivo de configuração de sistema do shiny server. Isso é necessário em parte porque é difícil fazer alterações nos aplicativos se eles estiverem armazenados site_dir default (/srv/shiny-server). Isto é assim porque alterações nas pastas raízes precisam de permissões de administrador (o famoso sudo).
Para contornar isso, podemos especificar um site_dir numa pasta em ~, no nosso caso optamos por ~/website. Parte do problema da ausência de um gerenciador é solucionada pelo argumento log_dir, pasta na qual serão armazenados os logs do shiny server. O arquivo com a configuração do sistema pode ser visto aqui. Um servidor personalizado pode ser executado via shiny-server caminho/para/shiny-server.conf &, o que não pode ser feito diretamente via service ou systemctl.
nginx
nginx é um servidor web amplamente usado na internet que aqui é usado para gerenciar as páginas estáticas do projeto.
Mudando a máscara dos shiny apps
Uma das alterações no ambiente do servidor que é necessária para um uso mais agradável do site é a criação de máscaras para as aplicações Shiny. Por padrão, o shiny server guarda as aplicações na porta 3838. Se *nome_app* - por exemplo - é o nome de uma palicação, então isso ficará disponível em dominio:3838/*nome_app*, em que dominio é a URL raíz, como http://127.0.0.1 ou http://site.com. Para que o usuário tenha uma melhor experiência ao navegar pelo site, gostaríamos que essa aplicação ficasse disponível em dominio/*nome_app*(sem número da porta).
Ao executar sudo nano /etc/nginx/sites-available/default, aparecerá algo como o trecho abaixo.
server {
listen 80 default_server;
listen [::]:80 default_server
root /var/www/html;
index index.html
location /dashboards/arvore/ {
proxy_pass http://127.0.0.1:3838/arvore/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 20d;
}
}
A criação do que estamos chamando de ‘máscara’ nada mais é que uma especificação de caminho. Como isso fica num local fora da raíz do projeto, optamos por não automatizar a criação dessas máscaras, apenas explicar o procedimento nesse artigo. Para um novo dashboard shiny chamado *nome_app*, o seguinte snippet deve ser adicionado na seção server do arquivo /etc/nginx/sites-available/default. Atenção, o arquivo em questão não deve ser substituído pelo código abaixo, isso deve apenas ser adicionado ao arquivo.
location /dashboards/*nome_app*/ {
proxy_pass http://127.0.0.1:3838/*nome_app*/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 20d;
}
Deploying (on one click)
Em nosso projeto há um arquivo chamado deploy.sh que contém uma série de comandos bash que automatizam certas tarefas. Grosso modo, este arquivo está assim.
quarto render ~/website
rm -rf /var/www/html/*
cp -r ~/website/_site/. /var/www/html
sudo pkill -f shiny-server || true
shiny-server ~/website/conf/shiny-server.conf
Três coisas estão acontecendo aqui:
- O projeto é renderizado.
- Todos os arquivos em
/var/www/htmlsão apagados e os arquivos de output do website são copiados para lá. O diretório/var/www/htmlé onde o servidor nginx busca os arquivos do site. - Processos antigos do shiny server são encerrados (de maneira meio rudimentar) e uma nova instância do shiny server é inicializada com as configurações de
conf/shiny-server.conf.
Como os arquivos em /var são restritos, é necessário rodar essa série de comandos com permissões de administrador, assim sudo bash ~/website/conf/deploy.sh &. Usar esse recurso de um arquivo bash é necessário pois não é possível criar um arquivo com configurações do nginx, para - dentre outras coisas - apontar o site para website/_site, como fizemos com o arquivo shiny-server.conf.
Sobre autoindex
Ainda em /etc/nginx/sites-available/default é possível adicionar a seginte configuração de autoindex.
location /autoindex {
root /var/www;
autoindex on;
autoindex_exact_size on;
autoindex_localtime on;
}
O Autoindex é um recurso que gera automaticamente uma página listando os arquivos de um diretório (gerando inclusive um arquivo de index.html). Isso permite navegar e baixar conteúdos diretamente pelo navegador e é útil para transmitir pastas estruturadas. No diretório do website, há uma pasta chamada autoindex e tudo nela deve ficar disponível em dominio/autoindex. Para automatizar essa tarefa, esse código consta no deploy.sh.
rm -rf /var/www/autoindex
mkdir -p /var/www/autoindex
cp -r ~/website/autoindex/. /var/www/autoindex