Guía de despliegue

Kutt en un VPS: un acortador de URL con tu propio dominio

Desplegar en un VPS Cloud →

Tutorial

Kutt en un VPS: un acortador de URL con tu propio dominio

Autoalojamiento7 min de lectura4 pasos

Un enlace bit.ly en una campaña de SMS es un clic que pasa por un servicio que no controlas, una estadística que no es tuya y un dominio que no es el tuyo. Kutt, un acortador de URL de código abierto con licencia MIT, te lo devuelve todo: cada enlace corto lleva tu dominio, cada clic se queda en tu base de datos y una API REST permite que tus herramientas acorten sus propios enlaces. Esta guía instala Kutt con Docker Compose en un VPS, lo publica con HTTPS detrás de nginx, cierra el registro público y muestra cómo crear enlaces por la API.

Contenido· Por qué alojar tu propio acortador de URL1/12
  1. 01Por qué alojar tu propio acortador de URL
  2. 02Lo que aporta Kutt
  3. 03Kutt, Shlink y un servicio público
  4. 04Requisitos previos
  5. 05Instalar Kutt con Docker Compose
  6. 06Crea la cuenta de administrador sin esperar
  7. 07Crear enlaces por la API
  8. 08Trabajar en equipo
  9. 09Activar el correo
  10. 10Dimensionar el VPS
  11. 11Copia de seguridad y actualización
  12. 12Instalación en un clic desde el Marketplace de ServOrbit

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

KuttShlinkServicio público (bit.ly…)
Interfaz webIntegradaCliente web aparteSí
API RESTSí, clave por usuarioSí, claves gestionadas por línea de comandosSí, a menudo de pago
Tu propio dominioSí, incluidoSí, incluidoOpción de pago
EstadísticasEn tu base de datosEn tu base de datosEn el proveedor
Cuentas de equipoSí, creadas por el administradorNo, acceso por clave de APISegún el plan
AlmacenamientoSQLite, PostgreSQL o MySQLSQLite, PostgreSQL, MySQL o SQL ServerGestionado 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

  1. Preparar el directorio y los secretos

    Crea el directorio de la aplicación y un archivo .env con la clave secreta (firma las sesiones) y el dominio de los enlaces cortos. Sustituye go.example.com por 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 .env
  2. Escribir 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: {}
  3. 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/health
  4. Publicar 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-For permite 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 kutt

Para 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 -d

Instalació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.

Tus enlaces cortos, en tu dominio

Un VPS ServOrbit Ubuntu 24.04 con 512 MB de RAM basta para Kutt. Instalación en un clic desde el Marketplace, clave secreta generada para ti, HTTPS en tu dominio o en el subdominio gratuito del VPS.

¿Necesita ayuda?

Consulte nuestro centro de ayuda y nuestra FAQ, o contacte con nuestro equipo: llamada, WhatsApp o correo electrónico. Soporte en francés, inglés y árabe.

Escribir por WhatsAppse abre en una pestaña nueva