Instalación de Vikunja: Gestión de Tareas Self-Hosted

Vikunja es una plataforma open-source de gestión de tareas y proyectos que combina listas de tareas, tableros Kanban, vistas de calendario y diagramas de Gantt en una sola aplicación. Con soporte para CalDAV, API REST, colaboración en equipo y notificaciones, Vikunja es la alternativa self-hosted a Todoist, Asana o Trello para equipos y usuarios que quieren control total sobre sus datos de productividad.

Requisitos Previos

  • Servidor con Ubuntu 20.04+, Debian 11+ o CentOS 8+
  • Docker y Docker Compose instalados
  • Mínimo 512 MB de RAM
  • Puerto 3456 disponible (API) o proxy inverso configurado
  • Base de datos MySQL/MariaDB, PostgreSQL o SQLite

Instalación con Docker Compose

# Crear directorio de instalación
mkdir -p ~/vikunja && cd ~/vikunja

# Crear el archivo docker-compose.yml
cat > docker-compose.yml << 'EOF'
version: '3'

services:
  vikunja:
    image: vikunja/vikunja
    container_name: vikunja
    restart: unless-stopped
    ports:
      - 3456:3456
    environment:
      VIKUNJA_DATABASE_HOST: db
      VIKUNJA_DATABASE_PASSWORD: contrasena-db-segura
      VIKUNJA_DATABASE_TYPE: mysql
      VIKUNJA_DATABASE_USER: vikunja
      VIKUNJA_DATABASE_DATABASE: vikunja
      VIKUNJA_SERVICE_JWTSECRET: $(openssl rand -hex 32)
      VIKUNJA_SERVICE_PUBLICURL: https://tareas.tu-dominio.com/
      VIKUNJA_MAILER_ENABLED: "false"
    volumes:
      - ./files:/app/vikunja/files
    depends_on:
      db:
        condition: service_healthy

  db:
    image: mariadb:10.11
    container_name: vikunja-db
    restart: unless-stopped
    command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    environment:
      MYSQL_ROOT_PASSWORD: contrasena-root
      MYSQL_USER: vikunja
      MYSQL_PASSWORD: contrasena-db-segura
      MYSQL_DATABASE: vikunja
    volumes:
      - ./db:/var/lib/mysql
    healthcheck:
      test: ["CMD-SHELL", "mysqladmin ping -h localhost -u $$MYSQL_USER --password=$$MYSQL_PASSWORD"]
      interval: 2s
      start_period: 30s
EOF

# Crear directorios necesarios
mkdir -p ~/vikunja/{files,db}

# Iniciar los servicios
docker compose up -d

# Ver los logs de inicio
docker compose logs -f vikunja

Acceder a Vikunja en http://TU-SERVIDOR:3456 para crear la cuenta de administrador.

Configuración del Servidor Vikunja

Para configuración más avanzada, usar un archivo de configuración:

# Crear archivo de configuración personalizado
cat > ~/vikunja/config.yaml << 'EOF'
service:
  # URL pública del servidor (importante para enlances en emails)
  publicurl: https://tareas.tu-dominio.com
  # Tiempo de expiración del token JWT (en segundos)
  jwtttl: 259200  # 3 días
  # Tiempo de expiración del token de refresco
  jwtttllong: 2592000  # 30 días
  # Habilitar registro de nuevos usuarios
  enableregistration: true
  # Zona horaria del servidor
  timezone: Europe/Madrid
  # Número máximo de resultados por página en la API
  maxitemsperpage: 50

database:
  type: mysql
  host: db
  user: vikunja
  password: contrasena-db-segura
  database: vikunja

mailer:
  enabled: true
  host: smtp.tu-dominio.com
  port: 587
  authtype: plain
  username: [email protected]
  password: contrasena-smtp
  fromemail: [email protected]
  skiptlsverify: false

log:
  level: info

files:
  # Ruta donde se guardan los archivos adjuntos
  basepath: /app/vikunja/files/
  # Tamaño máximo de archivo en bytes (100MB)
  maxsize: 104857600
EOF

# Montar el archivo de configuración en docker-compose.yml
# En el servicio vikunja, agregar en volumes:
# - ./config.yaml:/app/vikunja/config.yaml:ro

Configuración de Proyectos y Tareas

Una vez conectado a la interfaz web:

Estructura de organización:

  • Espacio de trabajo (Workspace): Área principal de organización
  • Proyectos: Colecciones de tareas relacionadas
  • Tareas: Unidades individuales de trabajo con fecha límite, etiquetas y asignados
  • Subtareas: División de tareas complejas

Crear proyectos via API:

# Obtener token de autenticación
TOKEN=$(curl -s -X POST https://tareas.tu-dominio.com/api/v1/login \
  -H "Content-Type: application/json" \
  -d '{"username":"admin","password":"contrasena"}' | \
  python3 -c "import sys,json; print(json.load(sys.stdin)['token'])")

# Crear un proyecto nuevo
curl -s -X PUT https://tareas.tu-dominio.com/api/v1/projects \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Proyecto de Desarrollo",
    "description": "Tareas del equipo de desarrollo",
    "color": "#1565C0",
    "is_archived": false
  }' | python3 -m json.tool

# Crear una tarea en el proyecto
curl -s -X PUT https://tareas.tu-dominio.com/api/v1/projects/1/tasks \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Configurar servidor de staging",
    "description": "Configurar el servidor de staging con Docker",
    "due_date": "2024-12-31T23:59:00Z",
    "priority": 3,
    "percent_done": 0
  }' | python3 -m json.tool

Tableros Kanban

Vikunja soporta vista Kanban con columnas personalizables:

# Crear un tablero Kanban via API
# Primero crear un "bucket" (columna)
curl -s -X PUT https://tareas.tu-dominio.com/api/v1/projects/1/buckets \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Por Hacer",
    "limit": 0
  }'

curl -s -X PUT https://tareas.tu-dominio.com/api/v1/projects/1/buckets \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "En Progreso",
    "limit": 5
  }'

curl -s -X PUT https://tareas.tu-dominio.com/api/v1/projects/1/buckets \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"title": "Completado"}'

Desde el panel web, cambiar a la vista Kanban con el icono de tablero en la barra superior.

Sincronización CalDAV

Vikunja implementa CalDAV para sincronizar tareas con calendarios:

# URL del servidor CalDAV de Vikunja
# https://tareas.tu-dominio.com/dav/

# Configurar en GNOME Calendar/Thunderbird:
# URL: https://tareas.tu-dominio.com/dav/
# Usuario: tu usuario de Vikunja
# Contraseña: tu contraseña de Vikunja

# Configurar en Nextcloud (como fuente externa)
# CalDAV principal: https://tareas.tu-dominio.com/dav/calendars/usuario/

Clientes CalDAV compatibles:

  • Thunderbird con Lightning
  • GNOME Calendar / Evolution
  • DAVx5 en Android
  • Apple Calendar en iOS/macOS

Notificaciones por Email

# Verificar la configuración del mailer
docker exec vikunja /app/vikunja/vikunja check --config /app/vikunja/config.yaml

# Probar el envío de email
curl -s -X POST https://tareas.tu-dominio.com/api/v1/user/settings/email/test \
  -H "Authorization: Bearer $TOKEN"

# Las notificaciones se activan automáticamente cuando:
# - Se te asigna una tarea
# - Se agrega un comentario a una tarea tuya
# - Una tarea llega a su fecha límite
# - Alguien menciona tu usuario en un comentario

# Configurar preferencias de notificación:
# Panel web > Configuración > Notificaciones

API de Vikunja

Vikunja tiene una API REST completa documentada en Swagger:

# Documentación interactiva de la API
# https://tareas.tu-dominio.com/api/v1/docs

# Endpoints principales:
# GET    /api/v1/projects              - Listar proyectos
# PUT    /api/v1/projects              - Crear proyecto
# GET    /api/v1/projects/{id}/tasks   - Listar tareas del proyecto
# PUT    /api/v1/projects/{id}/tasks   - Crear tarea
# POST   /api/v1/tasks/{id}            - Actualizar tarea
# DELETE /api/v1/tasks/{id}            - Eliminar tarea

# Ejemplo: Obtener todas las tareas pendientes
curl -s "https://tareas.tu-dominio.com/api/v1/tasks/all?filter_by=done&filter_value=false" \
  -H "Authorization: Bearer $TOKEN" | \
  python3 -c "import sys,json; [print(f\"- {t['title']}\") for t in json.load(sys.stdin)]"

# Marcar una tarea como completada
curl -s -X POST "https://tareas.tu-dominio.com/api/v1/tasks/1" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"done": true}' | python3 -m json.tool

Proxy Inverso con Nginx

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

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

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

    location / {
        proxy_pass http://127.0.0.1:3456;
        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;
        # WebSocket para notificaciones en tiempo real
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}
EOF

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

Solución de Problemas

Vikunja no inicia:

# Ver logs detallados
docker compose logs vikunja --tail 50
docker compose logs db --tail 20

# Verificar que la base de datos está accesible
docker exec vikunja-db mariadb -u vikunja -pcontrasena-db-segura vikunja -e "SELECT 1"

# Comprobar la configuración
docker exec vikunja /app/vikunja/vikunja --help

Error al iniciar sesión o token inválido:

# El JWT_SECRET debe ser consistente entre reinicios
# Verificar la variable de entorno:
docker exec vikunja env | grep JWT

# Si cambió el secreto, todos los tokens existentes se invalidan
# Los usuarios deberán volver a iniciar sesión

CalDAV no sincroniza:

# Verificar que el endpoint CalDAV responde
curl -v https://tareas.tu-dominio.com/dav/ \
  -u "admin:contrasena" 2>&1 | grep -E "HTTP|DAVF"

# Verificar la configuración del proxy Nginx
# El CalDAV requiere soporte para los métodos PROPFIND, REPORT, etc.
# Agregar en Nginx:
# proxy_method $request_method;

Conclusión

Vikunja ofrece una gestión de tareas moderna y completa con una API robusta que permite integraciones con otras herramientas. Su soporte nativo para CalDAV facilita la sincronización con aplicaciones de calendario existentes, y su interfaz limpia con vistas Kanban y de Gantt lo hace adecuado tanto para uso personal como para equipos pequeños que buscan control total sobre su gestión de proyectos.