53 lines
1.8 KiB
Markdown
53 lines
1.8 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 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í.
|