309661c9e4417ebabab19cab5adecb86ad490b38
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.
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).
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
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.
Description
Languages
JavaScript
50.6%
HTML
46.1%
Dockerfile
3.3%