Blog ·
Vender alojamiento web con Virtualmin
Vender alojamiento en Virtualmin: qué usuario Webmin usar, por qué la huella TLS es obligatoria, cómo encajan los planes y cuándo las cuotas quedan vacías.
Por Provibr
Virtualmin es uno de los paneles de control más antiguos que siguen en uso real (existe desde 2004) y tiene un parque instalado que GitHub no muestra. El 21 de agosto de 2026 el repositorio tenía 412 estrellas, 129 bifurcaciones y 46 colaboradores, lo cual es poco para los estándares de GitHub y casi no dice nada de cuántos pequeños proveedores de alojamiento lo hacen funcionar de verdad.
Lo que sí dice es que se ha escrito muy poco sobre vender con él. Esta página es justo eso: cómo Provibr se conecta a una máquina Virtualmin, qué decisiones impone el panel, y dónde están las aristas cortantes. Todo lo que sigue se midió sobre una instalación real de Virtualmin GPL 8.1.2 en Ubuntu 24.04.
Webmin es el panel, Virtualmin hace el alojamiento
El producto se conoce como Webmin. Es el nombre en la página de inicio de sesión, en la documentación y en todas las búsquedas. Pero Webmin a secas administra una máquina Linux: no tiene ninguna noción de cuenta de alojamiento. Lo que Provibr pilota en realidad es Virtualmin: el módulo que conoce los dominios, los planes y las cuotas.
Esto importa más de lo que parece. En una máquina sin el módulo, el punto de acceso de la API remota de Virtualmin simplemente no existe: responde exactamente como un nombre de módulo inventado. Lo medimos en el paso cero del estudio, antes de instalar nada. Así que no hay repliegue sobre Webmin a secas, y Provibr no finge que lo haya: la conexión se rechaza con un motivo en lugar de crearse a medias.
Lo que hace falta para conectarse
Cuatro campos, y dos de ellos más estrictos que para cualquier otro panel de control compatible.
| Campo | Valor |
|---|---|
| Host | La dirección del panel. Debe ser https. El puerto 10000 viene rellenado. |
| Usuario Webmin | root funciona, pero es mejor un usuario que solo tenga el módulo Virtualmin. |
| Contraseña | La contraseña de ese usuario. |
| Huella TLS | Obligatoria. |
Por qué https y la huella son ambos obligatorios. Nuestras otras integraciones de paneles de control aceptan una dirección http simple y advierten de lo que eso cuesta. Esta no, y la diferencia está en la naturaleza del secreto.
La API remota de Webmin habla HTTP Basic. El secreto aquí es una contraseña, no un token: es una propiedad de Webmin, no una elección nuestra. Una clave de acceso de DirectAdmin se puede limitar a un puñado de comandos; una contraseña de Webmin no se puede limitar en nada. Enviarla sin cifrar, o hacia un certificado que nadie verificó, no es un compromiso que asumamos en su lugar. Y el instalador de Webmin deja tras de sí un certificado autofirmado, así que el campo de huella no es teórico: es el caso normal.
Consejo práctico: crear un usuario Webmin dedicado y darle el módulo Virtualmin. Podrá hacer todo lo que Virtualmin sabe hacer, que ya es mucho, pero no todo lo que Webmin sabe hacer.
Dos cosas que morderán una integración
Son los dos comportamientos medidos con más probabilidad de costar una tarde a quien lo construya por su cuenta.
Todo error llega en HTTP 200. Virtualmin tiene dos formas de fallo (error en el nivel de la envoltura y failure en el nivel del programa) y entrega ambas con un código 200. El código de estado no dice nada. Todo lo que no sea exactamente status: "success" es un fallo, y el error de envoltura debe comprobarse antes de cualquier comparación de texto, pues de lo contrario «Remote program xyz does not exist» se lee como una cuenta ausente.
(Es un rasgo de familia de las API de paneles de control, no una rareza de Virtualmin. DirectAdmin hace lo mismo de otra manera: HTTP 200 con error=1 en el cuerpo. Una integración que se fía del código de estado tiene éxito en silencio mientras no ocurrió nada.)
Una ruta de interfaz responde 200 con una página de inicio de sesión. Si se apunta a una ruta de módulo Webmin en lugar de a la API remota, se obtiene un HTTP 200 con una página HTML de inicio de sesión: para una contraseña incorrecta, una correcta y ninguna por igual, las tres indistinguibles por el código de estado. La API remota, en cambio, lo hace bien con una 401. Esa diferencia es lo que hace utilizable el error: un 200 con HTML solo puede significar que no se apunta a la API, y Provibr lo dice por su nombre en lugar de mostrar un error de análisis de JSON sobre un panel que funciona perfectamente.
Algunas instalaciones tienen desactivada la ruta de la API remota. Se reactiva en Webmin → Webmin Configuration → Advanced Options.
Ajustes: no hay ninguno
Un servidor Virtualmin decide por sí mismo dónde vive una cuenta y qué dirección recibe. No queda nada que configurar, así que la pestaña de ajustes no lleva más que la opción de reenviar las credenciales.
Eso incluye la dirección IP. Virtualmin coloca una cuenta en la dirección compartida del host de forma predeterminada. Medimos ip_address devolviendo 192.0.2.10 (Shared), así que la gestión de direcciones de Provibr permanece desactivada para este proveedor. Un IPAM que diera a entender que asigna la dirección estaría mintiendo.
Los planes
Un plan Virtualmin es la descripción que el propio panel hace de una cuenta: cuota de disco, tráfico mensual, cuántos dominios y buzones, qué funciones están activas. No es un plan Provibr ni un sistema operativo: es un nombre al que nos referimos, y su contenido puede cambiar en el servidor sin que lo notemos.
La página de integración lee la lista de planes con su contenido, de modo que se ve lo que se elige en lugar de teclear un nombre de memoria. Un plan web Provibr fija entonces un plan Virtualmin en una integración y le da un nombre propio. Pedir a través de un plan es mejor que elegir uno suelto, y el selector suelto sigue disponible para los casos que un plan no cubre.
⚠️ Una trampa medida que conviene conocer: modify-domain con un nombre de plan que no existe responde status: "success" y deja el plan exactamente donde estaba. No hay forma de error que clasificar: el rechazo es el silencio. Provibr compara lo que pidió con lo que relee después, así que un cambio de plan que no ocurrió se informa como uno que no ocurrió.
Cómo se ve una cuenta en Provibr
Una cuenta de alojamiento es una fila de servidor ordinaria de tipo webserver. Crear una necesita un dominio, una dirección de correo, un plan y una contraseña.
- El identificador es el número interno que Virtualmin asigna al dominio, no el nombre. Virtualmin puede renombrar un dominio; una clave basada en el nombre se soltaría de su fila la primera vez que alguien lo haga.
- El usuario unix se deriva del dominio, así que
my-client.nlse convierte enmy-client: los guiones son aquí la forma normal y no la excepción, y el límite es el propio de Linux, 32 caracteres. Eso a diferencia de DirectAdmin y cPanel, que imponen sus propias reglas de nombres más estrictas. - La frontera de la cuenta es el usuario unix, no el dominio. Los subservidores y los alias caerían si no cada uno en el recuento de licencia como cuentas de alojamiento distintas.
- La contraseña no se registra en ninguna parte. Solo se registra el hecho de haber proporcionado una; el valor viaja por separado y nunca se escribe en una fila de auditoría.
- Después se puede suspender, reactivar, cambiar el plan y eliminar. No hay consola: una cuenta de alojamiento no tiene.
Suspendido significa que existe un campo
Es el detalle más fino de toda la integración, y es precisamente el que un analizador casero interpreta mal.
En una cuenta suspendida, list-domains gana un campo llamado disabled. En una cuenta activa ese campo simplemente no está. No existe un disabled: "No".
Un analizador que busca un valor no lo encuentra nunca, y lee todas las cuentas como activas, incluidas las suspendidas. En un contexto de facturación no es un defecto cosmético: significa que una cuenta suspendida por impago se declara activa, y el recuento de capacidad es erróneo en el sentido que cuesta dinero.
Cuotas y uso: a veces no hay nada que mostrar
La cuota de disco y el tráfico viajan con el sondeo habitual, así que una cuenta obtiene su gráfica de uso sin activar nada extra, siempre que el servidor pueda medirlos.
Virtualmin solo reporta cuota y uso cuando las cuotas del sistema de ficheros están activadas, y una instalación nueva las tiene desactivadas. Lo medimos: quotaon -p / respondió off en una instalación estándar, porque el instalador escribe el viejo formato de cuota en /etc/fstab mientras que un núcleo ext4 moderno espera cuotas con registro por diario. Hasta que alguien las active, no aparece ningún campo de cuota en la salida de la API.
Provibr muestra nada en lugar de un cero. Ausencia de medición y ausencia de uso no son lo mismo, y una gráfica clavada en cero parece lo segundo cuando es lo primero.
Una nota relacionada por si alguna vez se lee la salida en bruto: mejor los campos legibles por máquina (created_unix_time, databases_byte_size) que sus gemelos humanos (created_on, databases_size). Los humanos llevan unidades y un formato de fecha que dependen del idioma del panel, y analizarlos es justo la clase de fallo silencioso que se manifiesta primero en un cliente con un ajuste distinto.
Dos omisiones deliberadas
La prueba de conexión no muestra una línea de versión. Virtualmin no tiene ningún programa de API que devuelva su propia versión: virtualmin info conoce veintiuna claves de consulta y ninguna es una versión, y la cabecera Server: MiniServ no lleva número. Una línea vacía pretendería que se intentó leerla sin lograrlo; omitirla dice la verdad. La prueba muestra en su lugar la lista de planes, que es lo que de verdad se quiere confirmar.
Y nunca se almacena nada secreto del panel. list-domains --multiline lleva hashed_password, password_for_mysql y password_storage literalmente en su salida. Provibr filtra con una lista de permitidos antes de leer, no censurando a posteriori: una lista de denegados se pierde el siguiente secreto que reciba otro nombre. Lo verificamos con una contraprueba en la misma ejecución: la respuesta en bruto del panel lleva esos tres campos de forma demostrable, y la lista de importación no contiene ninguno.
Adoptar cuentas que ya existen
La pestaña de importación enumera las cuentas del panel y permite llevar a Provibr las que se quieran. Las cuentas ya conocidas se muestran pero no se pueden seleccionar de nuevo, de modo que se ve el cuadro completo y no uno filtrado.
Las cuentas importadas cuentan para la capacidad exactamente igual que las cuentas pedidas. Al importar más de las que caben, se abre un excedente, con el período de gracia habitual.
Qué supone esto para un pequeño proveedor
Virtualmin es un buen panel con casi ninguna herramienta comercial a su alrededor. El consejo habitual (pasarse a algo que los sistemas de facturación ya hablan) pide migrar clientes en producción fuera de una máquina que funciona, para resolver un problema de papeleo.
Provibr se conecta a paneles de control, hipervisores y paneles de juego en paralelo. Basta con conservar la máquina Virtualmin que se tiene, poner encima los pedidos y el recuento de capacidad, y añadir al lado un VPS o un panel de juegos más adelante sin cambiar nada de cómo funciona la parte de alojamiento.