Блог ·
Продаж вебхостингу на Virtualmin
Хостинг на Virtualmin: який користувач Webmin і пароль, чому відбиток TLS обовʼязковий, як лягають плани і коли поля квот лишаються порожніми.
Автор: Provibr
Virtualmin є однією з найстаріших панелей керування, що досі в активному використанні: вона існує з 2004 року, і в неї є встановлена база, якої GitHub вам не показує. 21 серпня 2026 репозиторій мав 412 зірок, 129 форків і 46 контрибуторів, що за мірками GitHub мало й майже нічого не каже про те, скільки малих хостерів насправді її запускає.
Що воно таки каже, так це що про продаж на ній написано дуже мало. Ця сторінка саме про це: як Provibr підключається до машини Virtualmin, які рішення панель навʼязує вам, і де гострі краї. Усе нижче виміряно на реальній інсталяції Virtualmin GPL 8.1.2 на Ubuntu 24.04.
Webmin є панеллю, Virtualmin робить хостинг
Ви знаєте продукт як Webmin. Це назва на сторінці входу, у документації та в кожному пошуку. Але звичайний Webmin керує Linux-машиною: у нього взагалі немає поняття хостингового облікового запису. Provibr насправді керує саме Virtualmin: модуль, який знає про домени, плани й квоти.
Це важить більше, ніж звучить. На машині без цього модуля кінцева точка віддаленого API Virtualmin просто відсутня: вона відповідає рівно так само, як назва модуля, яку ви вигадали. Ми виміряли це на нульовому кроці дослідження, ще до встановлення будь-чого. Тож немає відкату на звичайний Webmin, і Provibr не вдає, що є: зʼєднання відхиляється з причиною, а не наполовину створюється.
Що потрібно для підключення
Чотири поля, і два з них суворіші, ніж для будь-якої іншої панелі керування, яку ми підтримуємо.
| Поле | Значення |
|---|---|
| Хост | Адреса панелі. Має бути https. Порт 10000 заповнюється за вас. |
| Користувач Webmin | root працює, але кращий користувач, який має лише модуль Virtualmin. |
| Пароль | Пароль цього користувача. |
| Відбиток TLS | Обовʼязковий. |
Чому https і відбиток обидва обовʼязкові. Наші інші інтеграції панелей керування приймають звичайну http-адресу й кажуть вам, чого це коштує. Ця цього не робить, і різниця в природі секрету.
Віддалений API Webmin говорить HTTP Basic. Секретом тут є пароль, а не токен, і це властивість Webmin, а не наш вибір. Login-ключ DirectAdmin можна обмежити жменькою команд; пароль Webmin обмежити не можна взагалі. Надсилати його незашифрованим або до сертифіката, який ніхто не перевірив, не є компромісом, який ми робимо за вас. А інсталятор Webmin лишає по собі самопідписаний сертифікат, тож поле відбитка не теоретичне: це звичайний випадок.
Практична порада: створіть окремого користувача Webmin і дайте йому модуль Virtualmin. Він може робити все, що вміє Virtualmin, а це багато, але не все, що вміє Webmin.
Дві речі, які вкусять інтеграцію
Це дві виміряні поведінки, які найімовірніше коштуватимуть вам вечора, якщо ви будуєте це самі.
Кожна помилка приходить з HTTP 200. У Virtualmin дві форми збою (error на рівні обгортки і failure на рівні програми), і він видає обидві з кодом статусу 200. Код статусу вам нічого не каже. Усе, що не є рівно status: "success", є збоєм, і помилку обгортки треба перевірити перед будь-яким порівнянням тексту, інакше «Remote program xyz does not exist» читається як відсутній обліковий запис.
(Це родова риса API панелей керування, а не примха Virtualmin. DirectAdmin робить те саме інакше: HTTP 200 з error=1 у тілі. Інтеграція, яка вірить коду статусу, успішно завершується, поки нічого не сталося.)
Один UI-шлях відповідає 200 і сторінкою входу. Якщо ви вказуєте на шлях модуля Webmin замість віддаленого API, ви отримуєте HTTP 200 зі сторінкою входу HTML: для неправильного пароля, правильного пароля й відсутнього пароля однаково, усі три не відрізнити за кодом статусу. Сам віддалений API робить це як слід, з 401. Саме ця різниця робить помилку придатною до використання: 200 з HTML може означати лише, що ви не націлені на API, і Provibr так і каже, поіменно, замість того щоб показати вам помилку розбору JSON на панелі, яка працює нормально.
Деякі інсталяції мають маршрут віддаленого API вимкненим. Ви вмикаєте його назад під Webmin → Webmin Configuration → Advanced Options.
Налаштування: їх немає
Сервер Virtualmin сам вирішує, де живе обліковий запис і яку адресу він отримує. Вам більше нічого не лишається налаштовувати, тож вкладка налаштувань не несе нічого, крім опції повторно надіслати облікові дані.
Це стосується й IP-адреси. Virtualmin за замовчуванням ставить обліковий запис на спільну адресу хоста (ми виміряли ip_address, що повертається як 192.0.2.10 (Shared)), тож керування IP у Provibr для цього провайдера лишається вимкненим. IPAM, який натякав би, що призначає адресу, брехав би.
Плани
План Virtualmin є власним описом облікового запису панеллю: квота диска, місячний трафік, скільки доменів і поштових скриньок, які функції ввімкнено. Це не план Provibr і не операційна система, а назва, на яку ми посилаємося, і її вміст може змінитися на вашому сервері без того, щоб ми це помітили.
Сторінка інтеграції читає список планів з їхнім вмістом, тож ви можете бачити, що обираєте, а не набирати назву з памʼяті. Вебплан Provibr тоді закріплює один план Virtualmin на одній інтеграції й дає йому власну назву. Замовлення через план краще за вибір випадкового, і випадковий вибір лишається доступним для випадків, які план не покриває.
⚠️ Одна виміряна пастка, яку варто знати: modify-domain з назвою плану, якої не існує, відповідає status: "success" і лишає план рівно там, де він був. Немає форми помилки, яку можна класифікувати: відмова це тиша. Provibr порівнює те, що попросив, з тим, що зчитує потім, тож зміна плану, якої не сталося, повідомляється як така, що не сталася.
Який вигляд має обліковий запис у Provibr
Хостинговий обліковий запис є звичайним рядком сервера типу webserver. Для створення потрібні домен, email-адреса, план і пароль.
- Ідентифікатором є внутрішній номер, який Virtualmin дає домену, а не назва. Virtualmin може перейменувати домен; ключ на основі назви відірвався б від свого рядка першого ж разу, коли хтось це зробить.
- Unix-користувач виводиться з домену, тож
my-client.nlстаєmy-client: дефіси тут звичайна форма, а не виняток, а межею є власні 32 символи Linux. Це на відміну від DirectAdmin і cPanel, які мають власні суворіші правила іменування. - Межею облікового запису є unix-користувач, а не домен. Субсервери та псевдоніми інакше кожен потрапляли б у ліцензійний підрахунок як окремі хостингові облікові записи.
- Пароль ніде не записується. Записується лише той факт, що ви його надали; саме значення реалізується окремо й ніколи не пишеться в аудиторський рядок.
- Потім ви можете призупинити, відновити, змінити план і видалити. Консолі немає: у хостингового облікового запису її немає.
«Призупинено» означає, що поле існує
Це найгостріша деталь усієї інтеграції, і саме та, яку саморобний парсер робить неправильно.
На призупиненому обліковому записі list-domains вирощує поле під назвою disabled. На активному обліковому записі це поле просто відсутнє. Немає disabled: "No".
Парсер, який шукає значення, ніколи його не знаходить і читає кожен обліковий запис як активний, зокрема призупинені. У контексті білінгу це не косметична вада: це означає, що обліковий запис, який ви призупинили за несплату, повідомляє про себе як про живий, а ваш підрахунок потужності хибний у бік, що коштує вам грошей.
Квота й використання: іноді нема чого показати
Квота диска й трафік їдуть разом зі звичайним опитуванням, тож обліковий запис отримує графік використання без того, щоб щось додаткове вмикали, за умови, що сервер може їх виміряти.
Virtualmin повідомляє квоту й використання лише тоді, коли ввімкнено квоти файлової системи, а свіжа інсталяція має їх вимкненими. Ми виміряли це: quotaon -p / повідомив off на стоковій інсталяції, бо інсталятор записує старий формат квот у /etc/fstab, тоді як сучасне ext4-ядро хоче журнальовану квоту. Доки хтось їх не ввімкне, у виводі API взагалі не зʼявляється жодне поле квоти.
Provibr показує нічого, а не нуль. Немає вимірювання й немає використання не одне й те саме, а графік, застряглий на нулі, має вигляд другого, коли це перше.
Дотична нотатка, якщо ви колись читаєте сирий вивід самі: віддавайте перевагу машиночитаним полям (created_unix_time, databases_byte_size) над їхніми людськими двійниками (created_on, databases_size). Людські несуть одиниці й формат дати, що залежать від локалі панелі, а їх розбір є саме тим ґатунком тихого збою, який спершу зʼявляється в клієнта з іншим налаштуванням.
Два навмисні упущення
Тест підключення не показує рядок версії. У Virtualmin немає жодної API-програми, яка повертає власну версію. virtualmin info знає двадцять один ключ пошуку, і жоден з них не версія, а заголовок Server: MiniServ не несе номера. Порожній рядок стверджував би, що ми спробували й не змогли її зчитати; лишити його поза межами означає сказати правду. Тест натомість показує ваш список планів, що є тим, що ви й хочете підтвердити.
І ніщо секретне з панелі ніколи не зберігається. list-domains --multiline несе hashed_password, password_for_mysql і password_storage буквально у своєму виводі. Provibr фільтрує списком дозволеного перед читанням, а не редагуванням потім: чорний список пропускає наступний секрет, який отримає іншу назву. Ми перевірили це контрперевіркою в тому самому прогоні: сира відповідь панелі очевидно несе ці три поля, а список імпорту не містить жодного з них.
Взяття облікових записів, які вже існують
Вкладка імпорту перелічує облікові записи на панелі й дає змогу взяти ті, які ви хочете, у Provibr. Уже відомі облікові записи показуються, але їх не можна вибрати знову, тож ви бачите повну картину, а не відфільтровану.
Імпортовані облікові записи рахуються у вашу потужність рівно як облікові записи, які ви замовили. Імпортуйте більше, ніж у вас є місця, і відкривається перевищення ліміту, зі звичайним пільговим періодом.
Що це лишає малому хостеру
Virtualmin є хорошою панеллю майже без комерційного інструментарію довкола неї. Звичайна порада (перейти на щось, що системи білінгу вже розуміють) просить вас мігрувати живих клієнтів з робочої машини, щоб вирішити паперову проблему.
Provibr підключається до панелей керування, гіпервізорів та ігрових панелей пліч-о-пліч. Лишіть машину Virtualmin, яку маєте, покладіть замовлення й підрахунок потужності поверх неї, і додайте VPS чи гейм-панель поряд пізніше, не змінюючи нічого в тому, як працює хостингова частина.