Saltar al contenido principal

Deno Deploy

Plataforma edge para correr código TypeScript/JavaScript de forma nativa. No requiere compilación, soporta TypeScript sin configuración y tiene Deno KV incluido.

Límites del plan gratuito

ParámetroValor
Requests1,000,000/mes
ProyectosIlimitados
DespliegueGit (GitHub) o deployctl CLI
Deno KV✅ Incluido (base de datos key-value)
Bandwidth100 GB/mes
RuntimeDeno (TypeScript nativo, sin configuración)
Sin cold start
Dominio.deno.dev + custom gratis

Despliegue desde GitHub

1. https://dash.deno.com → New Project
2. "Deploy from GitHub" → conectar repositorio
3. Configurar:
- Entry Point: main.ts (o el archivo principal)
- Branch: main
4. Deploy

Despliegue con CLI

# Instalar deployctl
deno install -A jsr:@deno/deployctl

# Deploy desde archivo local
deployctl deploy --project=mi-proyecto main.ts

# Deploy con token
deployctl deploy --token=tu-token --project=mi-proyecto main.ts

API básica con Deno

// main.ts
Deno.serve(async (req: Request) => {
const url = new URL(req.url)

if (url.pathname === '/api/usuarios' && req.method === 'GET') {
const usuarios = [
{ id: 1, nombre: 'Juan' },
{ id: 2, nombre: 'Ana' }
]
return Response.json(usuarios)
}

if (url.pathname === '/api/usuarios' && req.method === 'POST') {
const body = await req.json()
// procesar...
return Response.json({ creado: true, data: body }, { status: 201 })
}

return new Response('Not Found', { status: 404 })
})

Con Hono (framework web para Deno)

// main.ts
import { Hono } from 'https://deno.land/x/hono/mod.ts'

const app = new Hono()

app.get('/api/usuarios', (c) => {
return c.json({ usuarios: ['Ana', 'Juan'] })
})

app.post('/api/usuarios', async (c) => {
const body = await c.req.json()
return c.json({ creado: body }, 201)
})

app.get('/api/usuarios/:id', (c) => {
const id = c.req.param('id')
return c.json({ id, nombre: 'Usuario ' + id })
})

Deno.serve(app.fetch)

Deno KV (base de datos incluida)

// Abrir la base de datos KV (persiste en Deno Deploy)
const kv = await Deno.openKv()

// SET
await kv.set(['usuarios', '123'], { nombre: 'Juan', email: 'juan@email.com' })

// GET
const resultado = await kv.get<{ nombre: string }>(['usuarios', '123'])
console.log(resultado.value?.nombre) // 'Juan'

// LIST (listar con prefijo)
const iter = kv.list<{ nombre: string }>({ prefix: ['usuarios'] })
for await (const entry of iter) {
console.log(entry.key, entry.value)
}

// DELETE
await kv.delete(['usuarios', '123'])

// Atomic (transacciones)
const res = await kv.atomic()
.check({ key: ['contador'], versionstamp: null }) // solo si no existe
.set(['contador'], 0)
.commit()

if (!res.ok) {
console.log('La clave ya existía')
}

Variables de entorno

Dashboard → tu proyecto → Settings → Environment Variables
// Acceder en Deno:
const apiKey = Deno.env.get('API_KEY')
const dbUrl = Deno.env.get('DATABASE_URL')

Conectar a PostgreSQL externo (Neon, Supabase)

// Con driver neon serverless
import { neon } from 'npm:@neondatabase/serverless'

const sql = neon(Deno.env.get('DATABASE_URL')!)

Deno.serve(async (req) => {
const usuarios = await sql`SELECT * FROM usuarios`
return Response.json(usuarios)
})

Proyectos y organizaciones

  • Cada cuenta tiene proyectos ilimitados
  • Cada proyecto puede conectarse a un repositorio de GitHub
  • Los deployments se generan en cada push (preview por PR, producción por push a main)

⚠️ Limitaciones importantes

  • Deno, no Node.js: la mayoría de paquetes npm funcionan via npm:, pero algunos no son compatibles
  • Deno KV limitado: no es un reemplazo de PostgreSQL para datos relacionales complejos
  • Sin Docker: solo código JavaScript/TypeScript
  • Ecosistema más pequeño que Node.js (aunque compatible con la mayoría de paquetes)