Por qué alojar tu propio acortador de URL
Un acortador público decide por ti: puede cambiar sus condiciones, limitar el número de enlaces, insertar una página intermedia o cerrar, y tus enlaces ya impresos dejan de funcionar. Sus estadísticas le pertenecen, y su dominio compartido es bloqueado a menudo por los filtros antiphishing porque otros lo usan mal.
Con Kutt en tu VPS, el enlace go.tu-dominio.com/oferta es tuyo para siempre: puedes cambiar su destino sin reimprimir el cartel, ver quién hizo clic y desde dónde, y ningún tercero ve tus campañas. Para una agencia, también es un servicio que ofrecer a cada cliente, en su propio dominio.
Lo que aporta Kutt
- Enlaces en tu dominio — cada enlace corto lleva tu marca y sigue siendo válido aunque cambies de herramienta más adelante.
- Alias personalizados —
/lanzamiento,/webinar, o un código generado de seis caracteres sin caracteres ambiguos. - Contraseña y caducidad — un enlace protegido para un documento de cliente, un enlace que deja de redirigir al acabar una oferta.
- Estadísticas privadas — visitas en el tiempo, navegadores, sistemas, países y sitios de referencia, visibles solo para el propietario.
- API REST — una clave por usuario para crear, modificar y eliminar enlaces desde tus scripts y herramientas.
- Administración — creación de las cuentas del equipo, revisión de todos los enlaces, bloqueo de un enlace o dominio abusivo.
Kutt, Shlink y un servicio público
Desplace la tabla
| Kutt | Shlink | Servicio público (bit.ly…) | |
|---|---|---|---|
| Interfaz web | Integrada | Cliente web aparte | Sí |
| API REST | Sí, clave por usuario | Sí, claves gestionadas por línea de comandos | Sí, a menudo de pago |
| Tu propio dominio | Sí, incluido | Sí, incluido | Opción de pago |
| Estadísticas | En tu base de datos | En tu base de datos | En el proveedor |
| Cuentas de equipo | Sí, creadas por el administrador | No, acceso por clave de API | Según el plan |
| Almacenamiento | SQLite, PostgreSQL o MySQL | SQLite, PostgreSQL, MySQL o SQL Server | Gestionado por el proveedor |
Requisitos previos
Basta un VPS Ubuntu 24.04 con 512 MB de RAM y 5 GB de disco: Kutt funciona en un solo contenedor Node.js y usa unos 200 MB de memoria. Necesitas Docker con el plugin Compose, nginx y certbot para HTTPS, y un nombre DNS que apunte al VPS.
Elige ese nombre con cuidado, porque forma cada enlace: cuanto más corto, más cortos tus enlaces. Un subdominio como go.tu-dominio.com o un dominio pequeño dedicado funciona muy bien. Kutt lo escribe en cada enlace que crea, así que cambiarlo después no reescribe los enlaces ya compartidos.
Instalar Kutt con Docker Compose
Preparar el directorio y los secretos
Crea el directorio de la aplicación y un archivo
.envcon la clave secreta (firma las sesiones) y el dominio de los enlaces cortos. Sustituyego.example.compor tu propio nombre.mkdir -p /opt/kutt && cd /opt/kutt printf 'SECRET_KEY=%s\nDOMAIN=go.example.com\n' "$(openssl rand -hex 32)" > .env chmod 600 .envEscribir el archivo compose
Crea
compose.yaml. El puerto solo se publica en la interfaz local: solo nginx accede a él. El registro público y los enlaces anónimos siguen cerrados, y la base SQLite vive en un volumen con nombre.services: kutt: image: kutt/kutt:v3.2.6 restart: unless-stopped ports: - "127.0.0.1:8107:3000" environment: JWT_SECRET: ${SECRET_KEY:?SECRET_KEY requis} DEFAULT_DOMAIN: ${DOMAIN:?DOMAIN requis} DB_CLIENT: better-sqlite3 DB_FILENAME: /var/lib/kutt/data.sqlite TRUST_PROXY: "true" DISALLOW_REGISTRATION: "true" DISALLOW_ANONYMOUS_LINKS: "true" volumes: - kutt-data:/var/lib/kutt - kutt-custom:/kutt/custom volumes: kutt-data: {} kutt-custom: {}Arrancar y comprobar
Arranca la pila. Kutt aplica sus migraciones al iniciar y la sonda de salud debe responder 200.
docker compose up -d docker compose ps curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:8107/api/v2/healthPublicar Kutt con HTTPS
Declara un host virtual de nginx que reenvíe las peticiones al puerto local y pide el certificado con certbot. La cabecera
X-Forwarded-Forpermite a Kutt registrar la dirección real del visitante (TRUST_PROXY).server { server_name go.example.com; location / { proxy_pass http://127.0.0.1:8107; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }certbot --nginx -d go.example.com
Crea la cuenta de administrador sin esperar
Kutt no crea ninguna cuenta por adelantado: mientras no exista ningún usuario, la página de inicio redirige al formulario create admin, y el primer visitante se convierte en administrador. Abre tu dominio en cuanto funcione HTTPS y crea tu cuenta con una contraseña robusta. Después el formulario rechaza cualquier nueva creación.
Crear enlaces por la API
En los ajustes de tu cuenta, genera una clave de API y envíala en la cabecera X-API-KEY. El cuerpo JSON acepta target (la dirección larga) y, opcionalmente, customurl, password, description y expire_in (una duración como 7 days).
curl -s -X POST https://go.example.com/api/v2/links \
-H "X-API-KEY: $KUTT_API_KEY" \
-H 'Content-Type: application/json' \
-d '{"target": "https://example.com/une/adresse/tres/longue", "customurl": "promo", "expire_in": "7 days"}'La respuesta contiene el campo link, el enlace corto completo. El mismo punto de acceso con GET lista tus enlaces con su número de visitas, y /api/v2/links/<id>/stats devuelve las estadísticas detalladas de un enlace. Así conectas Kutt a un CRM, a un script de facturación o a una campaña de correo: cada enlace saliente se acorta y se mide sin intervención.
Trabajar en equipo
El registro está cerrado: el administrador crea las cuentas desde la página de administración. Cada miembro tiene sus propios enlaces, sus estadísticas privadas y su clave de API, que se revoca generando una nueva. El administrador ve todos los enlaces de la instancia y puede bloquear uno abusivo; es importante, porque un acortador con tu dominio compromete su reputación.
Kutt también acepta dominios adicionales, que se añaden en los ajustes. Cada uno debe apuntar al VPS y tener su propio certificado: empieza con un solo dominio y añade los demás de uno en uno.
Activar el correo
Kutt se instala con el correo desactivado: sin restablecimiento de contraseña por correo ni verificación de direcciones. Para activarlos, añade al entorno del contenedor MAIL_ENABLED: "true" y las variables MAIL_HOST, MAIL_PORT, MAIL_USER, MAIL_PASSWORD y MAIL_FROM de tu servidor SMTP, y reinicia con docker compose up -d. Guarda bien la contraseña de administrador mientras tanto: sin correo, perderla se resuelve en la base de datos.
Dimensionar el VPS
Para un equipo y unos miles de enlaces, 512 MB de RAM y una vCPU sobran: una redirección es una simple lectura en la base. La base SQLite crece con las visitas registradas, del orden de unos cientos de bytes por clic. Por encima de cientos de miles de clics al día, pasa a PostgreSQL (DB_CLIENT: pg) y activa Redis (REDIS_ENABLED) para la caché.
Copia de seguridad y actualización
Todos los datos están en el volumen kutt-data: la base SQLite contiene las cuentas, los enlaces y las estadísticas. Detén el contenedor un momento para obtener una copia coherente y archiva el volumen.
docker compose stop kutt
docker run --rm -v kutt_kutt-data:/data -v "$PWD":/backup alpine \
tar czf /backup/kutt-$(date +%F).tar.gz -C /data .
docker compose start kuttPara actualizar, lee las notas de versión del proyecto, cambia la etiqueta de la imagen y descarga la nueva: las migraciones se aplican al arrancar. Haz siempre una copia justo antes.
# changer l'étiquette de l'image dans compose.yaml, puis :
docker compose pull && docker compose up -dInstalación en un clic desde el Marketplace de ServOrbit
En un VPS de ServOrbit, Kutt se instala desde el Marketplace de tu área de cliente: elige la dirección — un subdominio corto de uno de tus dominios o el subdominio gratuito del VPS, con HTTPS incluido — y haz clic en Instalar. El script despliega el contenedor, genera la clave secreta, ajusta el dominio de los enlaces y configura nginx. Solo queda abrir tu dominio para crear la cuenta de administrador y tu primera clave de API.