Português

Blog · Guias de deploy

Como fazer deploy de um app React Router em 2026: o Dockerfile do template, um comando e HTTPS

Pela equipe da Pethost · · Atualizado em · 8 min de leitura

Você criou um app com o create-react-router, ele renderiza no servidor, e você quer colocá-lo no ar em um endereço com HTTPS. O template padrão já vem com um Dockerfile, e no Pethost é só disso que um projeto precisa: rode pethost deploy na pasta do app. Na primeira vez, o template teve o build feito e foi iniciado em 11 segundos, e respondeu 200 no seu novo endereço.

Em resumo
  • Um comando: pethost deploy na pasta que o create-react-router criou. Nada é adicionado ao app e não há configurações de build para preencher.
  • O que ele faz: envia a pasta, faz o build do próprio Dockerfile do template na sua máquina e inicia o react-router-serve.
  • A porta: o servidor escuta na 3000. O Pethost descobre isso e manda o endereço para lá, com HTTPS.
  • O endereço: https://my-app.yourname.pethost.app na hora. Seu próprio domínio é um registro DNS.
  • O preço: € 9,99 por mês por 2 vCPU, 3 GB e 30 GB, para este app e todos os seus outros projetos. Não existe plano gratuito.

O que você precisa para fazer deploy de um app React Router em 2026

Três coisas: o app, o comando pethost e uma conta no Pethost.

O app aqui é o template padrão, com renderização no servidor e Tailwind CSS:

npx create-react-router@latest my-app

Ele deixa o package.json, o package-lock.json, a pasta app/ e um Dockerfile. Os scripts dele são os que o Dockerfile roda:

"scripts": {
  "build": "react-router build",
  "dev": "react-router dev",
  "start": "react-router-serve ./build/server/index.js",
  "typecheck": "react-router typegen && tsc"
}

O comando é um programa só, instalado com uma linha. Todos os comandos dele estão na referência da CLI.

curl -fsSL https://pethost.dev/install.sh | sh      # macOS, Linux
irm https://pethost.dev/install.ps1 | iex           # Windows, in PowerShell

A conta precisa de um plano. Se você não estiver logado, o pethost deploy abre o navegador e faz o seu login. Se você ainda não tiver um plano, ele mostra onde escolher um e espera.

Faça o deploy do app React Router com um comando

Vá até a pasta do app e rode pethost deploy. Esta é a tela inteira, para o template padrão:

$ cd my-app
$ pethost deploy
Name it [my-app]:    it will live at https://my-app.sam.pethost.app
✓ Packed 22 files, 174 KB   (left out node_modules)
✓ Uploaded straight to your machine
✓ Built and started in 11 s
  · wrote compose.yaml for the Dockerfile: the service app, reading .env
✓ app listens on 3000 → https://my-app.sam.pethost.app
  It answers 200.

https://my-app.sam.pethost.app

Wrote .pethost (commit it). Next:   pethost logs -f   ·   pethost open
  1. Ele pergunta uma coisa O nome do projeto, que é a primeira palavra do endereço. Enter fica com o nome da pasta.
  2. A pasta vai para a sua máquina Sem o node_modules: o build instala as dependências lá, a partir do package-lock.json.
  3. A máquina faz o build do Dockerfile É o próprio arquivo do template, sem mudanças. A linha embaixo diz a única coisa que a máquina adicionou: um arquivo Compose em volta do Dockerfile, com um serviço chamado app.
  4. O app inicia e é acessado A máquina vê que o servidor escuta na 3000 e manda o endereço para lá. Depois o pethost acessa o próprio endereço e mostra o que ele respondeu: 200.

Pedimos ao template no ar o que um visitante pede. A página inicial respondeu 200 com o HTML renderizado no servidor, /favicon.ico respondeu 200, e um endereço sem rota respondeu 404 com a própria página de erro do React Router.

O arquivo .pethost diz qual projeto é esta pasta. Faça o commit dele, e o próximo deploy não pergunta nada.

O Dockerfile do template do React Router

Este é o arquivo que o create-react-router escreveu, e a máquina fez o build dele do jeito que está:

FROM node:24-alpine AS development-dependencies-env
COPY . /app
WORKDIR /app
RUN npm ci

FROM node:24-alpine AS production-dependencies-env
COPY ./package.json package-lock.json /app/
WORKDIR /app
RUN npm ci --omit=dev

FROM node:24-alpine AS build-env
COPY . /app/
COPY --from=development-dependencies-env /app/node_modules /app/node_modules
WORKDIR /app
RUN npm run build

FROM node:24-alpine
COPY ./package.json package-lock.json /app/
COPY --from=production-dependencies-env /app/node_modules /app/node_modules
COPY --from=build-env /app/build /app/build
WORKDIR /app
CMD ["npm", "run", "start"]

Três coisas para saber sobre ele no Pethost:

Um app sem Dockerfile não fica travado. Em uma pasta que não tem nem Dockerfile nem arquivo Compose, o pethost deploy escreve o Dockerfile para os tipos de projeto que conhece, como faz para um app Nuxt, e para qualquer outra pasta diz por que não escreveu nenhum.

Altere uma rota e faça o deploy de novo

Edite uma rota e rode o mesmo comando. O segundo deploy do template levou 6 segundos, porque a máquina guarda as camadas do build:

$ pethost deploy
my-app (.pethost)
✓ Packed 23 files · uploaded · built and started in 6 s
  · wrote compose.yaml for the Dockerfile: the service app, reading .env
  · kept the project's x-pethost
  It answers 200.
https://my-app.sam.pethost.app

Para fazer deploy a cada push, conecte o repositório uma vez:

pethost github sam/my-app          # from now on, every push deploys itself

O Pethost lê só os repositórios que você deu ao GitHub App dele. Se um deploy der errado, o pethost rollback coloca de volta a versão anterior, e a sua máquina guarda as três versões anteriores à atual. Um agente de IA pode fazer tudo isso por você pelo servidor MCP do Pethost: como um agente faz o deploy de um projeto e cuida dele.

Variáveis de ambiente e seu próprio domínio

Uma variável que um loader ou uma action lê no servidor é um comando. Ele pede o valor sem mostrá-lo, coloca-o no arquivo .env do projeto na máquina, e os próximos deploys o mantêm:

pethost env set SESSION_SECRET

Qualquer nome sob o domínio da sua conta já é um endereço na hora, com HTTPS. Um domínio seu leva um comando e um registro DNS:

pethost domain add app.example.com

O comando mostra o registro a criar: um CNAME do seu nome para o nome da sua máquina. O certificado vem sozinho assim que o nome resolve, e se renova sozinho. O pethost password coloca uma página de senha na frente do app inteiro, para um que ainda não é público.

O que você recebe pelo preço

O Pethost custa € 9,99 por mês por tudo que você hospeda, com 2 vCPU, 3 GB de memória e 30 GB de disco. O servidor do template ocupou 79 MB dessa memória, então a máquina tem espaço para o banco de dados do app, um worker e os seus outros projetos. Não há taxa por projeto e nada é medido: a renderização no servidor não é cobrada por requisição, e um mês movimentado custa o mesmo que um mês tranquilo.

O que já vem pronto: HTTPS com certificados que se renovam sozinhos, deploys a partir do GitHub, backups toda noite guardados por 14 dias, SSH em qualquer container e cada requisição contada, com os caminhos mais acessados e a taxa de erros dos últimos 30 dias. A máquina está sempre ligada, então a primeira requisição da manhã nunca espera um cold start. Os planos estão na parte de preços da página inicial.

Cada projeto, identificado. Sete projetos em uma máquina Starter: os apps com seus endereços e as requisições do último dia, os bancos de dados com os apps que os usam.
A primeira página do painel do Pethost: a CPU, a memória e o disco da máquina, e os projetos dela como cards.

O Pethost é a melhor escolha para

  • Desenvolvedores com um app React full-stack: o app renderizado no servidor e o banco de dados dele em uma máquina, em uma só conta
  • Desenvolvedores solo com vários projetos paralelos, cada um em um endereço próprio
  • Quem tem um agente que faz o deploy: o Claude Code ou o Codex coloca o app no ar e lê os logs dele
  • Startups em estágio inicial que querem um custo mensal fixo enquanto o produto é pequeno

Procure outra opção se

  • Sua aplicação precisa de várias regiões ou de autoscaling

Perguntas

Onde hospedar um app React Router com renderização no servidor?

Em qualquer provedor de hospedagem que rode um servidor Node ou um container Docker. No Pethost, você roda pethost deploy na pasta do app: a máquina faz o build do Dockerfile do template, inicia o react-router-serve e serve o app com HTTPS.

Preciso mudar o Dockerfile que o create-react-router escreve?

Não. A máquina fez o build do Dockerfile do template padrão do jeito que está. Ele não tem a linha EXPOSE e não precisa dela: o Pethost encontra a porta em que o servidor escuta, a 3000.

Dá para fazer deploy de um app React Router do GitHub a cada push?

Sim. Faça o deploy da pasta uma vez com pethost deploy e depois rode pethost github owner/repository. A partir daí, cada push no repositório faz o próprio deploy, e o pethost rollback volta para um commit anterior.

Como configurar variáveis de ambiente em um app React Router?

Rode pethost env set NAME na pasta do app. Ele pede o valor sem mostrá-lo e o coloca no arquivo .env do projeto na máquina, que o servidor lê e todos os deploys seguintes mantêm.

Quanto custa hospedar um app React Router no Pethost?

€ 9,99 por mês no Starter, com 2 vCPU, 3 GB e 30 GB, sem taxa por projeto e sem cobrança por requisição: seus outros apps, sites e bancos de dados também rodam lá. Não existe plano gratuito. Os preços são sem IVA.

As telas são deploys do template padrão que o create-react-router escreve, com o React Router 8.4.0 e o pethost 0.2.1, em uma máquina de teste nossa. A conta nelas é a de exemplo, sam.

  1. React Router: instalação
  2. React Router: deploy
  3. React Router: os templates oficiais
  4. pethost, a linha de comando do Pethost

Coloque seus projetos no ar hoje

Publique apps, bots e bancos de dados pelo seu agente, pelo GitHub ou pelo navegador, quantos couberem, a um preço fixo. Nada medido, nada cobrado à parte.

Hospede tudo por € 9,99/mês