Cómo instalar Vikunja con Docker
Índice de contenidos
- Puntos clave
- ¿Qué es Vikunja?
- ¿Qué vistas ofrece: lista, kanban, Gantt y calendario?
- El docker-compose.yml de Vikunja con base de datos
- Variables de configuración clave
- ¿Cómo publicarlo con un proxy inverso y HTTPS?
- Preguntas frecuentes
- ¿Necesito de verdad PostgreSQL o me vale con SQLite?
- ¿Por qué no debo usar la etiqueta latest de la imagen?
- ¿Cómo hago copias de seguridad de Vikunja?
- Conclusión
- Fuentes
Vikunja es un gestor de tareas de código abierto que autoalojas con Docker en una sola imagen. Con un archivo docker-compose.yml levantas la aplicación junto a una base de datos PostgreSQL y organizas tus proyectos en vistas de lista, tablero kanban, Gantt y tabla, con todos los datos guardados en tu propio servidor.
Vikunja es un gestor de tareas y proyectos que puedes autoalojar con Docker en cuestión de minutos, y desde hace poco cabe en una sola imagen. En esta guía levantas la aplicación junto a una base de datos PostgreSQL con un único archivo docker-compose.yml, aprendes a configurar las variables imprescindibles, a organizar tus tareas en vistas de lista, kanban, Gantt y tabla, y a publicarla con HTTPS detrás de un proxy inverso. La misma explicación está disponible en inglés.
Puntos clave
- Vikunja es un gestor de tareas de código abierto con licencia AGPLv3, escrito en Go, que sustituye a servicios como Todoist o Trello y guarda tus datos en tu propio servidor.
- Desde la versión unificada, todo vive en una sola imagen
vikunja/vikunja; ya no hay que combinarvikunja/apiyvikunja/frontendpor separado. - El contenedor escucha en el puerto 3456 y corre como el usuario
1000, así que la carpeta de adjuntos debe pertenecer a ese UID antes de arrancar. - Soporta tres bases de datos (SQLite por defecto, MySQL/MariaDB y PostgreSQL); para uso serio conviene una PostgreSQL en su propio contenedor.
- La variable
VIKUNJA_SERVICE_PUBLICURLes obligatoria: sin la URL pública correcta, el frontend no encuentra la API cuando lo pones detrás de un proxy.
¿Qué es Vikunja?
Vikunja es una aplicación de código abierto para gestionar tareas y proyectos que alojas en tu propia infraestructura, un reemplazo autoalojado de herramientas como Todoist, Trello o Asana. Su lema resume bien la idea: es el gestor de tareas que de verdad posees, porque los datos se quedan en tu servidor y no en la nube de un tercero.
Está escrito en Go, lo que se traduce en un único binario ligero, con un frontend en Vue que además funciona como aplicación web instalable (PWA) en el móvil. Se publica bajo licencia AGPLv3 y expone una API REST completa, de modo que puedes conectar clientes propios o integrarlo con otras herramientas. Trae migración incorporada desde Todoist, Trello y Microsoft To-Do, así que mudarte desde una de esas plataformas es cuestión de importar un archivo.
¿Qué vistas ofrece: lista, kanban, Gantt y calendario?
La gran ventaja de Vikunja frente a una lista de tareas simple es que cada proyecto se puede ver de varias formas a la vez. Desde el sistema de vistas múltiples introducido en la versión 0.24, defines para cada proyecto las vistas que quieras y cambias entre ellas con un clic:
- Lista: la vista clásica, ideal para el día a día y para marcar tareas como hechas.
- Tablero kanban: columnas arrastrables (por hacer, en curso, hecho) para seguir el estado de un flujo de trabajo.
- Gantt: una línea temporal perfecta para planificar plazos y fechas de vencimiento de un vistazo.
- Tabla: una rejilla con columnas de prioridad, etiquetas, responsables y fechas.
Para el calendario, Vikunja no incluye una vista de calendario mensual como tal, pero sí ofrece integración CalDAV: suscribes tu app de calendario habitual (la del móvil, Thunderbird u otra) al servidor de Vikunja y tus tareas con fecha aparecen ahí automáticamente. Además, el nuevo sistema de filtros con lenguaje de consulta te deja crear vistas precisas del tipo «tareas mías con vencimiento esta semana».
El docker-compose.yml de Vikunja con base de datos
Crea una carpeta para el proyecto, prepara la carpeta de adjuntos con el usuario correcto y guarda dentro este docker-compose.yml. Sustituye cada valor cambia_esta_clave... por una contraseña propia y el secreto por una cadena aleatoria larga antes de arrancar:
services:
db:
image: postgres:17-alpine
restart: unless-stopped
volumes:
- db_data:/var/lib/postgresql/data
environment:
POSTGRES_USER: vikunja
POSTGRES_PASSWORD: cambia_esta_clave_db
POSTGRES_DB: vikunja
healthcheck:
test: ["CMD-SHELL", "pg_isready -U vikunja"]
interval: 30s
timeout: 5s
retries: 5
vikunja:
image: vikunja/vikunja:2.3.0
restart: unless-stopped
ports:
- "3456:3456"
depends_on:
db:
condition: service_healthy
volumes:
- ./files:/app/vikunja/files
environment:
VIKUNJA_SERVICE_PUBLICURL: "http://localhost:3456"
VIKUNJA_SERVICE_SECRET: cambia_esta_clave_secreta_larga_y_aleatoria
VIKUNJA_SERVICE_ENABLEREGISTRATION: "true"
VIKUNJA_DATABASE_TYPE: postgres
VIKUNJA_DATABASE_HOST: db
VIKUNJA_DATABASE_USER: vikunja
VIKUNJA_DATABASE_PASSWORD: cambia_esta_clave_db
VIKUNJA_DATABASE_DATABASE: vikunja
volumes:
db_data:
Fíjate en algunos detalles del archivo. La aplicación no arranca hasta que PostgreSQL pasa su healthcheck, gracias a depends_on con la condición service_healthy. El contenedor escucha en el puerto 3456 y lo publicamos en el mismo puerto del anfitrión. Los adjuntos que subas a las tareas se guardan en un bind mount ./files, y como Vikunja corre con el UID 1000, esa carpeta debe pertenecer a ese usuario. Prepárala antes del primer arranque:
mkdir -p files
sudo chown 1000:1000 files
docker compose up -d
docker compose ps
Cuando el registro deje de moverse, abre http://localhost:3456 en el navegador. Verás la pantalla de bienvenida de Vikunja lista para crear la primera cuenta.
Variables de configuración clave
Vikunja se configura por completo con variables de entorno con el prefijo VIKUNJA_. Hay tres que conviene entender bien:
VIKUNJA_SERVICE_PUBLICURLes la más importante: debe coincidir con la URL exacta por la que los usuarios llegan a la aplicación (con su esquemahttps://y sin barra final de más). Si la dejas mal, el frontend cargará pero no podrá hablar con la API y verás errores de red al iniciar sesión.VIKUNJA_SERVICE_SECRETes el secreto con el que se firman los tokens JWT de sesión. Genera una cadena larga y aleatoria; si cambias este valor, todas las sesiones abiertas se invalidan. La antiguaVIKUNJA_SERVICE_JWTSECRETsigue funcionando pero está deprecada.VIKUNJA_SERVICE_ENABLEREGISTRATIONviene atruepor defecto. Déjalo así el tiempo justo para crear tu usuario y luego ponlo afalsey recrea el contenedor; de lo contrario, cualquiera que llegue a tu instancia podría registrarse.
Una buena práctica es sacar estos valores a un archivo .env en lugar de escribirlos directamente en el Compose; es el mismo patrón que usan otras herramientas de esta serie, como Firefly III para tus finanzas personales. Para arrancar desde cero, primero necesitas Docker instalado; sigue la guía para instalar Docker en Ubuntu 24.04 si es tu caso.
¿Cómo publicarlo con un proxy inverso y HTTPS?
Servir Vikunja por HTTP plano solo vale para pruebas en tu red local. Para sacarlo a Internet con un certificado válido, colócalo detrás de un proxy inverso que gestione TLS. Con Nginx Proxy Manager basta con crear un «proxy host» que apunte al contenedor en el puerto 3456 y pedir un certificado de Let’s Encrypt desde su interfaz.
Si prefieres Traefik, quita la sección ports del servicio vikunja, conéctalo a la red del proxy y añádele estas etiquetas:
labels:
- "traefik.enable=true"
- "traefik.http.routers.vikunja.rule=Host(`tareas.midominio.com`)"
- "traefik.http.routers.vikunja.entrypoints=websecure"
- "traefik.http.routers.vikunja.tls.certresolver=le"
- "traefik.http.services.vikunja.loadbalancer.server.port=3456"
El paso que no debes olvidar: actualiza VIKUNJA_SERVICE_PUBLICURL a tu dominio real con HTTPS (por ejemplo https://tareas.midominio.com) y recrea el contenedor. Es el error más común al publicar Vikunja: el proxy funciona, pero el frontend sigue apuntando a localhost y el inicio de sesión falla.
Preguntas frecuentes
¿Necesito de verdad PostgreSQL o me vale con SQLite?
Para una instancia personal y de bajo uso, SQLite (el backend por defecto) funciona sin configurar nada: se guarda en un archivo dentro del volumen. Pero si vais a ser varios usuarios o quieres copias de seguridad más robustas y mejor rendimiento con muchas tareas, una base de datos PostgreSQL en su propio contenedor es la opción recomendada, y es la que hemos usado en el docker-compose.yml de arriba.
¿Por qué no debo usar la etiqueta latest de la imagen?
Porque :latest cambia sin avisarte y una actualización mayor podría introducir migraciones de base de datos o cambios de configuración durante un simple reinicio. Al fijar vikunja/vikunja:2.3.0 decides tú cuándo actualizas: lees primero las notas de la versión, haces una copia de seguridad y solo entonces subes la etiqueta. La versión 2.3.0 se publicó en abril de 2026 con 277 commits y varias correcciones de seguridad.
¿Cómo hago copias de seguridad de Vikunja?
Necesitas dos piezas: el volcado de la base de datos y la carpeta de adjuntos. Exporta PostgreSQL con pg_dump y copia el bind mount ./files, donde viven los ficheros que adjuntas a las tareas:
docker compose exec db pg_dump -U vikunja vikunja > vikunja-db.sql
tar czf vikunja-files.tar.gz files
Con esos dos elementos puedes restaurar la instancia completa en otro servidor.
Conclusión
Con un único docker-compose.yml tienes un gestor de tareas completo y privado: aplicación y base de datos, con vistas de lista, kanban, Gantt y tabla, y todos los datos en tu servidor. El siguiente paso lógico es publicarlo con seguridad detrás de Nginx Proxy Manager o Traefik, ajustar VIKUNJA_SERVICE_PUBLICURL a tu dominio y programar copias de seguridad de la base de datos y los adjuntos. A partir de ahí, importa tus tareas desde Todoist o Trello y organiza tus proyectos a tu manera.