<?xml version="1.0" encoding="UTF-8"?>
<rss  xmlns:atom="http://www.w3.org/2005/Atom" 
      xmlns:media="http://search.yahoo.com/mrss/" 
      xmlns:content="http://purl.org/rss/1.0/modules/content/" 
      xmlns:dc="http://purl.org/dc/elements/1.1/" 
      version="2.0">
<channel>
<title>Mar de Nós</title>
<link>https://mardenos-ufmg.github.io/website/4devs/</link>
<atom:link href="https://mardenos-ufmg.github.io/website/4devs/index.xml" rel="self" type="application/rss+xml"/>
<description>Site do projeto Mar de Nós - UFMG</description>
<generator>quarto-1.8.26</generator>
<lastBuildDate>Fri, 24 Apr 2026 03:00:00 GMT</lastBuildDate>
<item>
  <title>Como funciona o blog do site (e como publicar um post)</title>
  <dc:creator>Carlos de Moura</dc:creator>
  <link>https://mardenos-ufmg.github.io/website/4devs/artigos/como-funciona-blog.html</link>
  <description><![CDATA[ 





<p>O blog deste site funciona de forma simples: todos os posts ficam armazenados em um repositório no <a href="https://github.com/mardenos-ufmg/website-blog">GitHub</a>. Quando o site é renderizado, ele automaticamente lê tudo que está dentro da pasta <code>posts</code>. Isso inclui arquivos <code>.qmd</code> e também imagens (que devem ficar em <code>posts/img</code>).</p>
<p>Ou seja, para publicar um post, basta adicionar um arquivo <code>.qmd</code> dentro da pasta <code>posts</code>. Se houver imagens, elas também devem estar dentro dessa pasta, normalmente em uma subpasta <code>img/</code>. A estrutura básica do repositório é a seguinte.</p>
<pre><code>posts/
├── meu-post.qmd
└── img/
    └── meu-post/
        └── imagem1.png</code></pre>
<section id="como-publicar-um-post" class="level2">
<h2 class="anchored" data-anchor-id="como-publicar-um-post">Como publicar um post</h2>
<p>De forma geral, o processo para publicar um post no blog envolve alguns passos simples. Primeiro, é necessário ter uma conta no GitHub, já que é lá que o conteúdo do site fica armazenado. Em seguida, você deve instalar e configurar o Git no seu computador, que é a ferramenta responsável por enviar arquivos para o repositório. Depois disso, basta clonar o repositório do site para sua máquina, adicionar o novo arquivo <code>.qmd</code> (e eventuais imagens na pasta correta), registrar as alterações e enviá-las de volta ao GitHub. Uma vez feito o envio, o site poderá incorporar automaticamente o novo conteúdo na próxima renderização.</p>
<p>A etapa de configurar as credenciais do GitHub localmente tem alguns detalhes importantes. Assim, citamos materiais auxiliares para usuários de <a href="https://medium.com/@ak4634/a-step-by-step-guide-to-setting-up-your-github-account-on-ubuntu-69143502b7d0">Linux</a> e <a href="https://www.youtube.com/watch?v=NgWExh3bswg">Windows</a>.</p>
<p>Em resumo:</p>
<ul>
<li>O blog lê automaticamente a pasta <code>posts</code></li>
<li>Para publicar: adicionar <code>.qmd</code> + imagens</li>
<li>Usar Git: clone -&gt; add -&gt; commit -&gt; push</li>
</ul>
</section>
<section id="tutorial-de-quarto" class="level2">
<h2 class="anchored" data-anchor-id="tutorial-de-quarto">Tutorial de Quarto</h2>
<p>Um breve tutorial de como escrever arquivos em quarto markdown está disponível <a href="https://quarto.org/">aqui</a>.</p>


</section>

 ]]></description>
  <category>blog</category>
  <category>GitHub</category>
  <category>Quarto</category>
  <guid>https://mardenos-ufmg.github.io/website/4devs/artigos/como-funciona-blog.html</guid>
  <pubDate>Fri, 24 Apr 2026 03:00:00 GMT</pubDate>
</item>
<item>
  <title>Sobre o site</title>
  <dc:creator>Carlos de Moura</dc:creator>
  <link>https://mardenos-ufmg.github.io/website/4devs/artigos/sobre.html</link>
  <description><![CDATA[ 





<section id="introdução" class="level2">
<h2 class="anchored" data-anchor-id="introdução">Introdução</h2>
<p>A Análise Exploratória de Dados (EDA) é o ponto de partida de qualquer projeto de ciência de dados. Neste post, vamos explorar como realizar uma EDA completa usando R e o <code>tidyverse</code>.</p>


</section>

 ]]></description>
  <category>website</category>
  <guid>https://mardenos-ufmg.github.io/website/4devs/artigos/sobre.html</guid>
  <pubDate>Fri, 24 Apr 2026 03:00:00 GMT</pubDate>
</item>
<item>
  <title>Configurando o servidor</title>
  <dc:creator>Carlos de Moura</dc:creator>
  <link>https://mardenos-ufmg.github.io/website/4devs/artigos/estrutura.html</link>
  <description><![CDATA[ 





<p>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.</p>
<section id="shiny-server" class="level2">
<h2 class="anchored" data-anchor-id="shiny-server">shiny server</h2>
<p>A instalação do shiny server está documentada no site da <a href="https://posit.co/download/shiny-server">posit</a>. As instruções necessárias para um servidor shiny estão contidas num arquivo de nome <code>shiny-server.conf</code>, geralmente guardado em <code>/etc/shiny-server</code> Por default, ele vem assim (sem comentários).</p>
<pre><code>run_as shiny;

server {
  listen 3838;

  location / {
    site_dir /srv/shiny-server;
    log_dir /var/log/shiny-server;
    directory_index on;
  }
}
</code></pre>
<p>O argumentos básicos são estes:</p>
<ul>
<li><code>run_as</code> diz em nome de qual usuário a aplicação vai rodar.</li>
<li><code>listen</code> é o número da porta em que o site vai rodar, por default é a 3838 (é bom não mexer niso).</li>
<li><code>site_dir</code> é a pasta onde devem estar os aplicativos shiny; se você tem um aplicativo numa pasta de nome <code>meu_app</code> e colá-la no caminho especificado nesse agumento, a aplicação shiny vai rodar em <code>root:3838/meu_app</code>, em que root é o seu domínio, que pode ser checado via <code>hostname -I</code>.</li>
<li><code>directory_index</code> pode ser <code>on</code> ou <code>off</code>, quando está <code>on</code> aparece uma página com um índice de todos os projetos em <code>site_dir</code> caso o usuário acesse <code>root:3838</code> sem especificar o projeto.</li>
</ul>
<section id="gerenciadores-de-serviços" class="level3">
<h3 class="anchored" data-anchor-id="gerenciadores-de-serviços">Gerenciadores de serviços</h3>
<p>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 <code>service</code> e <code>systemctl</code>. 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 <code>systemctl</code> é um sistema mais moderno que <code>service</code> e alguns comandos úteis desses gerenciadores são mostrados abaixo.</p>
<table class="caption-top table">
<colgroup>
<col style="width: 26%">
<col style="width: 40%">
<col style="width: 32%">
</colgroup>
<thead>
<tr class="header">
<th>Ação</th>
<th>systemctl</th>
<th>service</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>Iniciar serviço</td>
<td><code>systemctl start serviço</code></td>
<td><code>service serviço start</code></td>
</tr>
<tr class="even">
<td>Parar serviço</td>
<td><code>systemctl stop serviço</code></td>
<td><code>service serviço stop</code></td>
</tr>
<tr class="odd">
<td>Reiniciar serviço</td>
<td><code>systemctl restart serviço</code></td>
<td><code>service serviço restart</code></td>
</tr>
<tr class="even">
<td>Recarregar config</td>
<td><code>systemctl reload serviço</code></td>
<td><code>service serviço reload</code></td>
</tr>
<tr class="odd">
<td>Ver status</td>
<td><code>systemctl status serviço</code></td>
<td><code>service serviço status</code></td>
</tr>
<tr class="even">
<td>Habilitar no boot</td>
<td><code>systemctl enable serviço</code></td>
<td><em>(não disponível direto)</em></td>
</tr>
<tr class="odd">
<td>Desabilitar no boot</td>
<td><code>systemctl disable serviço</code></td>
<td><em>(não disponível direto)</em></td>
</tr>
<tr class="even">
<td>Listar serviços</td>
<td><code>systemctl list-units</code></td>
<td><code>service --status-all</code></td>
</tr>
</tbody>
</table>
<p>Também é possível rodar o shiny server em segundo plano via <code>shiny-server &amp;</code>, 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 <code>site_dir</code> default (<code>/srv/shiny-server</code>). Isto é assim porque alterações nas pastas raízes precisam de permissões de administrador (o famoso <code>sudo</code>).</p>
<p>Para contornar isso, podemos especificar um <code>site_dir</code> numa pasta em <code>~</code>, no nosso caso optamos por <code>~/website</code>. Parte do problema da ausência de um gerenciador é solucionada pelo argumento <code>log_dir</code>, pasta na qual serão armazenados os logs do shiny server. O arquivo com a configuração do sistema pode ser visto <a href="https://raw.githubusercontent.com/mardenos-ufmg/website/refs/heads/main/conf/shiny-server.conf">aqui</a>. Um servidor personalizado pode ser executado via <code>shiny-server caminho/para/shiny-server.conf &amp;</code>, o que não pode ser feito diretamente via <code>service</code> ou <code>systemctl</code>.</p>
</section>
</section>
<section id="nginx" class="level2">
<h2 class="anchored" data-anchor-id="nginx">nginx</h2>
<p><a href="https://nginx.org">nginx</a> é um servidor web amplamente usado na internet que aqui é usado para gerenciar as páginas estáticas do projeto.</p>
<section id="mudando-a-máscara-dos-shiny-apps" class="level3">
<h3 class="anchored" data-anchor-id="mudando-a-máscara-dos-shiny-apps">Mudando a máscara dos shiny apps</h3>
<p>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 <code>3838</code>. Se <code>*nome_app*</code> - por exemplo - é o nome de uma palicação, então isso ficará disponível em <code>dominio:3838/*nome_app*</code>, em que <code>dominio</code> é a URL raíz, como <code>http://127.0.0.1</code> ou <code>http://site.com</code>. Para que o usuário tenha uma melhor experiência ao navegar pelo site, gostaríamos que essa aplicação ficasse disponível em <code>dominio/*nome_app*</code>(sem número da porta).</p>
<p>Ao executar <code>sudo nano /etc/nginx/sites-available/default</code>, aparecerá algo como o trecho abaixo.</p>
<pre><code>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;
    }

}</code></pre>
<p>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 <code>*nome_app*</code>, o seguinte snippet deve ser adicionado na seção <code>server</code> do arquivo <code>/etc/nginx/sites-available/default</code>. Atenção, o arquivo em questão não deve ser substituído pelo código abaixo, isso deve apenas ser adicionado ao arquivo.</p>
<pre><code>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;
    }</code></pre>
</section>
<section id="deploying-on-one-click" class="level3">
<h3 class="anchored" data-anchor-id="deploying-on-one-click">Deploying (on one click)</h3>
<p>Em nosso projeto há um arquivo chamado <a href="https://raw.githubusercontent.com/mardenos-ufmg/website/refs/heads/main/conf/deploy.sh">deploy.sh</a> que contém uma série de comandos bash que automatizam certas tarefas. Grosso modo, este arquivo está assim.</p>
<pre><code>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</code></pre>
<p>Três coisas estão acontecendo aqui:</p>
<ul>
<li>O projeto é renderizado.</li>
<li>Todos os arquivos em <code>/var/www/html</code> são apagados e os arquivos de output do website são copiados para lá. O diretório <code>/var/www/html</code> é onde o servidor nginx busca os arquivos do site.</li>
<li>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 <code>conf/shiny-server.conf</code>.</li>
</ul>
<p>Como os arquivos em <code>/var</code> são restritos, é necessário rodar essa série de comandos com permissões de administrador, assim <code>sudo bash ~/website/conf/deploy.sh &amp;</code>. 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 <code>website/_site</code>, como fizemos com o arquivo <code>shiny-server.conf</code>.</p>
</section>
<section id="sobre-autoindex" class="level3">
<h3 class="anchored" data-anchor-id="sobre-autoindex">Sobre autoindex</h3>
<p>Ainda em <code>/etc/nginx/sites-available/default</code> é possível adicionar a seginte configuração de autoindex.</p>
<pre><code>    location /autoindex {
    root /var/www;
    autoindex on;
    autoindex_exact_size on;
    autoindex_localtime on;
}</code></pre>
<p>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 <code>dominio/autoindex</code>. Para automatizar essa tarefa, esse código consta no <code>deploy.sh</code>.</p>
<pre><code>rm -rf /var/www/autoindex
mkdir -p /var/www/autoindex
cp -r ~/website/autoindex/. /var/www/autoindex</code></pre>


</section>
</section>

 ]]></description>
  <category>servidor</category>
  <category>hospedagem</category>
  <category>nginx</category>
  <category>shiny server</category>
  <guid>https://mardenos-ufmg.github.io/website/4devs/artigos/estrutura.html</guid>
  <pubDate>Mon, 20 Apr 2026 03:00:00 GMT</pubDate>
</item>
<item>
  <title>Referências técnicas</title>
  <dc:creator>Carlos de Moura</dc:creator>
  <link>https://mardenos-ufmg.github.io/website/4devs/artigos/fontes.html</link>
  <description><![CDATA[ 





<section id="referências" class="level2">

<ul>
<li>https://www.nginx.com/resources/wiki/start/</li>
<li>https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/</li>
<li>https://wiki.debian.org/Nginx/DirectoryStructure</li>
<li>https://docs.posit.co/shiny-server/</li>
<li>https://shiny.posit.co/r/articles/share/shiny-server/</li>
<li>https://docs.posit.co/shiny-server/#host-a-directory-of-applications</li>
<li>https://cliente.hostgator.com.br/dominios/dns-wizard</li>
<li>https://suporte.hostgator.com.br/hc/pt-br/articles/30810621770387-Como-configurar-o-DNS-de-um-dom%C3%ADnio</li>
</ul>


</section>

 ]]></description>
  <category>nginx</category>
  <category>shiny server</category>
  <category>servidor</category>
  <guid>https://mardenos-ufmg.github.io/website/4devs/artigos/fontes.html</guid>
  <pubDate>Sun, 19 Apr 2026 03:00:00 GMT</pubDate>
</item>
</channel>
</rss>
