Instalación de Linkding: Gestor de Marcadores Self-Hosted

Linkding es un gestor de marcadores web minimalista y ligero diseñado para ser rápido, fácil de desplegar y fácil de usar. Con soporte para etiquetas, búsqueda de texto completo, archivado automático de páginas (mediante SingleFile o Wayback Machine), extensión de navegador y una API REST completa, Linkding es la alternativa privada perfecta a servicios como Pinboard o Raindrop.io.

Requisitos Previos

  • Servidor con Ubuntu 20.04+, Debian 11+ o CentOS 8+
  • Docker instalado
  • Mínimo 256 MB de RAM (Linkding es muy ligero)
  • Puerto 9090 disponible

Instalación con Docker

# Crear directorio para los datos de Linkding
mkdir -p ~/linkding/data

# Ejecutar Linkding con Docker
docker run -d \
  --name linkding \
  --restart unless-stopped \
  -p 9090:9090 \
  -v ~/linkding/data:/etc/linkding/data \
  -e LD_SUPERUSER_NAME=admin \
  -e LD_SUPERUSER_PASSWORD=contrasena-segura-admin \
  sissbruecker/linkding:latest

Acceder al panel en http://TU-SERVIDOR:9090.

Instalación con Docker Compose

mkdir -p ~/linkding && cd ~/linkding

cat > docker-compose.yml << 'EOF'
version: '3'

services:
  linkding:
    image: sissbruecker/linkding:latest
    container_name: linkding
    restart: unless-stopped
    ports:
      - 9090:9090
    volumes:
      - ./data:/etc/linkding/data
    environment:
      # Crear superusuario al inicio
      LD_SUPERUSER_NAME: admin
      LD_SUPERUSER_PASSWORD: contrasena-segura-admin
      # Deshabilitar registro de nuevos usuarios
      LD_DISABLE_BACKGROUND_TASKS: "False"
      LD_DISABLE_URL_VALIDATION: "False"
      # Zona horaria
      TZ: Europe/Madrid
      # Habilitar archivado automático (requiere snaphot.as o similar)
      # LD_ENABLE_AUTH_PROXY: "False"
EOF

docker compose up -d
docker compose logs -f linkding

Configuración Inicial

Acceder a http://TU-SERVIDOR:9090 con las credenciales de administrador:

Panel de administración (Django):

  • URL: http://TU-SERVIDOR:9090/admin/
  • Aquí se gestionan usuarios, configuración y mantenimiento

Configuración de usuarios adicionales:

# Crear usuarios adicionales via CLI
docker exec -it linkding python manage.py createsuperuser

# O via el panel de administración de Django:
# /admin/auth/user/add/

# Establecer usuario como solo lectura (sin poder agregar marcadores)
# Admin > Users > Editar usuario > Permisos

Deshabilitar el registro público de nuevos usuarios:

# Agregar variable de entorno en docker-compose.yml
environment:
  LD_DISABLE_BACKGROUND_TASKS: "False"
  # Para deshabilitar el registro de nuevos usuarios,
  # eliminar o no crear la página de registro
  # (se gestiona en el panel de administración)

Extensión de Navegador

Linkding tiene extensiones oficiales para los principales navegadores:

Configuración de la extensión:

  1. Instalar la extensión en el navegador
  2. Clic en el icono de la extensión > Configuración
  3. URL del servidor: https://links.tu-dominio.com
  4. Token de API: obtener desde Linkding > Usuario > API Token
  5. Guardar y verificar
# Obtener el token de API
# Panel de Linkding > clic en tu nombre de usuario > API Token
# O via Django admin: /admin/authtoken/tokenproxy/

Sistema de Etiquetas

# Las etiquetas se asignan al agregar marcadores
# Formato: etiqueta1, etiqueta2, etiqueta-con-guiones

# Filtrar por etiqueta desde la UI:
# Clic en cualquier etiqueta en la lista de marcadores

# Crear marcador con etiquetas via API
API_TOKEN="tu-token-api"
curl -s -X POST https://links.tu-dominio.com/api/bookmarks/ \
  -H "Authorization: Token $API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://ejemplo.com/articulo",
    "title": "Artículo interesante",
    "description": "Un artículo sobre tecnología",
    "tag_names": ["tecnologia", "linux", "devops"],
    "is_archived": false,
    "unread": false,
    "shared": false
  }' | python3 -m json.tool

# Listar todas las etiquetas
curl -s https://links.tu-dominio.com/api/tags/ \
  -H "Authorization: Token $API_TOKEN" | python3 -m json.tool

Búsqueda de Texto Completo

# La búsqueda en Linkding funciona en:
# - Títulos de marcadores
# - URLs
# - Descripciones
# - Notas
# - Etiquetas

# Búsqueda via UI: barra de búsqueda en la parte superior

# Búsqueda via API
curl -s "https://links.tu-dominio.com/api/bookmarks/?q=docker+linux" \
  -H "Authorization: Token $API_TOKEN" | python3 -m json.tool

# Búsqueda avanzada con filtros
curl -s "https://links.tu-dominio.com/api/bookmarks/?q=kubernetes&tag_names=devops" \
  -H "Authorization: Token $API_TOKEN"

# Buscar solo en marcadores sin leer
curl -s "https://links.tu-dominio.com/api/bookmarks/?is_unread=true" \
  -H "Authorization: Token $API_TOKEN"

Archivado Automático de Páginas

Linkding puede archivar automáticamente el contenido de las páginas web guardadas para acceso offline:

# Configurar archivado con singlefile (herramienta de archivado web)
# Requiere Node.js y single-file-cli

npm install -g single-file-cli

# Configurar en Linkding (docker-compose.yml):
environment:
  LD_SINGLEFILE_PATH: /usr/bin/single-file
  # O usar la integración con Wayback Machine (sin instalación)
  # LD_ENABLE_WAYBACK_MACHINE_INTEGRATION: "True"

Para archivado con la máquina Wayback de Internet Archive:

  • Es gratuito y no requiere configuración adicional
  • Las páginas se envían automáticamente al guardar el marcador
  • Accesible desde el botón "Abrir versión archivada" en cada marcador

API REST

Linkding tiene una API REST completa y bien documentada:

# Documentación de la API disponible en:
# http://TU-SERVIDOR:9090/api/schema/swagger-ui/
# http://TU-SERVIDOR:9090/api/schema/redoc/

# Listar marcadores con paginación
curl -s "https://links.tu-dominio.com/api/bookmarks/?limit=10&offset=0" \
  -H "Authorization: Token $API_TOKEN"

# Obtener un marcador específico
curl -s "https://links.tu-dominio.com/api/bookmarks/1/" \
  -H "Authorization: Token $API_TOKEN"

# Actualizar un marcador
curl -s -X PATCH "https://links.tu-dominio.com/api/bookmarks/1/" \
  -H "Authorization: Token $API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"is_archived": true}'

# Eliminar un marcador
curl -s -X DELETE "https://links.tu-dominio.com/api/bookmarks/1/" \
  -H "Authorization: Token $API_TOKEN"

# Importar marcadores desde HTML (formato Netscape)
curl -s -X POST "https://links.tu-dominio.com/api/bookmarks/upload/" \
  -H "Authorization: Token $API_TOKEN" \
  -F "[email protected]"

Proxy Inverso con Nginx

# Obtener certificado SSL
sudo certbot --nginx -d links.tu-dominio.com

# Configuración de Nginx para Linkding
sudo tee /etc/nginx/sites-available/linkding << 'EOF'
server {
    listen 443 ssl http2;
    server_name links.tu-dominio.com;

    ssl_certificate /etc/letsencrypt/live/links.tu-dominio.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/links.tu-dominio.com/privkey.pem;

    location / {
        proxy_pass http://127.0.0.1:9090;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
    }
}
EOF

sudo ln -s /etc/nginx/sites-available/linkding /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx

Backup y Restauración

# Los datos de Linkding están en ~/linkding/data/
# Contiene la base de datos SQLite y los archivos adjuntos

# Backup completo
tar -czf linkding-backup-$(date +%Y%m%d).tar.gz ~/linkding/data/

# Exportar marcadores en formato HTML (para importar en otros gestores)
# Panel > Exportar > Descargar archivo HTML (formato Netscape)

# Exportar via API
curl -s "https://links.tu-dominio.com/api/bookmarks/?limit=9999" \
  -H "Authorization: Token $API_TOKEN" | \
  python3 -c "
import sys, json
data = json.load(sys.stdin)
for b in data['results']:
    print(f\"{b['url']} | {b['title']} | {', '.join(b['tag_names'])}\")
" > bookmarks-export-$(date +%Y%m%d).txt

# Restaurar desde backup
docker compose down
tar -xzf linkding-backup-YYYYMMDD.tar.gz -C ~/
docker compose up -d

Solución de Problemas

Linkding no inicia:

# Ver logs del contenedor
docker logs linkding --tail 30

# Verificar permisos del directorio de datos
ls -la ~/linkding/data/
# El directorio debe ser accesible por el usuario del contenedor (999:999)
sudo chown -R 999:999 ~/linkding/data/

No se puede iniciar sesión:

# Restablecer la contraseña del administrador
docker exec -it linkding python manage.py changepassword admin

# Si el superusuario no existe, crearlo de nuevo
docker exec -it linkding python manage.py createsuperuser

La extensión del navegador no guarda marcadores:

# Verificar que el token de API es válido
curl -s https://links.tu-dominio.com/api/bookmarks/ \
  -H "Authorization: Token TU-TOKEN" | head -50

# Regenerar el token de API si es necesario
# Admin > Users > Tokens > Eliminar token y crear uno nuevo
# O via CLI:
docker exec -it linkding python manage.py drf_create_token admin

Conclusión

Linkding destaca por su filosofía minimalista: es rápido, seguro y hace exactamente lo que promete sin complicaciones innecesarias. Su pequeño consumo de recursos lo hace ideal para correr junto a otros servicios en el mismo servidor, y su API bien documentada facilita integraciones con herramientas de automatización como n8n o Zapier para importar marcadores automáticamente desde fuentes externas.