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:
- Firefox: Linkding Extension en Firefox Add-ons
- Chrome/Chromium: Linkding Extension en Chrome Web Store
Configuración de la extensión:
- Instalar la extensión en el navegador
- Clic en el icono de la extensión > Configuración
- URL del servidor:
https://links.tu-dominio.com - Token de API: obtener desde Linkding > Usuario > API Token
- 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.


