<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ Diego Crescêncio - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Aprenda a codificar - de graça. Tutoriais de programação em Python, JavaScript, Linux e muito mais. ]]>
        </description>
        <link>https://www.freecodecamp.org/portuguese/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ Diego Crescêncio - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/portuguese/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Mon, 25 May 2026 19:55:28 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/portuguese/news/author/diego/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Como implementar uma aplicação do React em produção usando Docker, NGINX e APIs ]]>
                </title>
                <description>
                    <![CDATA[ Neste artigo, você vai aprender como implementar (eminglês, deploy) uma aplicação desenvolvida com React em produção. Vamos utilizar o Docker e o NGINX para assegurar nossas chaves de acesso da API e requisições de proxy, a fim de prevenir ataques de Cross-Origin Resource Sharing [https://pt.wikipedia.org/wiki/Cross-origin_resource_sharing] (CORS). No final do artigo, ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/como-implementar-uma-aplicacao-do-react-em-producao-usando-docker-nginx-e-apis/</link>
                <guid isPermaLink="false">642f6ac286dbbe0599dbb2ca</guid>
                
                    <category>
                        <![CDATA[ React ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Diego Crescêncio ]]>
                </dc:creator>
                <pubDate>Sun, 21 Apr 2024 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2024/04/fringer-cat-hddmXlPaFGo-unsplash.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/how-to-deploy-react-apps-to-production/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Deploy a React App to Production Using Docker and NGINX with API Proxies</a>
      </p><p>Neste artigo, você vai aprender como implementar (eminglês, <em>deploy</em>) uma aplicação desenvolvida com React em produção. Vamos utilizar o Docker e o NGINX para assegurar nossas chaves de acesso da API e requisições de proxy, a fim de prevenir ataques de <a href="https://pt.wikipedia.org/wiki/Cross-origin_resource_sharing">Cross-Origin Resource Sharing</a> (CORS).</p><p>No final do artigo, você pode conferir o código e um vídeo relacionado.</p><h3 id="o-que-voc-vai-aprender-neste-artigo">O que você vai aprender neste artigo</h3><p>Em todo ciclo de vida do projeto de software, chega a hora de publicá-lo. Porém, nem sempre é óbvio como fazê-lo. O ambiente de produção é diferente do ambiente de desenvolvimento. A maioria das aplicações consome algum tipo de API – por vezes, hospedada em diferentes servidores.</p><p>Como desenvolvedores, precisamos resolver potenciais riscos de CORS. Às vezes, acabamos construindo um <em>back-end</em> desnecessariamente. Eu acredito que desenvolvedores devem manter suas aplicações simples, cortando todas as partes redundantes.</p><p>Neste artigo, vou mostrar como eu preparo minhas aplicações desenvolvidas em React para implantar em produção. </p><p>Eu poderia demonstrar uma aplicação simples, mas isso seria pouco útil. Portanto, decidi criar uma aplicação que consome dados de uma API real, a fornecida pela <a href="https://fred.stlouisfed.org/docs/api/fred/">Divisão de Pesquisa Econômica do Federal Reserve Bank of Saint Louis</a>. A API requer uma chave de acesso para obter dados, e os <em>endpoints</em> estão protegidos contra vulnerabilidades de CORS.</p><p><strong>Observação</strong>: se sua aplicação é baseada em rederização no servidor (SSR, em inglês, <em>server-side rendering</em>), <strong>esta não é a melhor estratégia de implantação</strong>. Você, provavelmente, precisará de algum tipo de <em>back-end</em>.</p><h2 id="pr-requisitos">Pré-requisitos</h2><p>É importante que você tenha conhecimento básico de como construir aplicações em React e conheça os fundamentos de Docker antes de seguir as instruções deste artigo. Caso você precise revisar esses conteúdos, acesse esses conteúdos do FreeCodeCamp (ambos em inglês):</p><ul><li><a href="https://www.freecodecamp.org/news/a-beginner-friendly-introduction-to-containers-vms-and-docker-79a9e3e119b/">A Beginner-Friendly Introduction to Containers, VMs and Docker</a>, de <a href="https://twitter.com/iam_preethi">@iam_preethi</a></li><li><a href="https://www.freecodecamp.org/news/create-react-app-crash-course/">Create React App Crash Course</a></li></ul><h2 id="construindo-a-aplica-o-em-react">Construindo a aplicação em React</h2><p>Eu criei uma aplicação simples usando o comando <a href="https://legacy.reactjs.org/docs/create-a-new-react-app.html#create-react-app">create-react-app</a>. A única funcionalidade da aplicação será exibir um gráfico que representa o produto interno bruto (PIB) dos Estados Unidos da América.</p><p><strong>Observação:</strong> &nbsp;a documentação legada do React recomenda o uso do <em>create-react-app</em> para aplicações de página única (SPA– do inglês, <em>single page applications</em>) ou para quem esta aprendendo React.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/04/fredapp.png" class="kg-image" alt="fredapp" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/04/fredapp.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/04/fredapp.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2024/04/fredapp.png 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/04/fredapp.png 2276w" sizes="(min-width: 1200px) 1200px" width="2276" height="1600" loading="lazy"></figure><p>A aplicação obtém dados somente desta API:</p><pre><code>https://api.stlouisfed.org/fred/series/observations?series_id=GDPCA&amp;frequency=a&amp;observation_start=1999-04-15&amp;observation_end=2021-01-01&amp;file_type=json&amp;api_key=abcdefghijklmnopqrstuvwxyz123456</code></pre><p>Os parametros são:</p><ul><li><code>series_id</code> – o identificador das séries. <code>GDPCA</code> se refere à "GDP real".</li><li><code>frequency</code> – a agregação do dado. O <code>a</code> se refere à "anual".</li><li><code>observation_start</code> – o início do período observado.</li><li><code>observation_end</code> – o fim do período observado.</li><li><code>file_type</code> – o formato do dado. O padrão é <code>xml</code>.</li><li><code>api_key</code> – A chave da API é requerida para obter dados. Você pode solicitar uma chave de acesso aqui: <a href="https://fred.stlouisfed.org/docs/api/api_key.html">veja uma aqui</a>.</li></ul><p>Para mais detalhes, consulte a <a href="https://fred.stlouisfed.org/docs/api/fred/series_observations.html">documentação</a>.</p><p>Como nem tudo é perfeito, o projeto da API também não é. Nessa API, é necessário que o desenvolvedor envie a chave de acesso e o retorno vem como parâmetros de URL.</p><p>Enviar o código como parâmetro não é um problema para nós. Entretanto, o vazamento da chave da API pode ser um problema! Imagine que alguém pode interceptar a busar da API, realizando procedimentos abusivos. Ninguém quer correr esse risco, certo?</p><p>Vamos assumir que a chave da API não é um problema. Ainda assim, é possível abusar da API. A API FRED tem proteção contra requisições interdomínio (do inglês, <em>cross-domain request</em>). Portanto, você obtém os seguintes erros se tentar acessá-la de um domínio externo:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/04/frederror.png" class="kg-image" alt="frederror" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/04/frederror.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/04/frederror.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2024/04/frederror.png 1600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w2400/2024/04/frederror.png 2400w" sizes="(min-width: 1200px) 1200px" width="2440" height="1710" loading="lazy"></figure><p>Muitos desenvolvedores podem sugerir o emprego de uma aplicação intermediária (<em>middleware</em>) para requisitar a API e filtrar conteúdo sensível via proxy. Podem dizer que precisam ampliar as funcionalidades futuras e, de certa maneira, essa é uma boa abordagem.</p><p>Entretanto, eu prefiro construir minhas aplicações seguindo um dos princípios da vertente da <a href="https://pt.wikipedia.org/wiki/Programação_extrema">Programação Extrema</a> (do inglês, <em>Extreme Programming</em>). Um dos tantos princípios se trata de "você não vai precisar disso", que prega evitar a adição de muitas funcionalidades, principalmente as que "você talvez nunca use" (<a href="https://en.wikipedia.org/wiki/You_aren%27t_gonna_need_it">YAGNI way</a>). Portanto, vou evitar construir um <em>back-end</em> até ser necessário, ou no nosso caso, "nunca ser necessário".</p><h2 id="vamos-usar-o-nginx-">Vamos usar o NGINX!</h2><p>Eu sou fã do <a href="https://www.nginx.com">NGINX</a> porque ele traz a simplicidade de uso. O NGINX permite que você prepare um servidor web de nível de produção, com funcionalidade HTTP2, compressão, TLS etc.</p><p>Podemos chegar a configurações robustas com poucas linhas de código. Veja o exemplo abaixo:</p><pre><code class="language-none">...

http {
    ...

    server {
        ...

        location /api {
            set         $args   $args&amp;&amp;file_type=json&amp;api_key=abcdefghijklmnopqrstuvwxyz123456;
            proxy_pass  https://api.stlouisfed.org/fred/series;
        }
    }
}</code></pre><p>Essas quatro linhas de código são todo o necessário para ocultar nossa chave API e suprimir errros de CORS. Agora, todo o tráfego HTTP para <code>/api</code> será enviado para a FRED API e apenas a nossa aplicação esta habilitada a consumir estes dados. Todas as outras requisições externas vão obter erro de CORS.</p><blockquote>Para se livrar dos excessos, eu troquei todo o conteúdo do arquivo por <code>...</code>. Você pode encontrar a versão completa no meu <strong>GitHub </strong><em>ou no</em><strong> vídeo </strong>(links abaixo).</blockquote><p>Agora, nosso ponto de acesso (<em>endpoint</em>) é: </p><pre><code>/api/observations?series_id=GDPCA&amp;frequency=a&amp;observation_start=1999-04-15&amp;observation_end=2021-01-01</code></pre><p>Agora não é necessário passar os parâmetros <code>api_key</code> nem <code>file_type</code> para obter dados. Além disso, ninguém pode acessar a chave de acesso a partir do URL, o que torna o processo seguro.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/04/Screen-Shot-2021-03-14-at-12.49.55.png" class="kg-image" alt="Screen-Shot-2021-03-14-at-12.49.55" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/04/Screen-Shot-2021-03-14-at-12.49.55.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/04/Screen-Shot-2021-03-14-at-12.49.55.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2024/04/Screen-Shot-2021-03-14-at-12.49.55.png 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/04/Screen-Shot-2021-03-14-at-12.49.55.png 2072w" sizes="(min-width: 1200px) 1200px" width="2072" height="790" loading="lazy"></figure><h2 id="o-docker-prefere-o-nginx-">O Docker prefere o NGINX!</h2><p>A maneira mais conveniente de executar o NGINX na nuvem é usando o Docker. Para essa parte, assumo que você saiba o que é o Docker (mas se não souber, leia o artigo vinculado nos pré-requisitos). <br>Antes, precisamos criar um Dockerfile com o seguinte conteúdo:</p><pre><code class="language-dockerfile">FROM nginx

COPY container /
COPY build /usr/share/nginx/html</code></pre><p>Agora só restam esses três passos:</p><ol><li>Construir a aplicação em React. Esse processo gera o diretório <code>build/</code>, contendo os arquivos estáticos.</li><li>Construir a imagem do Docker. Isso criará uma imagem do Docker executável.</li><li>Publicar a imagem do Docker em algum repositório ou executá-la localmente. </li></ol><p>Por enquanto, vamos tentar executá-la em nossa máquina.</p><pre><code>$ yarn install
$ yarn build
$ docker build -t msokola/fred-app:latest .
$ docker run -p 8081:80 -it msokola/fred-app:latest</code></pre><p>A porta 8081 é uma porta local e em sua máquina. Isso significa que a aplicação estará disponível no seguinte URL: <a href="http://localhost:8081/">http://localhost:8081</a>. </p><p>Após abrir esse URL no navegador, você deve ver registros como estes em seu terminal:</p><pre><code>0.0.0.1 - - [11/Mar/2021:18:57:50 +0000] "GET / HTTP/1.1" 200 1556 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.192 Safari/537.36" "-"
...
0.0.0.1 - - [11/Mar/2021:18:57:51 +0000] "GET /api/observations?series_id=GDPCA&amp;frequency=a&amp;observation_start=1999-04-15&amp;observation_end=2021-01-01 HTTP/1.1" 200 404 "http://localhost:8081/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.192 Safari/537.36" "-"</code></pre><p>Observe os códigos 200, pois eles representam o status HTTP OK. Se você vir um 400 ao lado da solicitação da API, significa que algo está errado com sua chave de API. O código 304 também é válido (isso significa que os dados foram armazenados em cache).</p><h2 id="como-fazer-o-deploy-do-cont-iner-na-aws">Como fazer o <em>deploy </em>do contêiner na AWS</h2><p>O contêiner está funcionando, então podemos implementá-lo. Nessa parte do artigo, vou mostrar como executar sua aplicação na Amazon Web Services (AWS). A AWS é uma das plataformas de nuvem mais populares. Se você deseja usar o Microsoft Azure ou qualquer outra plataforma, os passos serão semelhantes, mas a sintaxe dos comandos será diferente. </p><p><strong>Observação</strong>: gravei um vídeo no YouTube para que você possa me ver passando por todo o processo de implantação. Se você ficar preso ou encontrar problemas, pode verificar se obtemos os mesmos resultados a cada etapa. Se quiser assistir ao vídeo, <a href="https://youtu.be/bUSXeQ4H20g">clique aqui</a> (vídeo em inglês).</p><h3 id="1-instale-as-ferramentas-de-cli-da-aws">1. Instale as ferramentas de CLI da AWS</h3><p>Antes de começarmos, você precisará instalar as ferramentas de CLI da AWS para poder digitar comandos em sua nuvem. A AWS oferece assistentes de instalação para todos os sistemas operacionais, então vou pular essa seção. Após uma instalação bem-sucedida, você precisará fazer login digitando o seguinte comando:</p><pre><code class="language-bash">$ aws configure
AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE
AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
Default region name [None]: us-east-2
Default output format [None]: json</code></pre><p>Para gerar chaves de acesso, você precisa fazer login no Console da AWS. Lá, clique em seu nome de usuário e selecione <em>My Security Credentials</em> (em português, "Minhas Credenciais de Segurança").</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/04/Screenshot-2021-03-16-at-22.27.53-1.png" class="kg-image" alt="Screenshot-2021-03-16-at-22.27.53-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/04/Screenshot-2021-03-16-at-22.27.53-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/04/Screenshot-2021-03-16-at-22.27.53-1.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2024/04/Screenshot-2021-03-16-at-22.27.53-1.png 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/04/Screenshot-2021-03-16-at-22.27.53-1.png 2000w" sizes="(min-width: 1200px) 1200px" width="2000" height="1401" loading="lazy"></figure><h3 id="2-crie-um-elastic-container-registry-ecr-">2. Crie um <em>Elastic Container Registry</em> (ECR)<br></h3><p>Assim que as ferramentas da CLI estiverem configuradas, precisaremos criar um espaço onde podemos armazenar os executáveis de nossa aplicação. Usamos o Docker, então nossos executáveis serão imagens do Docker que serão executadas em máquinas virtuais.<br>A AWS oferece um serviço dedicado para armazenar imagens chamado <em>Elastic Container Registry</em>. O comando a seguir criará um para nós:</p><pre><code class="language-bash">aws ecr create-repository --repository-name react-to-aws --region us-east-2</code></pre><p>Aqui estão os parâmetros:</p><ul><li><code>ecr</code> – acrônimo para "Elastic Container Registry".</li><li><code>repository-name</code> – o nome do nosso registro. Observe que utilizaremos esse nome posteriormente.</li><li><code>region</code> – código da região. Você pode encontrar a região mais próxima da sua para reduzir a laência da comunicação. <a href="https://docs.aws.amazon.com/general/latest/gr/rande.html">Aqui há uma lista de todas as regiões</a>. </li></ul><p>Para mais detalhes, consulte a documentação.</p><p>Aqui está a saída do console:</p><pre><code class="language-none">{
    "repository": {
        "repositoryArn": "arn:aws:ecr:us-east-2:1234567890:repository/react-to-aws2",
        "registryId": "1234567890",
        "repositoryName": "react-to-aws",
        "repositoryUri": "1234567890.dkr.ecr.us-east-2.amazonaws.com/react-to-aws2",
        "createdAt": "2021-03-16T22:50:23+04:00",
        "imageTagMutability": "MUTABLE",
        "imageScanningConfiguration": {
            "scanOnPush": false
        },
        "encryptionConfiguration": {
            "encryptionType": "AES256"
        }
    }
}</code></pre><h3 id="3-envie-as-imagens-do-docker-para-a-nuvem">3. Envie as imagens do Docker para a nuvem</h3><p>Nesta etapa, vamos enviar nossas imagens do Docker para a nuvem. Podemos fazer isso copiando os comandos de envio de nosso Console AWS.<br>Vamos abrir o Console AWS no navegador e clicar em Elastic Container Registry na lista <em><em>All Services - Containers</em> </em>(Todos os Serviços - Contêineres). Se você não alterou sua região, pode simplesmente <a href="https://us-east-2.console.aws.amazon.com/ecr/repositories?region=us-east-2">clicar aqui</a>. Você verá a lista completa de seus repositórios:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/04/Screenshot-2021-03-16-at-23.00.24-1.png" class="kg-image" alt="Screenshot-2021-03-16-at-23.00.24-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/04/Screenshot-2021-03-16-at-23.00.24-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/04/Screenshot-2021-03-16-at-23.00.24-1.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2024/04/Screenshot-2021-03-16-at-23.00.24-1.png 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/04/Screenshot-2021-03-16-at-23.00.24-1.png 2000w" sizes="(min-width: 1200px) 1200px" width="2000" height="1281" loading="lazy"></figure><p>Agoram você precisa selecionar o repositório <code>react-to-aws</code> e, em seguida, clicar em <em><em>View push commands</em></em> ("Visualizar comandos de envio") no menu (marcado com círculos vermelhos na imagem acima). Você verá a seguinte janela:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/04/Screenshot-2021-03-16-at-23.08.49.png" class="kg-image" alt="Screenshot-2021-03-16-at-23.08.49" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/04/Screenshot-2021-03-16-at-23.08.49.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/04/Screenshot-2021-03-16-at-23.08.49.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2024/04/Screenshot-2021-03-16-at-23.08.49.png 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/04/Screenshot-2021-03-16-at-23.08.49.png 2000w" sizes="(min-width: 1200px) 1200px" width="2000" height="1290" loading="lazy"></figure><p>Você precisa copiar todos comandos do modal no terminal. <strong>Não copie diretamente da caixa abaixo, pois não funcionarão:</strong></p><pre><code class="language-bash">$ aws ecr get-login-password --region us-east-2 | docker login --username AWS --password-stdin 123456789.dkr.ecr.us-east-2.amazonaws.com
Login Succeeded

$ docker build -t react-to-aws .
[+] Building 0.6s (8/8) FINISHED
...

$ docker tag react-to-aws:latest 123465789.dkr.ecr.us-east-2.amazonaws.com/react-to-aws:latest

$ docker push 123456789.dkr.ecr.us-east-2.amazonaws.com/react-to-aws:latest
The push refers to repository [123456789.dkr.ecr.us-east-2.amazonaws.com/react-to-aws:latest]
...
latest: digest: sha256:3921262a91fd85d2fccab1d7dbe7adcff84f405a3dd9c0e510a20d744e6c3f74 size: 1988</code></pre><p>Agora, feche o modal e clique no nome do repositório (<code>react-to-aws</code>) para listar as imagens disponíveis. Você deve ver essa tela:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/04/Screenshot-2021-03-16-at-23.17.56-1.png" class="kg-image" alt="Screenshot-2021-03-16-at-23.17.56-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/04/Screenshot-2021-03-16-at-23.17.56-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/04/Screenshot-2021-03-16-at-23.17.56-1.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2024/04/Screenshot-2021-03-16-at-23.17.56-1.png 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/04/Screenshot-2021-03-16-at-23.17.56-1.png 2000w" sizes="(min-width: 1200px) 1200px" width="2000" height="1290" loading="lazy"></figure><p>Sua aplicação está no repositório, pronta para implementação! Agora, clique em <em>Copy URI </em>(Copiar URI) <strong>e mantenha isso na sua 'área de transferência' (<em>clipboard</em>), ou copie em um arquivo de texto</strong>, pois precisaremos digitá-lo mais tarde!</p><h3 id="4-configurar-a-aplica-o">4. Configurar a aplicação</h3><p>Nossa imagem está disponível na nuvem. Agora, precisamos configurá-la.<br>Para executarmos máquinas virtuais, devemos definir algumas instruções, como portas abertas, variáveis de ambiente e assim por diante. A AWS chama isso de definição de tarefa (<em>task definition</em>).<br>Abra o console da AWS e clique em Elastic Container Service (ECS) na lista <em>All Services - Containers</em> ("Todos os Serviços - Contêineres"). Se você não alterou sua região, <a href="https://us-east-2.console.aws.amazon.com/ecs/home?region=us-east-2#/clusters">pode clicar aqui</a>.<br>Agora selecione <em>Task Definitions</em> ("Definições de Tarefas") e clique em <em>Create New Task Definition</em> ("Criar Definição de Tarefa"), conforme imagem abaixo:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/04/Screenshot-2021-03-17-at-00.07.54-1.png" class="kg-image" alt="Screenshot-2021-03-17-at-00.07.54-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/04/Screenshot-2021-03-17-at-00.07.54-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/04/Screenshot-2021-03-17-at-00.07.54-1.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2024/04/Screenshot-2021-03-17-at-00.07.54-1.png 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/04/Screenshot-2021-03-17-at-00.07.54-1.png 2000w" sizes="(min-width: 1200px) 1200px" width="2000" height="1290" loading="lazy"></figure><p>Temos duas opções para executar as tarefas: <code>FARGATE</code> e <code>EC2</code>. Escolha <code>FARGATE</code><em> </em>e avance para o próximo passo.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/04/Screenshot-2021-03-17-at-00.09.53.png" class="kg-image" alt="Screenshot-2021-03-17-at-00.09.53" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/04/Screenshot-2021-03-17-at-00.09.53.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/04/Screenshot-2021-03-17-at-00.09.53.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2024/04/Screenshot-2021-03-17-at-00.09.53.png 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/04/Screenshot-2021-03-17-at-00.09.53.png 2000w" sizes="(min-width: 1200px) 1200px" width="2000" height="1290" loading="lazy"></figure><p>No próximo passo, você precisa preencher o formulário com os seguintes valores:</p><ul><li><strong>Nomeclatura (Task Definition Name) </strong>– <code>react-to-aws-task</code>.</li><li><strong>Papel/Nível (Task Role)</strong> – <code>none</code>.</li><li><strong>Memória (Task memory) em GB </strong>– <code>0.5GB</code> (a menor).</li><li><strong>Recurso Processamento (Task CPU) em vCPU</strong> – <code>0.25 vCPU</code> (a menor).</li></ul><p>Assim que você chegar em <em>Container Definitions (</em>"Definições de container")<em>, </em>clique em <em>Add container</em><em> (</em>"Adicionar container"<em>)</em>:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/04/Screenshot-2021-03-17-at-00.18.19.png" class="kg-image" alt="Screenshot-2021-03-17-at-00.18.19" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/04/Screenshot-2021-03-17-at-00.18.19.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/04/Screenshot-2021-03-17-at-00.18.19.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2024/04/Screenshot-2021-03-17-at-00.18.19.png 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/04/Screenshot-2021-03-17-at-00.18.19.png 2000w" sizes="(min-width: 1200px) 1200px" width="2000" height="1288" loading="lazy"></figure><p>Preencha o formulário com os seguintes valores:</p><ul><li><strong>Nome do container (<em>Container Name</em>) </strong>– <code>react-to-aws</code>.</li><li><strong>Imagem (<em>Image</em>)</strong> – o URI do passo anterior. Você colou os dados em um bloco de notas, lembra?</li><li><strong>Limite de memória (<em>Memory Limits</em>) em MiB </strong>– <code>Soft limit</code> <code>128</code>.</li><li><strong>Mapeamento de portas (<em>Port mappings</em>)</strong> – <code>80</code> – a porta HTTP.</li></ul><p>Outras opções não são relevantes para nós. Agora, clique no botão <em>Add</em> ("Adicionar") para adicionar um contêiner e finalize a definição de tarefa clicando em <em>Create </em>("Criar"). Você deve ver a seguinte tela e clicar em <em>View Task Definition </em>("Visualizar definição de tarefa").</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/04/Screenshot-2021-03-17-at-00.24.56.png" class="kg-image" alt="Screenshot-2021-03-17-at-00.24.56" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/04/Screenshot-2021-03-17-at-00.24.56.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/04/Screenshot-2021-03-17-at-00.24.56.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2024/04/Screenshot-2021-03-17-at-00.24.56.png 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/04/Screenshot-2021-03-17-at-00.24.56.png 2000w" sizes="(min-width: 1200px) 1200px" width="2000" height="1288" loading="lazy"></figure><h3 id="5-vamos-executar-">5. Vamos executar!</h3><p>Agora podemos criar o <em>cluster </em>para executar nossa aplicação na nuvem. Você pode selecionar <em>Clusters</em> a partir do menu ao lado esquerdo e clicar em <em>Create Cluster</em> ("Criar Cluster"), conforme a imagem abaixo:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/04/Screenshot-2021-03-17-at-00.29.46.png" class="kg-image" alt="Screenshot-2021-03-17-at-00.29.46" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/04/Screenshot-2021-03-17-at-00.29.46.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/04/Screenshot-2021-03-17-at-00.29.46.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2024/04/Screenshot-2021-03-17-at-00.29.46.png 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/04/Screenshot-2021-03-17-at-00.29.46.png 2000w" sizes="(min-width: 1200px) 1200px" width="2000" height="1288" loading="lazy"></figure><p>Agora, temos três opções: <code>Networking only</code>, <code>EC2 Linux + Networking</code> e <code>EC2 Windows + Networking</code>. Selecione a primeira, <code>Networking only</code> ("Rede apenas") e avance para o próximo passo, onde você deve ver a seguinte tela:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/04/Screenshot-2021-03-17-at-00.34.35.png" class="kg-image" alt="Screenshot-2021-03-17-at-00.34.35" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/04/Screenshot-2021-03-17-at-00.34.35.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/04/Screenshot-2021-03-17-at-00.34.35.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2024/04/Screenshot-2021-03-17-at-00.34.35.png 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/04/Screenshot-2021-03-17-at-00.34.35.png 2000w" sizes="(min-width: 1200px) 1200px" width="2000" height="1288" loading="lazy"></figure><p>Digite <code>react-to-aws</code> como nome do <em>cluster</em> e crie no botão <em>Create</em>. Você deve ver uma mensagem indicando sucesso. Pode parecer similar à imagem abaixo (quando criamos a nossa tarefa). Agora, clique em <em>View Cluster </em>("Ver cluster").</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/04/Screenshot-2021-03-17-at-00.39.42-1.png" class="kg-image" alt="Screenshot-2021-03-17-at-00.39.42-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/04/Screenshot-2021-03-17-at-00.39.42-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/04/Screenshot-2021-03-17-at-00.39.42-1.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2024/04/Screenshot-2021-03-17-at-00.39.42-1.png 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/04/Screenshot-2021-03-17-at-00.39.42-1.png 2000w" sizes="(min-width: 1200px) 1200px" width="2000" height="1288" loading="lazy"></figure><p>Agora, clique na aba <em>Tasks</em> ("Tarefas") e clique em <em>Run new Task</em> ("Executar nova tarefa"). Parabéns! Chegamos ao último formulário! 😀</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/04/Screenshot-2021-03-17-at-00.41.10.png" class="kg-image" alt="Screenshot-2021-03-17-at-00.41.10" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/04/Screenshot-2021-03-17-at-00.41.10.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/04/Screenshot-2021-03-17-at-00.41.10.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2024/04/Screenshot-2021-03-17-at-00.41.10.png 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/04/Screenshot-2021-03-17-at-00.41.10.png 2000w" sizes="(min-width: 1200px) 1200px" width="2000" height="1288" loading="lazy"></figure><p>Preencha seu último formulário com os seguintes valores:</p><ul><li><strong>Tipo de lançamento (Launch type) </strong>– <code>FARGATE</code>.</li><li><strong>Cluster VPC</strong> – a primeira opção.</li><li><strong>Subrede (Subnet)</strong> – a primeira opção.</li></ul><p><strong>Mantenha os demais valores com o padrão</strong> e clique no botão <em>Run task </em>("Executar tarefa"<em>).</em> Você deve ver essa tela:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/04/Screenshot-2021-03-17-at-00.46.45-1.png" class="kg-image" alt="Screenshot-2021-03-17-at-00.46.45-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/04/Screenshot-2021-03-17-at-00.46.45-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/04/Screenshot-2021-03-17-at-00.46.45-1.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2024/04/Screenshot-2021-03-17-at-00.46.45-1.png 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/04/Screenshot-2021-03-17-at-00.46.45-1.png 2000w" sizes="(min-width: 1200px) 1200px" width="2000" height="1288" loading="lazy"></figure><p>Precisaremos aguardar cerca de um minuto até que o "Último status" (<em>Last Status</em>) mude para "EXECUTANDO" (<em>RUNNING</em>). Lembre-se de que você precisa clicar no botão "Atualizar" (<em>Refresh</em>) para atualizar a lista. Assim que o status da tarefa estiver em execução, clique no nome da tarefa.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/04/Screenshot-2021-03-17-at-00.50.52.png" class="kg-image" alt="Screenshot-2021-03-17-at-00.50.52" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/04/Screenshot-2021-03-17-at-00.50.52.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/04/Screenshot-2021-03-17-at-00.50.52.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2024/04/Screenshot-2021-03-17-at-00.50.52.png 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/04/Screenshot-2021-03-17-at-00.50.52.png 2000w" sizes="(min-width: 1200px) 1200px" width="2000" height="1179" loading="lazy"></figure><p>Na seção "Rede" (<em>Network),</em> você pode encontrar o IP público (<em>Public IP)</em> do seu contêiner. Abra-o no navegador para visualizar sua aplicação.</p><h2 id="resumo">Resumo</h2><p>Se você está no início de sua carreira – talvez nunca tenha implementado uma aplicação por conta própria – mas é bom aprender essa habilidade, porque um dia precisará fazer isso.<br>Todo projeto precisa chegar aos usuários. Caso contrário, não terá chance de ser bem-sucedido e nunca será útil e/ou rentável.<br>O processo de configuração pode ser um pouco tedioso, mas a boa notícia é que você só precisa fazer isso uma vez! 🙂<br>Depois de configurar tudo, suas implantações futuras serão mais simples. Você só precisa enviar a nova imagem e reiniciar a tarefa para implantar uma nova versão de sua aplicação.<br>Se você estiver interessado em se aprofundar na AWS, o FreeCodeCamp oferece <a href="https://www.freecodecamp.org/news/aws-certified-cloud-practitioner-study-course-pass-the-exam-with-this-free-13-hour-course/">um tutorial gratuito sobre o assunto</a> (cerca de 14 horas).<br>Você pode encontrar <strong>uma gravação em vídeo deste tutorial (17 minutos)</strong> em meu canal no YouTube. Estou no início de minha jornada no YouTube – pelo menos semanalmente, faço upload de um vídeo sobre programação. Significaria muito para mim se você assistisse à minha gravação em vídeo, se inscrevesse no canal e clicasse no botão de curtir.</p><figure class="kg-card kg-embed-card" data-test-label="fitted">
        <div class="fluid-width-video-container">
          <div style="padding-top: 56.49999999999999%;" class="fluid-width-video-wrapper">
            <iframe width="200" height="113" src="https://www.youtube.com/embed/bUSXeQ4H20g?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen="" title="How To Deploy React On AWS With Docker And NGINX" name="fitvid0"></iframe>
          </div>
        </div>
      </figure><p><strong>Você pode encontrar todo o código neste repositório do GitHub</strong>: <a href="https://github.com/mateuszsokola/react-to-aws">https://github.com/mateuszsokola/react-to-aws</a></p><p>Você pode enviar mensagens diretas ao autor (em inglês) pelo Twitter: <a href="https://twitter.com/msokola">@msokola</a></p><p>Pode enviar mensagens diretas ao tradutor (em português ou inglês) pelo Twitter: <a href="https://twitter.com/drcrescencio">@drcrescencio</a></p><p>É isso, pessoal! Tenham um bom dia! 🙂</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/04/vidar-nordli-mathisen-xgP0GNl9Gzg-unsplash.jpg" class="kg-image" alt="vidar-nordli-mathisen-xgP0GNl9Gzg-unsplash" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/04/vidar-nordli-mathisen-xgP0GNl9Gzg-unsplash.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/04/vidar-nordli-mathisen-xgP0GNl9Gzg-unsplash.jpg 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2024/04/vidar-nordli-mathisen-xgP0GNl9Gzg-unsplash.jpg 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/04/vidar-nordli-mathisen-xgP0GNl9Gzg-unsplash.jpg 2000w" sizes="(min-width: 720px) 720px" width="2000" height="1238" loading="lazy"><figcaption>Foto: <a href="https://unsplash.com/@vidarnm?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Vidar Nordli-Mathisen</a>, extraída do <a href="https://www.freecodecamp.org/news/s/photos/ship-storm?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></figcaption></figure> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
