Zum Inhalt springen

Blog ·

Webhosting verkaufen mit Virtualmin

Hosting auf Virtualmin verkaufen: welcher Webmin-Benutzer und welches Passwort, warum der TLS-Fingerabdruck Pflicht ist und wann Kontingentfelder leer bleiben.

Von Provibr

Virtualmin ist eines der ältesten Controlpanels, die noch aktiv genutzt werden (es gibt es seit 2004), und es hat eine installierte Basis, die GitHub nicht zeigt. Am 21. August 2026 hatte das Repository 412 Sterne, 129 Forks und 46 Mitwirkende. Nach GitHub-Maßstäben ist das klein und sagt fast nichts darüber aus, wie viele kleine Hoster es tatsächlich betreiben.

Was es sehr wohl sagt: Über das Verkaufen auf Virtualmin ist ausgesprochen wenig geschrieben worden. Diese Seite ist genau das: wie Provibr sich mit einer Virtualmin-Maschine verbindet, welche Entscheidungen das Panel Ihnen abnimmt und wo die scharfen Kanten liegen. Alles Folgende wurde an einer echten Installation von Virtualmin GPL 8.1.2 auf Ubuntu 24.04 gemessen.

Webmin ist das Panel, Virtualmin macht das Hosting

Sie kennen das Produkt als Webmin. So heißt es auf der Anmeldeseite, in der Dokumentation und in jeder Suchanfrage. Aber reines Webmin verwaltet eine Linux-Maschine: Es kennt den Begriff Hosting-Konto überhaupt nicht. Was Provibr tatsächlich steuert, ist Virtualmin: das Modul, das Domains, Pläne und Kontingente kennt.

Das ist wichtiger, als es klingt. Auf einer Maschine ohne dieses Modul ist der Remote-API-Endpunkt von Virtualmin schlicht nicht vorhanden: Er antwortet genau so wie ein von Ihnen erfundener Modulname. Das wurde in Schritt null der Untersuchung gemessen, bevor überhaupt etwas installiert war. Es gibt also keinen Rückfall auf reines Webmin, und Provibr tut auch nicht so: Die Verbindung wird mit einer Begründung abgelehnt, statt halb angelegt zu werden.

Was Sie zum Verbinden brauchen

Vier Felder, von denen zwei strenger sind als bei jedem anderen Controlpanel, das wir unterstützen.

FeldWert
HostDie Adresse des Panels. Muss https sein. Port 10000 wird für Sie eingetragen.
Webmin-Benutzerroot funktioniert, besser ist ein Benutzer, der nur das Virtualmin-Modul hat.
PasswortDas Passwort dieses Benutzers.
TLS-FingerabdruckPflicht.

Warum https und der Fingerabdruck beide vorgeschrieben sind. Unsere übrigen Controlpanel-Integrationen akzeptieren eine einfache http-Adresse und sagen Ihnen, was das kostet. Diese nicht, und der Unterschied liegt in der Art des Geheimnisses.

Die Remote-API von Webmin spricht HTTP Basic. Das Geheimnis ist hier ein Passwort und kein Token, eine Eigenschaft von Webmin, keine Entscheidung von uns. Ein DirectAdmin-Login-Key lässt sich auf eine Handvoll Befehle beschränken; ein Webmin-Passwort lässt sich überhaupt nicht beschränken. Es unverschlüsselt zu versenden oder an ein Zertifikat, das niemand geprüft hat, ist keine Abwägung, die wir für Sie treffen. Und der Webmin-Installer hinterlässt ein selbstsigniertes Zertifikat, das Fingerabdruckfeld ist also nicht theoretisch, sondern der Normalfall.

Praktischer Rat: Legen Sie einen eigenen Webmin-Benutzer an und geben Sie ihm das Virtualmin-Modul. Er kann alles, was Virtualmin kann (und das ist viel), aber nicht alles, was Webmin kann.

Zwei Dinge, die eine Integration beißen werden

Das sind die beiden gemessenen Verhaltensweisen, die Sie einen Nachmittag kosten, wenn Sie das selbst bauen.

Jeder Fehler kommt mit HTTP 200 an. Virtualmin kennt zwei Fehlerformen (error auf Wrapper-Ebene und failure auf Programmebene) und liefert beide mit Statuscode 200. Der Statuscode sagt nichts. Alles, was nicht exakt status: "success" ist, ist ein Fehler, und der Wrapper-Fehler muss vor jedem Textvergleich geprüft werden, sonst liest sich „Remote program xyz does not exist“ wie ein fehlendes Konto.

(Das ist ein Familienzug von Controlpanel-APIs und keine Eigenart von Virtualmin. DirectAdmin macht dasselbe auf eigene Weise: HTTP 200 mit error=1 im Body. Eine Integration, die dem Statuscode vertraut, ist stillschweigend erfolgreich, während nichts passiert ist.)

Ein UI-Pfad antwortet mit 200 und einer Anmeldeseite. Zielen Sie auf einen Webmin-Modulpfad statt auf die Remote-API, bekommen Sie HTTP 200 mit einer HTML-Anmeldeseite, bei falschem Passwort, richtigem Passwort und ganz ohne Passwort gleichermaßen, auf Statuscode-Ebene nicht unterscheidbar. Die Remote-API selbst macht es ordentlich mit einer 401. Genau dieser Unterschied macht den Fehler brauchbar: Eine 200 mit HTML kann nur bedeuten, dass Sie nicht auf die API zielen, und Provibr sagt das beim Namen, statt Ihnen einen JSON-Parse-Fehler auf einem einwandfrei laufenden Panel zu zeigen.

Bei manchen Installationen ist die Remote-API-Route abgeschaltet. Sie aktivieren sie wieder unter Webmin → Webmin Configuration → Advanced Options.

Einstellungen: es gibt keine

Ein Virtualmin-Server entscheidet selbst, wo ein Konto liegt und welche Adresse es bekommt. Für Sie bleibt nichts zu wählen, auf dem Reiter „Einstellungen“ steht deshalb nichts außer dem erneuten Senden der Zugangsdaten.

Das gilt auch für die IP-Adresse. Virtualmin legt ein Konto standardmäßig auf die gemeinsame Adresse des Hosts (wir haben ip_address als 192.0.2.10 (Shared) gemessen), deshalb bleibt die IP-Verwaltung von Provibr für diesen Anbieter aus. Eine IP-Verwaltung, die suggeriert, sie vergebe die Adresse, würde lügen.

Pläne

Ein Virtualmin-Plan ist die Beschreibung, die das Panel selbst von einem Konto hat: Festplattenkontingent, monatlicher Datenverkehr, wie viele Domains und Postfächer, welche Funktionen aktiv sind. Er ist kein Provibr-Plan und kein Betriebssystem: Er ist ein Name, auf den wir uns beziehen, und sein Inhalt kann sich auf Ihrem Server ändern, ohne dass wir es merken.

Die Integrationsseite liest die Liste der Pläne samt Inhalt, damit Sie sehen, was Sie wählen, statt einen Namen aus dem Gedächtnis zu tippen. Ein Provibr-Webplan heftet danach genau einen Virtualmin-Plan an genau eine Integration und gibt ihm einen eigenen Namen. Über einen Plan zu bestellen schlägt die lose Auswahl, und die lose Auswahl bleibt für die Fälle verfügbar, die ein Plan nicht abdeckt.

⚠️ Eine gemessene Falle ist es wert, sie zu kennen: modify-domain mit einem Plannamen, den es nicht gibt, antwortet mit status: "success" und lässt den Plan genau dort, wo er war. Es gibt also keine Fehlerform, die sich einordnen ließe: Die Ablehnung ist Schweigen. Provibr vergleicht das Gewünschte mit dem, was danach ausgelesen wird, eine nicht erfolgte Planänderung wird also als nicht erfolgt gemeldet.

Wie ein Konto in Provibr aussieht

Ein Hosting-Konto ist eine gewöhnliche Serverzeile vom Typ webserver. Zum Anlegen braucht es eine Domain, eine E-Mail-Adresse, einen Plan und ein Passwort.

  • Die Kennung ist die interne Nummer, die Virtualmin der Domain gibt, nicht der Name. Virtualmin kann eine Domain umbenennen; ein namensbasierter Schlüssel löst sich beim ersten Mal von seiner Zeile.
  • Der Unix-Benutzer wird aus der Domain abgeleitet, mein-kunde.de ergibt also mein-kunde. Bindestriche sind hier die Normalform und nicht die Ausnahme, und die Grenze ist die von Linux selbst: 32 Zeichen. Das unterscheidet sich von DirectAdmin und cPanel mit ihren strengeren eigenen Namensregeln.
  • Die Kontogrenze ist der Unix-Benutzer, nicht die Domain. Sub-Server und Aliasse würden sonst je einzeln als eigenes Hosting-Konto in der Lizenzzählung landen.
  • Das Passwort wird nirgends festgehalten. Nur die Tatsache, dass Sie eines angegeben haben; der Wert reist getrennt und landet nie in einer Audit-Zeile.
  • Danach können Sie stilllegen, wieder aktivieren, den Plan wechseln und löschen. Eine Konsole gibt es nicht: Ein Hosting-Konto hat keine.

Stillgelegt heißt, dass ein Feld existiert

Das ist das schärfste Detail der gesamten Integration, und genau das macht ein selbstgebauter Parser falsch.

Bei einem stillgelegten Konto kommt in list-domains ein Feld disabled hinzu. Bei einem aktiven Konto fehlt dieses Feld schlicht. Ein disabled: "No" gibt es nicht.

Ein Parser, der nach einem Wert sucht, findet nie einen und liest jedes Konto als aktiv, auch die stillgelegten. Im Abrechnungskontext ist das kein kosmetischer Fehler: Ein Konto, das Sie wegen Nichtzahlung stillgelegt haben, meldet sich als aktiv, und Ihre Kapazitätszählung steht in der Richtung falsch, die Sie Geld kostet.

Kontingente und Auslastung: manchmal gibt es nichts zu zeigen

Festplattenkontingent und Datenverkehr fahren bei der regulären Abfrage mit, ein Konto bekommt sein Auslastungsdiagramm also, ohne dass etwas zusätzlich eingeschaltet werden muss, sofern der Server sie messen kann.

Virtualmin meldet Kontingente und Auslastung nur, wenn Dateisystem-Kontingente eingeschaltet sind, und bei einer frischen Installation sind sie aus. Wir haben es gemessen: quotaon -p / meldete auf einer Standardinstallation off, weil der Installer das alte Kontingentformat in /etc/fstab schreibt, während ein moderner ext4-Kernel journaled quota erwartet. Solange niemand sie einschaltet, erscheint in der API-Ausgabe kein einziges Kontingentfeld.

Provibr zeigt dann nichts statt einer Null. Keine Messung und keine Auslastung sind nicht dasselbe, und ein Diagramm, das auf null steht, sieht nach dem Zweiten aus, obwohl es das Erste ist.

Eine verwandte Anmerkung, falls Sie die Rohausgabe je selbst lesen: Bevorzugen Sie die maschinenlesbaren Felder (created_unix_time, databases_byte_size) gegenüber ihren menschlichen Zwillingen (created_on, databases_size). Die menschlichen tragen Einheiten und ein Datumsformat, die von der Spracheinstellung des Panels abhängen, und sie zu parsen ist genau die Art stillen Fehlers, der zuerst bei einem Kunden mit einer anderen Einstellung auffällt.

Zwei bewusste Auslassungen

Der Verbindungstest zeigt keine Versionszeile. Virtualmin hat kein einziges API-Programm, das seine eigene Version zurückgibt: virtualmin info kennt einundzwanzig Suchschlüssel und keine Version, und der Header Server: MiniServ trägt keine Nummer. Eine leere Zeile würde behaupten, wir hätten es versucht und nicht lesen können; sie wegzulassen sagt die Wahrheit. Der Test zeigt stattdessen Ihre Planliste, und das ist es, was Sie tatsächlich bestätigt sehen wollen.

Und es wird nichts Geheimes aus dem Panel gespeichert. list-domains --multiline trägt hashed_password, password_for_mysql und password_storage wörtlich in seiner Ausgabe. Provibr filtert mit einer Positivliste vor dem Lesen, nicht durch nachträgliches Schwärzen: Eine Verbotsliste verfehlt zwangsläufig das nächste Geheimnis, das anders heißt. Wir haben es mit einer Gegenprobe im selben Lauf geprüft: Die Rohantwort des Panels trägt diese drei Felder nachweislich, und die Importliste enthält keines davon.

Bestehende Konten übernehmen

Der Import-Reiter listet die Konten auf dem Panel und lässt Sie die gewünschten nach Provibr holen. Bereits bekannte Konten werden angezeigt, sind aber nicht erneut auswählbar, damit Sie das ganze Bild sehen und nicht ein gefiltertes.

Importierte Konten zählen genau wie bestellte auf Ihre Kapazität. Importieren Sie mehr, als Sie Platz haben, öffnet sich eine Überschreitung, mit der üblichen Nachfrist.

Was das für einen kleinen Hoster bedeutet

Virtualmin gibt Ihnen ein solides Hosting-Panel und überhaupt keine kommerzielle Schicht. Der übliche Rat (wechseln Sie auf etwas, das die Abrechnungssysteme bereits sprechen) verlangt, lebende Kunden von einer funktionierenden Maschine zu holen, um ein Verwaltungsproblem zu lösen.

Provibr verbindet sich mit Controlpanels, Hypervisoren und Gamepanels nebeneinander. Behalten Sie die Virtualmin-Maschine, die Sie haben, setzen Sie Bestellung und Kapazitätszählung darauf, und stellen Sie nächstes Jahr einen VPS oder ein Gamepanel daneben, ohne dass sich auf der Hosting-Seite etwas ändert.

Fangen Sie mit einem Host und einem Agenten an

Konto erstellen, den Agenten mit einem einzigen Befehl installieren und Ihren ersten Proxmox-Host verbinden. Die Testphase läuft 14 Tage und fragt nicht nach Zahlungsdaten.