Preparar Jarvis, un asistente de IA local con Debian, Proxmox y Ollama

Crea un asistente personal local con una VM Debian en Proxmox, Docker, Ollama y Open WebUI, con estructura preparada para añadir voz y avatar.

Resumen: crearás una VM Debian en Proxmox dentro de la VLAN Jarvis, la fijarás en 192.168.100.10, instalarás Docker y separarás Ollama, Jarvis, la voz y el avatar en carpetas independientes para poder ampliarlos sin rehacer la base.

Esta guía explica cómo crear la máquina virtual Debian en el equipo donde está Proxmox, conectarla a la VLAN Jarvis y dejar operativo un asistente local con una estructura preparada para crecer. La red de ejemplo es 192.168.100.0/24 y Debian usará la IP fija 192.168.100.10.

1. Diseña la red antes de crear la VM

La VLAN Jarvis debe estar creada en el firewall y en UniFi antes de arrancar Debian (más detalles en la guía de firewall con VLANs). En este ejemplo usamos:

VLAN:       Jarvis
Red:        192.168.100.0/24
Gateway:    192.168.100.1  # ejemplo
Debian VM:  192.168.100.10
DNS:        192.168.100.1  # ejemplo

Reserva 192.168.100.10 para Debian y deja fuera del DHCP las IPs fijas que vayas a utilizar. El gateway es orientativo: usa el que tenga configurado tu firewall.

2. Crea la máquina virtual en Proxmox

En Proxmox selecciona Create VM y configura una VM independiente para Jarvis:

Nombre:       jarvis-debian
ISO:          Debian 12 netinst 64-bit
CPU:          4 vCPU como punto de partida
RAM:          8 GB; 16 GB si usarás modelos locales grandes
Disco:        80 GB o más en almacenamiento SSD/NVMe
Controlador:  SCSI con SSD emulation si está disponible
Red:          VirtIO, bridge habitual y VLAN Tag: 100

Activa QEMU Guest Agent si tu plantilla lo permite. La etiqueta VLAN debe coincidir con la VLAN Jarvis; no la confundas con la VLAN Docker ni con la red de gestión.

3. Instala Debian

Arranca la VM desde la ISO y selecciona una instalación mínima. Crea un usuario normal, define un nombre de equipo como jarvis-debian, instala el servidor SSH cuando el instalador lo ofrezca y deja el entorno gráfico fuera si la VM funcionará como servidor.

En el particionado, usa una partición raíz suficiente, activa swap según la RAM disponible y reserva espacio para los datos de Docker. No guardes los modelos dentro de la partición raíz si puedes dedicarles un disco o volumen separado.

4. Configura la IP fija de Debian

Tras el primer arranque, identifica la interfaz con ip link. En Debian con NetworkManager puedes usar nmcli; con una instalación tradicional, configura la interfaz de red según el gestor activo. El objetivo es que Debian conserve siempre la IP 192.168.100.10.

ip addr
ip route
cat /etc/resolv.conf

# Comprobaciones esperadas
ping -c 3 192.168.100.1
ping -c 3 1.1.1.1
getent hosts deb.debian.org

Si tu gateway, DNS o nombre de interfaz son distintos, sustitúyelos. Comprueba primero que la VM tiene conectividad antes de continuar.

5. Actualiza Debian e instala las herramientas base

Conéctate desde tu ordenador por SSH y actualiza el sistema:

ssh usuario@192.168.100.10

sudo apt update
sudo apt full-upgrade -y
sudo apt install -y ca-certificates curl git vim htop unzip jq
sudo reboot

Cuando vuelva a arrancar, reconecta por SSH. Mantén el usuario normal para trabajar y utiliza sudo solo para las tareas administrativas.

6. Protege el acceso SSH

Usa una clave SSH desde tu equipo de administración y desactiva el acceso directo de root. Antes de cerrar tu sesión actual, abre una segunda sesión y comprueba que la clave funciona.

# En tu ordenador de administración
ssh-keygen -t ed25519
ssh-copy-id usuario@192.168.100.10

# En Debian, después de probar la clave
sudo nano /etc/ssh/sshd_config

# Revisa estas opciones
PermitRootLogin no
PubkeyAuthentication yes
PasswordAuthentication no

sudo systemctl restart ssh

No desactives las contraseñas hasta comprobar que la clave SSH funciona. Guarda una vía de recuperación local en Proxmox.

7. Instala Docker y Docker Compose

Instala Docker usando el método oficial para Debian o los paquetes mantenidos por tu distribución. Después activa el servicio y permite que tu usuario lo use sin sudo:

sudo apt update
sudo apt install -y docker.io docker-compose-plugin
sudo systemctl enable --now docker
sudo usermod -aG docker $USER
newgrp docker

docker version
docker compose version

docker run --rm hello-world

Si docker-compose-plugin no está disponible en tu versión, usa el repositorio oficial de Docker para Debian. Verifica siempre que la arquitectura de los contenedores sea compatible con el procesador del equipo.

8. Organiza Jarvis para que sea escalable

Separa el motor de modelos, la interfaz y la configuración del asistente. Usa una carpeta por servicio y guarda cada Compose en su propia ubicación:

/home/usuario/docker/
├── ollama/
│   ├── compose.yaml
│   └── data/
├── jarvis/
│   ├── compose.yaml
│   ├── data/
│   ├── config/
│   └── .env
└── shared/
    ├── prompts/
    └── backups/
mkdir -p /home/usuario/docker/ollama/data
mkdir -p /home/usuario/docker/jarvis/{data,config}
mkdir -p /home/usuario/docker/shared/{prompts,backups}
chown -R usuario:usuario /home/usuario/docker

Esta separación permite actualizar Ollama, Jarvis o la configuración sin mezclar sus datos. Sustituye usuario por tu usuario real de Debian.

9. Despliega Ollama en su propia carpeta

Ollama será el motor que descarga y sirve los modelos locales. Guarda este Compose en /home/usuario/docker/ollama/compose.yaml. La IP 192.168.100.20 es un ejemplo reservado dentro de la VLAN Jarvis:

services:
  ollama:
    image: ollama/ollama:latest
    container_name: ollama
    restart: unless-stopped
    ports:
      - "11434:11434"
    volumes:
      - ./data:/root/.ollama
    networks:
      jarvis_internal:
      jarvis_vlan:
        ipv4_address: 192.168.100.20

networks:
  jarvis_internal:
    name: jarvis_internal
  jarvis_vlan:
    external: true

La red externa jarvis_vlan debe existir antes. Si todavía no usas una macvlan para esta VLAN (consulta la guía de red macvlan), empieza con la red interna y publica el servicio solo en Debian.

cd /home/usuario/docker/ollama
docker compose up -d

docker exec -it ollama ollama pull qwen2.5:3b
docker exec -it ollama ollama list

El modelo depende de la RAM y la CPU disponibles. Empieza con un modelo pequeño y aumenta el tamaño solo después de comprobar el consumo.

10. Despliega la interfaz de Jarvis

Para tener una interfaz operativa, usa Open WebUI conectado al servicio Ollama. Guarda este Compose en /home/usuario/docker/jarvis/compose.yaml:

services:
  jarvis:
    image: ghcr.io/open-webui/open-webui:main
    container_name: jarvis
    restart: unless-stopped
    environment:
      - OLLAMA_BASE_URL=http://ollama:11434
      - WEBUI_AUTH=true
    volumes:
      - ./data:/app/backend/data
    ports:
      - "3000:8080"
    networks:
      jarvis_internal:
      jarvis_vlan:
        ipv4_address: 192.168.100.21
    depends_on:
      - ollama

networks:
  jarvis_internal:
    external: true
  jarvis_vlan:
    external: true

Arranca desde su carpeta con docker compose up -d y entra en http://192.168.100.21:3000. La primera cuenta creada queda como administradora. Usa una contraseña única y no la incluyas en esta documentación.

11. Comprueba que Jarvis está operativo

Verifica primero los contenedores y después la comunicación entre servicios:

cd /home/usuario/docker/ollama
docker compose ps

docker network inspect jarvis_internal
curl http://127.0.0.1:11434/api/tags

cd /home/usuario/docker/jarvis
docker compose ps
docker compose logs --tail=100 jarvis

Desde la interfaz de Jarvis selecciona Ollama, elige el modelo descargado y realiza una conversación de prueba.

12. Define firewall y acceso por VLAN

Permite desde la VLAN de administración únicamente el acceso necesario a 192.168.100.21:3000. Mantén el puerto de Ollama 11434 accesible solo entre los contenedores o desde la propia VLAN Jarvis si necesitas administrarlo. No publiques Jarvis directamente en Internet.

sudo apt install -y ufw
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow from 192.168.100.0/24 to any port 3000 proto tcp
sudo ufw allow from RED_GESTION to any port 22 proto tcp
sudo ufw enable
sudo ufw status verbose

Sustituye RED_GESTION por el rango de tu VLAN de gestión. En el firewall principal documenta las reglas entre VLANs y conserva la separación respecto a las redes Home, IoT e Invitados.

13. Haz copias y actualizaciones controladas

Los datos importantes están en /home/usuario/docker/ollama/data, /home/usuario/docker/jarvis/data, los archivos Compose, el archivo .env y los prompts. Haz copias sin incluir contraseñas en texto plano.

cd /home/usuario/docker

docker compose -f ollama/compose.yaml pull
docker compose -f jarvis/compose.yaml pull
docker compose -f ollama/compose.yaml up -d
docker compose -f jarvis/compose.yaml up -d

Actualiza primero en una ventana de mantenimiento, revisa los logs y conserva una copia de la versión anterior si el servicio es importante.

14. Añade voz y cara a Jarvis

La voz y la cara deben ser capas separadas de la lógica. El flujo recomendado es: micrófono del cliente → reconocimiento de voz (STT) → Jarvis → Ollama → respuesta → síntesis de voz (TTS) y avatar visual.

/home/usuario/docker/jarvis/
├── compose.yaml
├── data/
├── config/
├── voice/
│   ├── stt/
│   └── tts/
└── face/
    ├── assets/
    └── frontend/

Voz: empieza usando la entrada de micrófono de la interfaz de Jarvis. Para una instalación totalmente local, añade un servicio STT basado en Whisper para convertir audio en texto y un servicio TTS basado en Piper para convertir la respuesta en audio. Mantén ambos dentro de la carpeta /home/usuario/docker/jarvis/voice y conéctalos a Jarvis mediante una red interna, sin publicar sus puertos fuera de la VLAN.

Cara: la cara pertenece al frontend, no al modelo. Crea una interfaz en /home/usuario/docker/jarvis/face/frontend con un avatar SVG o 2D. Define estados como idle, listening, thinking, speaking y error, y cambia la animación según el estado de la conversación. Empieza con un SVG ligero y deja la puerta abierta a Live2D o WebGL cuando la base funcione.

mkdir -p /home/usuario/docker/jarvis/voice/{stt,tts}
mkdir -p /home/usuario/docker/jarvis/face/{assets,frontend}

# Ejemplo de estados del avatar
idle       = espera
listening  = escuchando el micro
thinking   = procesando con Ollama
speaking   = reproduciendo la respuesta
error      = necesita atención

Prueba primero cada capa por separado: graba unos segundos y valida la transcripción, genera una respuesta de Ollama, reproduce el audio TTS y finalmente conecta el avatar. El navegador pedirá permiso para el micrófono; concédelo solo desde el equipo de confianza y mantén el acceso limitado a la VLAN Jarvis.

Privacidad: evita enviar audio a servicios externos si quieres que Jarvis sea local. No guardes grabaciones de voz por defecto y documenta qué componentes procesan audio, texto y credenciales.

Resultado esperado

Proxmox ejecuta una VM Debian en 192.168.100.10; Ollama mantiene los modelos en su propia carpeta; Jarvis usa una carpeta separada; ambos servicios se comunican por una red interna y la VLAN Jarvis queda documentada y controlada por el firewall.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *