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 dockercompose y no dockerfile porque en esta instalación de Coolify las opciones custom_docker_run_options con -v no se aplican; el volumen declarado en el compose sí.

Description
URL Shrinker — acortador de URLs
Readme 34 KiB
Languages
JavaScript 50.6%
HTML 46.1%
Dockerfile 3.3%