Files
url-shrinker/README.md
Fable 309661c9e4 URL Shrinker: acortador de URLs con Node 24 + node:sqlite
App sin dependencias: UI web, POST /api/shorten (codigo aleatorio o
personalizado), redireccion 302 con contador de clics, /api/stats/<code>
y /healthz. SQLite en DATA_DIR (/data) para montar volumen persistente.
2026-09-12 03:38:39 +02:00

48 lines
1.5 KiB
Markdown

# URL Shrinker
Acortador de URLs minimalista. Node.js 24 sin dependencias (`node:http` + `node:sqlite`),
un solo contenedor.
**Producción:** https://shrink.montlab.dev
## API
| Método | Ruta | Qué hace |
|---|---|---|
| `POST` | `/api/shorten` | Body `{"url": "https://…", "code": "opcional"}``201 {code, url, short_url}` |
| `GET` | `/<code>` | Redirección 302 al destino (cuenta el clic) |
| `GET` | `/api/stats/<code>` | `{code, url, clicks, created_at, short_url}` |
| `GET` | `/healthz` | `{ok, links, clicks}` |
| `GET` | `/` | UI web |
Códigos generados: 6 caracteres base58. Códigos personalizados: `[A-Za-z0-9_-]{3,32}`
(`api` y `healthz` están reservados).
```bash
curl -X POST https://shrink.montlab.dev/api/shorten \
-H 'Content-Type: application/json' \
-d '{"url": "https://es.wikipedia.org/wiki/Anexo:Ejemplo"}'
```
## Configuración
| Variable | Por defecto | Descripción |
|---|---|---|
| `PORT` | `3000` | Puerto de escucha |
| `DATA_DIR` | `/data` | Directorio de la base SQLite (montar volumen persistente) |
| `BASE_URL` | `http://localhost:3000` | Base con la que se construyen los enlaces cortos |
## Desarrollo local
```bash
DATA_DIR=./data BASE_URL=http://localhost:3000 node server.js
```
Requiere Node ≥ 24 (usa `node:sqlite`).
## Despliegue
Pipeline estándar de MontLab: push a este repo (Gitea) → webhook → Coolify reconstruye el
Dockerfile y publica en `shrink.montlab.dev` (Caddy + Let's Encrypt automáticos).
La base de datos vive en un volumen persistente montado en `/data`.