guias
Frameworks

Deploy Hono API

Como fazer deploy de uma API Hono na Veloz.

Faça deploy de uma API rápida e leve com Hono na Veloz.

Pré-requisitos

  • Node.js 18+ instalado
  • Um projeto Hono (ou vamos criar um)

1. Criar o projeto

npm create hono@latest meu-api
cd meu-api
npm install

Escolha o template nodejs quando perguntado.

2. Estrutura do projeto

meu-api/
├── src/
│   └── index.ts
├── package.json
└── tsconfig.json
// src/index.ts
import { Hono } from "hono";
import { serve } from "@hono/node-server";
 
const app = new Hono();
 
app.get("/", (c) => c.json({ message: "Olá da Veloz!" }));
 
app.get("/users", (c) => {
  return c.json({ users: [{ id: 1, name: "Jean" }] });
});
 
app.post("/users", async (c) => {
  const body = await c.req.json();
  return c.json({ created: body }, 201);
});
 
serve({ fetch: app.fetch, port: Number(process.env.PORT) || 3000 });

Importante: Use process.env.PORT || 3000 para que a Veloz possa configurar a porta.

3. Package.json

Certifique-se de ter os scripts de build e start:

{
  "scripts": {
    "build": "tsc",
    "start": "node dist/index.js",
    "dev": "tsx watch src/index.ts"
  }
}

4. Deploy

npm install -g onveloz
veloz login
veloz deploy
ℹ Framework detectado: Hono
ℹ Build: npm run build
ℹ Start: node dist/index.js
ℹ Porta: 3000

? Confirmar e fazer deploy? (Y/n)
✓ Build concluído em 5s
✓ Deploy concluído!
✓ https://meu-api.onveloz.com

Com banco de dados

PostgreSQL (Prisma)

npm install prisma @prisma/client
npx prisma init
# Definir a URL do banco
veloz env set DATABASE_URL=postgres://user:pass@host:5432/mydb
// src/index.ts
import { PrismaClient } from "@prisma/client";
 
const prisma = new PrismaClient();
 
app.get("/users", async (c) => {
  const users = await prisma.user.findMany();
  return c.json({ users });
});

Drizzle

npm install drizzle-orm postgres
import { drizzle } from "drizzle-orm/postgres-js";
import postgres from "postgres";
 
const sql = postgres(process.env.DATABASE_URL!);
const db = drizzle(sql);

Middleware

Hono tem middleware poderoso built-in:

import { cors } from "hono/cors";
import { logger } from "hono/logger";
import { bearerAuth } from "hono/bearer-auth";
 
// CORS para o frontend
app.use(
  "/api/*",
  cors({
    origin: "https://meuapp.com",
  }),
);
 
// Logger
app.use("*", logger());
 
// Auth para rotas protegidas
app.use("/admin/*", bearerAuth({ token: process.env.ADMIN_TOKEN! }));

Variáveis de ambiente

veloz env set DATABASE_URL=postgres://...
veloz env set JWT_SECRET=meu-segredo
veloz env set ADMIN_TOKEN=token-admin

Acesse via process.env:

const secret = process.env.JWT_SECRET;

Com Zod validation

import { zValidator } from "@hono/zod-validator";
import { z } from "zod";
 
const createUserSchema = z.object({
  name: z.string().min(2),
  email: z.string().email(),
});
 
app.post("/users", zValidator("json", createUserSchema), async (c) => {
  const data = c.req.valid("json");
  // data é tipado: { name: string, email: string }
  return c.json({ created: data }, 201);
});

Monorepo: Frontend + API

Estrutura típica de monorepo com Hono API + frontend:

meu-projeto/
├── apps/
│   ├── web/          ← Next.js / Vite
│   └── api/          ← Hono
└── packages/
    └── shared/       ← Types compartilhados
veloz deploy
# Selecione ambos: web e api

Cada serviço recebe sua própria URL:

web → meu-projeto-web.onveloz.com
api → meu-projeto-api.onveloz.com

Próximos passos