Sites estáticos e SPAs
Frameworks como Vite, Create React App, Vue, Angular e Astro (modo estático) geram uma pasta de arquivos HTML, CSS e JavaScript. Na Zenifra, um servidor HTTP leve entrega essa pasta.
Qual caminho escolher
| Caminho | Vantagem | Ideal para |
|---|---|---|
GitHub + Node.js com serve | Sem Dockerfile, publicação a cada push | A maioria dos sites e SPAs |
| Imagem OCI com NGINX | Controle total de cache, headers e redirecionamentos | Quem já usa NGINX ou precisa de regras avançadas |
Opção 1: GitHub com o runtime Node.js
Adicione o serve como dependência:
npm install serveConfira a pasta gerada pela build do seu framework:
| Framework | Pasta |
|---|---|
| Vite (React, Vue, Svelte) | dist |
| Create React App | build |
| Angular 17+ | dist/<nome-do-projeto>/browser |
| Astro (estático) | dist |
Preencha o projeto no console:
| Campo | Valor |
|---|---|
| Runtime | Node.js |
| Porta | 3000 |
build | npm run build |
start | npx serve -s dist -l tcp://0.0.0.0:3000 |
Troque dist pela pasta da tabela anterior.
A opção -s faz o serve responder com o index.html para rotas desconhecidas, o que é necessário para SPAs com React Router, Vue Router ou Angular Router. Em sites com várias páginas HTML, como Astro, remova o -s.
Variáveis de ambiente em sites estáticos
Variáveis como VITE_API_URL são embutidas no JavaScript durante a build. Na Zenifra, as variáveis do projeto existem na build, então funcionam normalmente. Depois de alterar uma delas, faça uma nova publicação para gerar outro pacote. Nunca coloque segredos nessas variáveis: elas ficam visíveis no navegador.
Opção 2: Imagem OCI com NGINX
Use a imagem oficial do NGINX, que escuta na porta 80:
FROM node:22-alpine AS build
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
ARG VITE_API_URL
ENV VITE_API_URL=$VITE_API_URL
RUN npm run build
FROM nginx:alpine
COPY nginx.conf /etc/nginx/conf.d/default.conf
COPY --from=build /app/dist /usr/share/nginx/html
EXPOSE 80server {
listen 80;
root /usr/share/nginx/html;
location /assets/ {
expires 1y;
add_header Cache-Control "public, immutable";
}
location / {
try_files $uri $uri/ /index.html;
}
}Construa, publique no seu registry e crie um projeto Imagem OCI com Porta 80. Veja Dockerfiles prontos para os comandos de build e push e Deploy via imagem OCI para os campos do console.
Domínio e HTTPS
O projeto recebe uma URL *.clients.zenifra.com com HTTPS. Para usar o seu domínio, siga Domínio personalizado.
Problemas comuns
| Sintoma | Correção |
|---|---|
Página em branco e erros 404 para .js | Pasta errada no start ou base incorreto no vite.config |
Rota como /login retorna 404 ao recarregar | Use serve -s ou try_files ... /index.html |
Variável VITE_* vazia | Cadastre antes da build e publique de novo |
serve: not found | serve não está em dependencies |
Próximos passos
- Next.js para sites com renderização no servidor
- Ambientes de Preview
- Guias por framework
Última atualização em
APIs Node.js com Express, Fastify e NestJS
Configure APIs Node.js na Zenifra com Express, Fastify ou NestJS: porta, comandos, TypeScript, migrations, WebSockets, health check e erros comuns.
Python com FastAPI e Flask
Publique APIs Python na Zenifra com FastAPI ou Flask: requirements.txt, uvicorn, gunicorn, workers, porta, migrations com Alembic e erros comuns.