|
|
@@ -1,47 +1,157 @@
|
|
|
# VirtManager
|
|
|
|
|
|
-API for managing virtual machines on Ubuntu using FastAPI and libvirt.
|
|
|
+Una API REST y interfaz web para gestionar máquinas virtuales en Ubuntu usando FastAPI, libvirt y noVNC para consola web.
|
|
|
|
|
|
-## Installation
|
|
|
+## Características
|
|
|
|
|
|
-1. Create and activate a virtual environment:
|
|
|
+- **Gestión completa de VMs**: Crear, listar, iniciar, detener y eliminar máquinas virtuales.
|
|
|
+- **Configuración de arranque**: Cambiar el orden de arranque de las VMs (disco duro, CD-ROM, etc.).
|
|
|
+- **Consola web**: Acceso a la consola de las VMs vía navegador usando noVNC, sin necesidad de clientes VNC locales.
|
|
|
+- **Interfaz web intuitiva**: Interfaz basada en Bootstrap para gestionar VMs fácilmente.
|
|
|
+- **Auto-inicio**: Servicio systemd para que la aplicación se inicie automáticamente con el sistema.
|
|
|
+- **Documentación interactiva**: API documentada con Swagger UI.
|
|
|
+
|
|
|
+## Instalación
|
|
|
+
|
|
|
+### Prerrequisitos del Sistema
|
|
|
+
|
|
|
+Asegúrate de que libvirt esté instalado y configurado:
|
|
|
+
|
|
|
+```bash
|
|
|
+sudo apt update
|
|
|
+sudo apt install -y libvirt-daemon-system libvirt-dev pkg-config python3-libvirt python3-gi novnc websockify
|
|
|
+```
|
|
|
+
|
|
|
+### Instalación del Proyecto
|
|
|
+
|
|
|
+1. Clona o descarga el proyecto en `/home/creylopez/virtmanager` (o ajusta las rutas según corresponda).
|
|
|
+
|
|
|
+2. Crea y activa un entorno virtual:
|
|
|
```bash
|
|
|
python3 -m venv venv
|
|
|
source venv/bin/activate
|
|
|
```
|
|
|
|
|
|
-2. Install dependencies:
|
|
|
+3. Instala las dependencias de Python:
|
|
|
+ ```bash
|
|
|
+ pip install -e .
|
|
|
+ ```
|
|
|
+
|
|
|
+4. Configura permisos para libvirt (opcional, si no usas sudo):
|
|
|
+ ```bash
|
|
|
+ sudo usermod -a -G libvirt $USER
|
|
|
+ # Reinicia la sesión para aplicar cambios
|
|
|
+ ```
|
|
|
+
|
|
|
+### Configuración del Servicio Systemd (Auto-inicio)
|
|
|
+
|
|
|
+Para que VirtManager se inicie automáticamente con el sistema:
|
|
|
+
|
|
|
+1. Crea el archivo de servicio:
|
|
|
+ ```bash
|
|
|
+ sudo tee /etc/systemd/system/virtmanager.service > /dev/null <<EOF
|
|
|
+ [Unit]
|
|
|
+ Description=VirtManager API
|
|
|
+ After=network.target libvirtd.service
|
|
|
+
|
|
|
+ [Service]
|
|
|
+ Type=simple
|
|
|
+ User=root
|
|
|
+ WorkingDirectory=/home/creylopez/virtmanager
|
|
|
+ ExecStart=/home/creylopez/virtmanager/venv/bin/uvicorn app.main:app --host 0.0.0.0 --port 8000
|
|
|
+ Restart=always
|
|
|
+
|
|
|
+ [Install]
|
|
|
+ WantedBy=multi-user.target
|
|
|
+ EOF
|
|
|
+ ```
|
|
|
+
|
|
|
+2. Recarga systemd y habilita el servicio:
|
|
|
```bash
|
|
|
- pip install -r requirements.txt
|
|
|
+ sudo systemctl daemon-reload
|
|
|
+ sudo systemctl enable virtmanager
|
|
|
+ sudo systemctl start virtmanager
|
|
|
```
|
|
|
|
|
|
-3. Ensure libvirt and Python bindings are installed on the system:
|
|
|
+3. Verifica el estado:
|
|
|
```bash
|
|
|
- sudo apt install libvirt-daemon-system libvirt-dev pkg-config python3-libvirt python3-gi
|
|
|
+ sudo systemctl status virtmanager
|
|
|
```
|
|
|
|
|
|
-## Running the API
|
|
|
+La aplicación estará disponible en `http://localhost:8000` o `http://tu-ip:8000`.
|
|
|
|
|
|
-Set the environment variable for the images path if needed (default is /var/lib/libvirt/images):
|
|
|
+## Uso
|
|
|
+
|
|
|
+### Ejecución Manual (sin servicio)
|
|
|
+
|
|
|
+Si prefieres ejecutar manualmente:
|
|
|
|
|
|
```bash
|
|
|
-export LIBVIRT_IMAGES_PATH=/path/to/images
|
|
|
source venv/bin/activate
|
|
|
-uvicorn app.main:app --reload --host 0.0.0.0
|
|
|
+sudo uvicorn app.main:app --reload --host 0.0.0.0 --port 8000
|
|
|
```
|
|
|
|
|
|
-The API will be available at http://0.0.0.0:8000
|
|
|
+Nota: Se requiere `sudo` porque libvirt necesita permisos de root.
|
|
|
+
|
|
|
+### Variables de Entorno
|
|
|
+
|
|
|
+- `LIBVIRT_IMAGES_PATH`: Ruta para almacenar imágenes de disco (por defecto `/var/lib/libvirt/images`).
|
|
|
+
|
|
|
+```bash
|
|
|
+export LIBVIRT_IMAGES_PATH=/ruta/a/imagenes
|
|
|
+```
|
|
|
+
|
|
|
+## Endpoints de la API
|
|
|
+
|
|
|
+### VMs
|
|
|
+
|
|
|
+- `GET /`: Página de inicio (interfaz web).
|
|
|
+- `GET /vms`: Lista todas las VMs con estado, ID, nombre y puerto VNC si aplica.
|
|
|
+- `POST /vms?name={name}&memory={memory}&disk_size={disk_size}&iso={iso}`: Crea una nueva VM.
|
|
|
+ - `name`: Nombre de la VM.
|
|
|
+ - `memory`: Memoria en MiB.
|
|
|
+ - `disk_size`: Tamaño del disco en GB.
|
|
|
+ - `iso`: Ruta al archivo ISO para instalación.
|
|
|
+- `GET /vms/{vm_name}/start`: Inicia una VM por nombre.
|
|
|
+- `GET /vms/{vm_name}/stop`: Detiene una VM por nombre.
|
|
|
+- `DELETE /vms/{vm_name}`: Elimina una VM por nombre.
|
|
|
+- `PUT /vms/{vm_name}/boot-order`: Cambia el orden de arranque.
|
|
|
+ - Body JSON: `{"order": ["hd", "cdrom"]}` (ejemplo).
|
|
|
+
|
|
|
+### Discos
|
|
|
+
|
|
|
+- `POST /disks?name={name}&size={size}`: Crea una imagen de disco.
|
|
|
+ - `name`: Nombre del archivo (sin extensión).
|
|
|
+ - `size`: Tamaño en GB.
|
|
|
+
|
|
|
+### Consola
|
|
|
+
|
|
|
+- `GET /console/{vm_name}`: Obtiene la URL para la consola web noVNC de la VM.
|
|
|
+
|
|
|
+## Interfaz Web
|
|
|
+
|
|
|
+Accede a `http://localhost:8000` en tu navegador.
|
|
|
+
|
|
|
+- **Lista de VMs**: Tabla con estado (badges coloreados), acciones (iniciar/detener/eliminar/consola).
|
|
|
+- **Crear VM**: Formulario para especificar nombre, memoria, disco e ISO.
|
|
|
+- **Set Boot Order**: Selecciona una VM y define el orden de arranque (ej. "hd,cdrom").
|
|
|
+- **Consola**: Botón para abrir la consola web en una nueva pestaña (solo para VMs corriendo).
|
|
|
+
|
|
|
+## Documentación de la API
|
|
|
+
|
|
|
+Accede a `http://localhost:8000/docs` para la documentación interactiva de Swagger UI.
|
|
|
+
|
|
|
+## Notas
|
|
|
+
|
|
|
+- Las operaciones de VMs requieren que libvirt esté corriendo (`sudo systemctl start libvirtd`).
|
|
|
+- Para crear VMs, asegúrate de que el usuario tenga permisos en `/var/lib/libvirt/images` o ajusta `LIBVIRT_IMAGES_PATH`.
|
|
|
+- La consola web usa websockify para proxy VNC a WebSocket.
|
|
|
+- El servicio systemd ejecuta como root para acceso completo a libvirt.
|
|
|
|
|
|
-Access the web interface at http://0.0.0.0:8000
|
|
|
+## Contribución
|
|
|
|
|
|
-Access the interactive documentation at http://0.0.0.0:8000/docs
|
|
|
+Siéntete libre de contribuir con mejoras o reportar issues.
|
|
|
|
|
|
-## Endpoints
|
|
|
+## Licencia
|
|
|
|
|
|
-- GET / : Root message
|
|
|
-- GET /vms : List all VMs
|
|
|
-- POST /vms?name={name}&memory={memory}&disk_size={disk_size}&iso={iso} : Create a new VM with specified memory (MiB), disk size (GB), and ISO for installation
|
|
|
-- GET /vms/{vm_id}/start : Start a VM by ID
|
|
|
-- GET /vms/{vm_id}/stop : Stop a VM by ID
|
|
|
-- DELETE /vms/{vm_name} : Delete a VM by name
|
|
|
-- POST /disks?name={name}&size={size} : Create a new disk image with specified size in GB
|
|
|
+Este proyecto es de código abierto. Ajusta según tus necesidades.
|