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 la
imagen (build pack Docker Compose, docker-compose.yml de la raíz) y publica en
shrink.montlab.dev (Caddy + Let's Encrypt automáticos). La base SQLite vive en el volumen
con nombre shrinker-data montado en /data, así que sobrevive a los redespliegues.
Nota operativa: el build pack es
dockercomposey nodockerfileporque en esta instalación de Coolify las opcionescustom_docker_run_optionscon-vno se aplican; el volumen declarado en el compose sí.