Salta al contenuto

Blog ·

Vendere hosting web con Virtualmin

Vendere hosting su Virtualmin: quale utente e password usare, perché l’impronta TLS è obbligatoria e quando le quote restano vuote.

Di Provibr

Virtualmin è uno dei pannelli di controllo più vecchi ancora in uso attivo (esiste dal 2004) e ha una base installata che GitHub non mostra. Il 21 agosto 2026 il repository aveva 412 stelle, 129 fork e 46 contributori, un numero piccolo per gli standard di GitHub e che dice quasi nulla su quanti piccoli hoster lo usino davvero.

Ciò che dice è che c’è pochissimo scritto sul venderci sopra. Questa pagina è proprio quello: come Provibr si collega a una macchina Virtualmin, quali decisioni il pannello Le impone e dove sono gli spigoli vivi. Tutto ciò che segue è stato misurato su un’installazione reale di Virtualmin GPL 8.1.2 su Ubuntu 24.04.

Webmin è il pannello, Virtualmin fa l’hosting

Il prodotto lo conosce come Webmin. È il nome sulla pagina di accesso, nella documentazione e in ogni ricerca. Ma Webmin da solo gestisce una macchina Linux: non ha alcuna nozione di account di hosting. Ciò che Provibr pilota davvero è Virtualmin: il modulo che sa di domini, piani e quote.

Questo conta più di quanto sembri. Su una macchina senza il modulo, l’endpoint dell’API remota di Virtualmin semplicemente non c’è: risponde esattamente come un nome di modulo inventato. L’abbiamo misurato al passo zero della ricerca, prima di installare qualsiasi cosa. Quindi non si può ripiegare su Webmin da solo, e Provibr non finge che si possa: la connessione viene rifiutata con un motivo anziché creata a metà.

Cosa serve per collegarsi

Quattro campi, e due di essi sono più severi che per qualsiasi altro pannello di controllo che supportiamo.

CampoValore
HostL’indirizzo del pannello. Dev’essere https. La porta 10000 è compilata per Lei.
Utente Webminroot funziona, ma è meglio un utente che ha solo il modulo Virtualmin.
PasswordLa password di quell’utente.
Impronta digitale TLSObbligatoria.

Perché https e l’impronta digitale sono entrambi obbligatori. Le nostre altre integrazioni con i pannelli di controllo accettano un indirizzo http semplice e Le dicono cosa comporta. Questa no, e la differenza è la natura del segreto.

L’API remota di Webmin parla HTTP Basic. Il segreto qui è una password, non un token: è una proprietà di Webmin, non una nostra scelta. Una login key di DirectAdmin si può limitare a una manciata di comandi; una password Webmin non si può limitare affatto. Inviarla non cifrata, o verso un certificato che nessuno ha verificato, non è un compromesso che facciamo al posto suo. E l’installer di Webmin lascia dietro di sé un certificato autofirmato, quindi il campo dell’impronta digitale non è teorico: è il caso normale.

Consiglio pratico: crei un utente Webmin dedicato e gli dia il modulo Virtualmin. Può fare tutto ciò che Virtualmin può fare, che è molto, ma non tutto ciò che Webmin può fare.

Due cose che morderanno un’integrazione

Sono i due comportamenti misurati che più probabilmente Le costeranno un pomeriggio se costruisce questo da sé.

Ogni errore arriva con HTTP 200. Virtualmin ha due forme di errore (error a livello di wrapper e failure a livello di programma) e le consegna entrambe con un codice di stato 200. Il codice di stato non dice nulla. Tutto ciò che non è esattamente status: "success" è un errore, e l’errore del wrapper va controllato prima di qualsiasi confronto di testo, altrimenti «Remote program xyz does not exist» si legge come un account mancante.

(È un tratto di famiglia delle API dei pannelli di controllo, non una stranezza di Virtualmin. DirectAdmin fa la stessa cosa in modo diverso: HTTP 200 con error=1 nel corpo. Un’integrazione che si fida del codice di stato riesce in silenzio mentre non è successo nulla.)

Un percorso della UI risponde con 200 e una pagina di accesso. Se punta a un percorso di modulo Webmin anziché all’API remota, ottiene HTTP 200 con una pagina di accesso HTML, per una password errata, una corretta e nessuna password allo stesso modo, tutte e tre indistinguibili dal codice di stato. L’API remota stessa lo fa come si deve con un 401. Quella differenza è ciò che rende l’errore utilizzabile: un 200 con HTML può significare soltanto che non si è puntati all’API, e Provibr lo dice per nome anziché mostrarLe un errore di parsing JSON su un pannello che funziona benissimo.

Alcune installazioni hanno il percorso dell’API remota disattivato. Lo si riattiva in Webmin → Configurazione Webmin → Opzioni avanzate.

Impostazioni: non ce ne sono

Un server Virtualmin decide da sé dove risiede un account e quale indirizzo ottiene. Non resta nulla da configurare, quindi la scheda delle impostazioni non porta altro che l’opzione per reinviare le credenziali.

Questo include l’indirizzo IP. Virtualmin mette un account sull’indirizzo condiviso dell’host per impostazione predefinita (abbiamo misurato ip_address tornare come 192.0.2.10 (Shared)), quindi la gestione IP di Provibr resta disattivata per questo provider. Un IPAM che facesse credere di assegnare l’indirizzo starebbe mentendo.

Piani

Un piano Virtualmin è la descrizione che il pannello stesso dà di un account: quota di disco, traffico mensile, quanti domini e caselle di posta, quali funzionalità sono attive. Non è un piano Provibr e non è un sistema operativo: è un nome a cui facciamo riferimento, e il suo contenuto può cambiare sul suo server senza che ce ne accorgiamo.

La pagina dell’integrazione legge l’elenco dei piani con il loro contenuto, così può vedere ciò che sta scegliendo anziché digitare un nome a memoria. Un piano web Provibr fissa poi un piano Virtualmin su un’integrazione e gli dà un nome suo. Ordinare tramite un piano è meglio che sceglierne uno sciolto, e il selettore sciolto resta disponibile per i casi che un piano non copre.

⚠️ Una trappola misurata che vale la pena conoscere: modify-domain con un nome di piano che non esiste risponde status: "success" e lascia il piano esattamente dov’era. Non c’è una forma di errore da classificare: il rifiuto è silenzio. Provibr confronta ciò che ha chiesto con ciò che rilegge dopo, così un cambio di piano che non è avvenuto viene segnalato come uno che non è avvenuto.

Come appare un account in Provibr

Un account di hosting è una normale riga di server di tipo webserver. Crearne uno richiede un dominio, un indirizzo email, un piano e una password.

  • L’identificatore è il numero interno che Virtualmin assegna al dominio, non il nome. Virtualmin può rinominare un dominio; una chiave basata sul nome si staccherebbe dalla sua riga la prima volta che qualcuno lo fa.
  • L’utente unix è derivato dal dominio, quindi my-client.nl diventa my-client. Qui i trattini sono la forma normale, non l’eccezione, e il limite è quello di Linux stesso, 32 caratteri. È diverso da DirectAdmin e cPanel, che hanno regole di denominazione proprie e più severe.
  • Il confine dell’account è l’utente unix, non il dominio. Altrimenti sotto-server e alias finirebbero ciascuno nel conteggio della licenza come account di hosting separati.
  • La password non viene registrata da nessuna parte. Solo il fatto che ne ha fornita una; il valore viaggia separatamente e non viene mai scritto in una riga di controllo.
  • In seguito può sospendere, riattivare, cambiare il piano ed eliminare. Non c’è console: un account di hosting non ne ha una.

Sospeso significa che un campo esiste

È il dettaglio più insidioso dell’intera integrazione, ed è quello che un parser fatto in casa sbaglia.

Su un account sospeso, list-domains acquisisce un campo chiamato disabled. Su un account attivo quel campo è semplicemente assente. Non esiste disabled: "No".

Un parser che cerca un valore non ne trova mai uno, e legge ogni account come attivo, compresi quelli sospesi. In un contesto di fatturazione non è un bug cosmetico: significa che un account che ha sospeso per mancato pagamento si dichiara attivo, e il suo conteggio della capacità è sbagliato nella direzione che Le costa denaro.

Quota e consumo: a volte non c’è nulla da mostrare

La quota di disco e il traffico viaggiano insieme all’interrogazione regolare, così un account ottiene un grafico di consumo senza che venga attivato nulla in più, a patto che il server possa misurarli.

Virtualmin segnala quota e consumo solo quando le quote del filesystem sono attive, e un’installazione nuova le ha disattivate. L’abbiamo misurato: quotaon -p / ha riportato off su un’installazione standard, perché l’installer scrive il vecchio formato di quota in /etc/fstab mentre un kernel ext4 moderno vuole quote journaled. Finché qualcuno non le attiva, nell’output dell’API non compare alcun campo di quota.

Provibr non mostra nulla anziché uno zero. Nessuna misurazione e nessun consumo non sono la stessa cosa, e un grafico inchiodato a zero sembra il secondo caso quando invece è il primo.

Una nota correlata se mai leggesse l’output grezzo da sé: preferisca i campi leggibili dalla macchina (created_unix_time, databases_byte_size) ai loro gemelli per l’uomo (created_on, databases_size). Quelli per l’uomo portano unità e un formato di data che dipendono dalla locale del pannello, e analizzarli è esattamente il tipo di errore silenzioso che si presenta per primo da un cliente con un’impostazione diversa.

Due omissioni volute

Il test di connessione non mostra una riga di versione. Virtualmin non ha alcun programma API che restituisca la propria versione: virtualmin info conosce ventuno chiavi di ricerca e nessuna di esse è una versione, e l’header Server: MiniServ non porta alcun numero. Una riga vuota affermerebbe che abbiamo provato e non siamo riusciti a leggerla; ometterla dice la verità. Il test mostra invece il suo elenco di piani, che è ciò che si vuole davvero confermare.

E nulla di segreto proveniente dal pannello viene mai memorizzato. list-domains --multiline porta hashed_password, password_for_mysql e password_storage letteralmente nel suo output. Provibr filtra con una lista consentita prima di leggere, non oscurando dopo: una lista di divieti manca il prossimo segreto che riceve un nome diverso. L’abbiamo verificato con un contro-test nella stessa esecuzione: la risposta grezza del pannello porta dimostrabilmente quei tre campi, e l’elenco di importazione non ne contiene nessuno.

Adottare account che esistono già

La scheda di importazione elenca gli account sul pannello e Le permette di portare in Provibr quelli che vuole. Gli account già noti sono mostrati ma non possono essere selezionati di nuovo, così vede il quadro completo anziché uno filtrato.

Gli account importati contano ai fini della sua capacità esattamente come gli account che ha ordinato. Ne importi più di quanti ne ha spazio e si apre un superamento, con il consueto periodo di tolleranza.

Dove questo lascia un piccolo host

Virtualmin è un buon pannello con quasi nessuno strumento commerciale attorno. Il consiglio consueto (passare a qualcosa che i sistemi di fatturazione già parlano) Le chiede di migrare clienti attivi da una macchina che funziona per risolvere un problema di scartoffie.

Provibr si collega a pannelli di controllo, hypervisor e pannelli di gioco fianco a fianco. Tenga la macchina Virtualmin che ha, ci metta sopra l’ordinazione e il conteggio della capacità, e aggiunga un VPS o un pannello di gioco accanto più avanti senza cambiare nulla di come funziona la parte hosting.

Inizi con un host e un agente

Crei un account, installi l’agente con un solo comando e colleghi il suo primo host Proxmox. Il periodo di prova dura 14 giorni e non chiede alcun dato di pagamento.