# 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` | `/` | Redirección 302 al destino (cuenta el clic) | | `GET` | `/api/stats/` | `{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`.