Blog · Guias de deploy
Como fazer deploy de um app React Router em 2026: o Dockerfile do template, um comando e HTTPS
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.
- Um comando:
pethost deployna pasta que ocreate-react-routercriou. 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.appna 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
- Ele pergunta uma coisa O nome do projeto, que é a primeira palavra do endereço. Enter fica com o nome da pasta.
- A pasta vai para a sua máquina Sem o
node_modules: o build instala as dependências lá, a partir dopackage-lock.json. - 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. - 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:
- Ele precisa do lockfile. Os dois passos de
npm cileem opackage-lock.json, então mantenha-o na pasta e no seu repositório. - Nenhuma porta é declarada. O arquivo não tem a linha
EXPOSEe não precisa dela: a máquina encontra a porta em que o servidor rodando escuta. - O app é pequeno quando roda. O último estágio tem as dependências de produção e o build. O template rodando ocupou 79 MB de memória.
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.
- € 9,99 por mês por todos os seus projetos, nada medido
- 11 s para fazer o build e iniciar o template, na primeira vez
- 79 MB de memória para o app rodando
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.
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.
- React Router: instalação
- React Router: deploy
- React Router: os templates oficiais
- 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.