Блог ·
Автоматизація білінгу Virtualmin
Від замовлення до облікового запису Virtualmin і що робить неоплачений рахунок: призупинення, відновлення й видалення, з командами за кожним кроком.
Автор: Provibr
Два питання вирішують, чи може хостингова панель нести платних клієнтів: чи стає замовлення робочим обліковим записом без вашого втручання, і чи неоплачений рахунок справді щось змінює на сервері.
Ця сторінка відповідає на обидва для Virtualmin, конкретно: яка команда Virtualmin стоїть за кожним кроком, що де зберігається і де автоматизація навмисно зупиняється. Усе виміряно на реальній інсталяції Virtualmin GPL 8.1.2.
Від замовлення до облікового запису
Замовленню потрібні чотири речі: домен, адреса електронної пошти, план і пароль.
План є найцікавішим. Вебплан Provibr прикріплює рівно один план Virtualmin до рівно однієї інтеграції й дає йому вашу власну назву. Це посередництво існує тому, що план Virtualmin є власним описом облікового запису панеллю (квота диска, місячний трафік, кількість поштових скриньок і доменів, які функції ввімкнено), а його вміст може змінитися на вашій машині без того, щоб нам повідомили. Тож ми посилаємося на нього за назвою й зчитуємо назад те, що справді сталося, замість кешувати те, що ми думаємо, що він означає.
За лаштунками замовлення виконує create-domain на панелі з доменом, планом і паролем. Тоді:
| Команда Provibr | Програма Virtualmin |
|---|---|
| Створити обліковий запис | create-domain |
| Призупинити | disable-domain |
| Відновити | enable-domain |
| Змінити план | modify-domain --plan |
| Прочитати статус | list-domains --domain |
| Видалити | delete-domain |
Дві деталі кроку створення варто знати.
Unix-користувач походить від домену. my-client.nl стає my-client. Дефіси тут є нормальною формою, а стелею є власні 32 символи Linux, на відміну від DirectAdmin і cPanel, які накладають суворіше власне іменування. Ви не обираєте імʼя користувача; панель виводить його.
Пароль ніколи не записується. Provibr зберігає факт, що ви його надали, а не значення. Пароль подорожує окремо від аудиторського сліду, який фіксує замовлення, тож пароль хостингового облікового запису ніде не існує в історії платформи. Якщо ви його втратите, ви його скидаєте, а не знаходите.
Що де зберігається
Хостинговий обліковий запис стає звичайним рядком сервера типу webserver. Його ідентифікатором є внутрішній номер, який Virtualmin дає домену, а не назва.
Цей вибір навмисний, і він важить для білінгу. Virtualmin може перейменувати домен, і клієнт чи адміністратор зрештою це зробить. Ключ на основі назви відривається від свого рядка першого ж разу, коли це стається: ваш рахунок далі бере плату за щось, чого платформа більше не може знайти. Числовий ID переживає перейменування.
Межею облікового запису є unix-користувач, а не домен. Інакше субсервери та псевдоніми під одним обліковим записом кожен потрапляв би в підрахунок потужності як окремий хостинговий обліковий запис, і ви платили б ліцензійну потужність за псевдоніми.
⚠️ Тут є крок перекладу, який легко зробити неправильно, якщо ви будуєте це самі. Програми мутації Virtualmin (disable-domain, enable-domain, modify-domain) беруть лише --domain як селектор. Ми виміряли це на 8.1.2: селектора --user немає. Але платформа адресує облікові записи за іменем користувача, бо це і є ідентичність облікового запису. Переклад належить агенту, який робить один обмежений пошук на панелі, щоб розвʼязати поточний домен, а не платформі, якій довелося б тримати копію ваших доменних імен і яка нишком націлилася б на не той домен першого ж разу, коли хтось перейменує один поза Provibr.
(Повʼязана пастка: modify-domain --user означає перейменувати, а не обрати. Її ніколи не надсилають.)
Модель потужності, в одному абзаці
Ви купуєте потужність за типом ресурсу (віртуальні машини, виділені машини, хостингові облікові записи, ігрові сервери), і це водночас ліміт і ціна. Кожен обліковий запис рахується, працює він чи ні. Не рахується лише призупинений, а також видалений. Тож зупинка чогось не звільняє місця: приберіть його або підніміть свою потужність. Підвищення набуває чинності негайно, а додаток за решту періоду пропорційно нараховується на ваш наступний рахунок; зниження теж набуває чинності негайно, а невикористана частина повертається як кредит.
Імпортовані облікові записи рахуються так само, як замовлені. Взяти під опіку панель, повну наявних клієнтів, є рішенням про потужність, а не безкоштовною дією.
Що робить неоплачений рахунок
Ваша організація має один статус ліцензії: активний, пільговий чи призупинений. Дві окремі речі можуть його штовхнути (непогашений платіж і перевищення ліміту), і коли застосовні обидві, перемагає суворіша, тож банер не чергується між двома історіями.
Шлях пробного періоду є найяснішим прикладом цієї форми. Нова організація працює на двотижневому пробному періоді без запиту платіжних даних і з усім, що працює. Коли він закінчується без способу оплати, вам повідомляють, і поки що нічого не змінюється. За тиждень панель починає попереджати. За два тижні після закінчення періоду сервери призупиняються. Про кожен крок повідомляють, перш ніж він станеться: це правило, довкола якого побудовано весь розклад, а не любʼязність, прикручена до нього.
Для чинної підписки механізм той самий: статус переходить у пільговий, перш ніж перейти в призупинений, банер називає причину, і виправлення привʼязане до нього. Призупинення за оплату й призупинення за потужність мають різний вигляд і читаються по-різному, бо їм потрібне від вас різне.
Що призупинення робить на панелі
Коли платформа призупиняє хостинговий обліковий запис, вона надсилає disable-domain. Virtualmin блокує пароль адміністративного користувача й замінює вебсайт сторінкою помилки. Дані лишаються.
Три властивості цього потоку варто розписати, бо саме вони відрізняють справжню автоматизацію від скрипту, що на неї схожий.
Рядок позначається призупиненим лише після того, як агент це підтвердить. Надіслати команду не означає, що вона сталася. Якби платформа позначала рядок при відправленні, невдале призупинення лишило б запущений обліковий запис порахованим як «не враховується у ваш ліміт»: саме та облікова помилка, для запобігання якій це застосування існує.
Офлайн-агент означає відкладено, а не виконано. Якщо агента не вдається досягти, застосування пропускається, пишеться подія, яка про це каже, і наступний раунд пробує знову. Ніщо нишком не позначається завершеним.
Читанням результату є свіже читання, а не власна відповідь команди. disable-domain повертає стіну тексту про поступ (Locking administration user's password .., Replacing website with error page ..), і цей текст є цитатою, а не контрактом. Стан надходить зі свіжого list-domains після. Це домашнє правило на кожній панелі, яку ми інтегруємо: жодна мутація не заслуговує довіри за власною відповіддю.
Саме це останнє правило й робить виявлення призупинення взагалі правильним, і ось виміряна причина. На призупиненому обліковому записі list-domains відрощує поле під назвою disabled. На активному обліковому записі цього поля просто немає (немає disabled: "No"). Парсер, який шукає значення, не знаходить нічого й читає кожен обліковий запис як активний, зокрема призупинені. У контексті білінгу це не косметика: обліковий запис, який ви призупинили за несплату, повідомляв би про себе як про живий, і ваш підрахунок потужності був би неправильним у той бік, який коштує вам грошей.
Перевищення ліміту
Запуск більшої кількості облікових записів, ніж ви купили, не блокується в момент, коли ви це робите. Його виявляють, вам повідомляють, і вам дають час.
- Надлишок виявлено. Ви отримуєте сповіщення й банер, що називає тип ресурсу й наскільки.
- У вас є цілий робочий день, щоб це виправити: приберіть облікові записи або підніміть свою потужність.
- Якщо пільговий період спливає, платформа призупиняє найновіші облікові записи понад вашим лімітом. Найновіші першими, тож те, що ви збудували найраніше, виживає. Призупинений обліковий запис зберігає свій диск і свої дані.
- Щойно ви повертаєтеся в межі свого ліміту, перевищення закривається.
Друге перевищення протягом тижня отримує годину замість дня. Без цього пільговий період можна було б поновлювати нескінченно, опускаючись під ліміт і знову його перевищуючи.
⚠️ Ніщо не запускається для вас, коли перевищення владнано. Увімкнути обліковий запис назад є рішенням, і платформа не ухвалює його, поки ніхто не дивиться. Ви відновлюєте його самі, і це надсилає enable-domain.
За кроком 4 стоїть невеличка арифметика, яку легко переплутати. Перевищення вважається владнаним, коли облікові записи, що рахуються плюс облікові записи, призупинені цим перевищенням повертаються в межі ліміту, а не лише перше число. Без цього додавання застосування оголосило б себе владнаним тієї миті, як подіяло, бо підрахунок падає під ліміт саме через призупинення.
Що ніколи не автоматичне
Видалення. Ні неоплачений рахунок, ні перевищення, ні прострочений пробний період не видаляють хостинговий обліковий запис. Призупинення зберігає диск і дані; видалення є окремою, явною дією, яку виконуєте ви. Єдиним руйнівним кроком у життєвому циклі є той, який платформа не зробить за вас.
Часткова оплата з кредиту. Ви можете поповнити наперед, і баланс є грошовою книгою: один рядок на кожну зміну, ніколи не редагований, виправленнями є протилежні рядки з причиною, а не переписування. Якщо баланс покриває весь місяць, місяць оплачується з кредиту й нічого не стягується. Якщо ні, стягується повна сума, а баланс лишається недоторканим. Половини на половину немає.
Переписування історії. Рядок рахунку фіксує назву плану такою, якою вона була в момент виставлення рахунку. Перейменування чогось згодом не змінює того, що каже старий рахунок.
Де це вас лишає
Virtualmin дає вам солідну хостингову панель і жодного комерційного шару взагалі. Прогалина не в провізіюванні (create-domain це одна команда), а в усьому довкола нього: рахувати те, що має клієнт, знати, що рахунок лишився неоплаченим, робити з цим щось зворотне й уміти пояснити після, що сталося й коли.
Provibr підключається до панелей керування, гіпервізорів та ігрових панелей пліч-о-пліч. Модель білінгу вище однакова для всіх них, що і є практичним аргументом для невеликого хостера: машина Virtualmin, яку ви вже запускаєте, працює далі точно так само, а VPS чи ігрова панель, яку ви додасте наступного року, потрапляє в той самий підрахунок потужності, той самий рахунок і той самий потік призупинення.
Поширені запитання
Чи має Virtualmin власну панель рахунків?
Ні. Virtualmin дає надійну хостингову панель і жодного комерційного шару. Прогалина не в провізіюванні, бо create-domain є однією командою; вона в тому, щоб рахувати, що має клієнт, знати, що рахунок лишився неоплаченим, і зробити з цим щось оборотне.
Що відбувається на панелі, коли обліковий запис призупиняють?
Платформа надсилає disable-domain. Virtualmin блокує пароль адміністративного користувача й замінює сайт сторінкою помилки. Дані лишаються.
Чи видаляє неоплачений рахунок хостинговий обліковий запис?
Ніколи. Ні неоплачений рахунок, ні перевищення, ні завершений пробний період не видаляють обліковий запис. Єдиним руйнівним кроком у життєвому циклі є саме той, якого платформа за вас не робить.
Як надійно виявити призупинений обліковий запис Virtualmin?
Перечитуючи стан, а не вірячи відповіді самої команди. У призупиненого облікового запису list-domains отримує поле disabled; в активного цього поля просто немає, тож парсер, який шукає значення, читає кожен обліковий запис як активний, зокрема й призупинені.
Чи призупинений обліковий запис і далі рахується до моєї місткості?
Ні. Кожен обліковий запис рахується, працює він чи ні, і лише призупинений або видалений не рахується. Зупинка чогось тому не звільняє місця: видаліть його або збільште місткість.