SHM — безопасный, открытый, бесплатный, событийный универсальный биллинг


Представляю Вашему вниманию универсальную биллинговую систему, которая позволяет легко и просто автоматизировать оказание IT сервисов.


SHM хорошо подходит для оказания разовых и периодических услуг, таких как:


  • Услуги хостинга
  • Услуги по продаже сервисов, таких как VPN
  • Интернет услуги и услуги связи с безлимитными (пакетными) тарифами

Компоненты системы:


  • Ядро (API)
  • Web интерфейс для администраторов системы
  • Web интерфейс для клиентов

Для оказания услуг необходимо:


  • Подготовить Ваш сервер, на котором планируете оказывать услуги
  • Установить SHM на Ваш сервер (можно на любой виртуальный сервер)
  • Настроить SHM с помощью Web интерфейса администратора либо через API
  • Подключить платежную систему для приема платежей от ваших клиентов

Запустить SHM на своём сервере очень просто. Поддерживается Docker и Kubernetes.


Биллинг


Биллинговая система позволяет принимать платежи, списывать средства за оказанные услуги, возвращать средства за преждевременно завершенные услуг, прогноз оплаты услуг и многое другое. Каждое такое действие называется: «Событие». К событиям можно привязывать команды, которые могут быть выполнены на ваших серверах. Способ доставки команд на сервера называется: «Транспорт» (SSH, HTTP, MAIL…).


Биллинг SHM поддерживает различные системы расчетов.


Команды и шаблоны


Когда клиент заказал и оплатил услугу, биллинг SHM инициирует событие «CREATE». Мы можем привязать к нему следующую команду:


vpn_create.sh —login="vpn_{{ us.id }}" —password="{{ us.gen_store_pass }}"

Где:


  • «vpn_create.sh» — скрипт, заранее написанный, для создания услуг на сервере и принимающий в качестве аргумента идентификатор услуги.
  • {{ us.id }} — шаблон. SHM заменит это выражение на реальный и уникальный идентификатор услуги пользователя.
  • {{ us.gen_store_pass }} — шаблон со специальной функцией, которая вернет сгенерированный пароль и сохранит его в БД, в настройки услуги пользователя, для возможности предоставления его клиенту.

SHM выберет доступный сервер из списка и выполнит на нём эту команду, например с помощью транспорта SSH. В случае, если команда будет успешна, услуга будет считаться оказанной, а её статус будет установлен в значение: ACTIVE. А в случае ошибки (например если сервер не доступен), SHM предпримет дальнейшие попытки выполнения этой команды через некоторое время.


Аналогичным образом, мы можем привязать команды и к другим событиям: («BLOCK», «REMOVE» и т.п.)


С помощью шаблонов SHM умеет формировать и email уведомления, и целые скрипты.


SHM поддерживает вложенные, дочерние услуги


Если мы хотим оказывать услуги Виртуального хостинга, то под «Тарифом» мы подразумеваем сразу несколько услуг, такие как: «Хостинг сайтов», «Хостинг почты» и «Хостинг БД». В этом случае, мы создаем сразу 4 услуги, где родительская услуга это «Тариф». Привязываем соответствующие отдельные команды для дочерних услуг. Это можно представить в виде дерева:


«Тариф» (100р./мес.)
└ «Хостинг сайтов»
└ «Хостинг почты»
└ «Хостин БД»

Услуги будут обработаны (созданы) снизу вверх. т.е. сначала команды выполняются для дочерних услуг, затем для родительской. Услуги могут располагаться на разных серверах.
Такой подход позволяет оказать несколько услуг с единым платежом и привязать к родительской услуге команду для email уведомления об успешно созданном (или удаленном) тарифе.


SHM позволяет хранить произвольные данные


Практически во всех таблицах БД есть поле settings, куда можно сохранять произвольные данные в формате JSON. Для некоторых услуг, таких как «Виртуальный сервер (VPS)», обычно сохраняют такие параметры как CPU и RAM. Каталог услуг хранится в таблице services. Следующий пример позволит создать услугу VPS с дополнительными параметрами, сохраненными в услуге:


vps_create.sh —login="vps_{{ us.id }}" —password="{{ us.gen_store_pass }}" \
   —cpu="{{ us.service.settings.cpu }}" —ram="{{ us.service.settings.ram }}"

Дополнительно, есть возможность сохранять произвольные, многострочные данные, причем в момент выполнения скриптов на серверах. Например, когда мы оказываем услугу VPN, нам необходимо куда-то сохранить сгенерированный ключ VPN, для последующей передачи его клиенту. Это можно сделать с помощью следующего шаблона скрипта:


#!/bin/bash

USER_ID="{{ user.id }}"
KEY="my_vpn_key"
SESSION_ID="{{ user.gen_session.id }}"

# Создаем пользователя и генерируем VPN ключ
./vpn-create-config.sh -c -u ${USER}

# Сохраняем VPN ключ пользователя в хранилище SHM
curl -sX PUT \
    -H "session-id: ${SESSION_ID}" \
    -H "Content-Type: text/plain" \
    https://mybilling.local/shm/v1/storage/${KEY} \
    --data-binary @- < <(cat out/${USER}.ovpn)

Получить сохраненный ключ клиент сможет с помощью ссылки вида:


https://mybilling.local/shm/v1/storage/my_vpn_key

Больше информации можно получить на сайте документации и в группе Telegram.


Заключение


Биллинг SHM представляет из себя готовую систему, с Web интерфейсом администратора, клиента и API (backend).


Основные особенности системы:


  • OpenSource (https://github.com/danuk/shm), в разработке с 2016 года.
  • Различные режимы биллинга
  • Гибкое построение команд (шаблоны) и привязка их к событиям
  • Отслеживает статус выполнения команд на серверах, с поддержкой Retry и логированием вывода команд (pipeline), по аналогии с GitLab CI.
  • Поддерживает неограниченное кол-во серверов. Позволяет объединять сервера в группы.
  • Располагается на отдельном, независимом сервере. Общается с серверами безопасно, посредством "Транспорта"
  • Работает в контейнерах (Docker). Легко инсталлировать, поддерживать и обновлять. Поддержка Kubernetes.
  • API
  • Код SHM обширно покрыт unit тестами, что позволяет избегать ошибок при разработке
  • Работа с БД осуществляется в транзакционном режиме, что позволяет оставаться системе атомарной.
  • Легко делать резервные копии системы (бэкапы)
  • … и многое другое

SHM находится в активной разработке. Множество идей ещё предстоит реализовать.


Документация: https://docs.myshm.ru
Поддержка в группе Telegram: https://t.me/shm_billing


p.s. в самое ближайшее время, в качестве примера, я планирую написать подробную статью/инструкцию по запуску сервиса продажи VPN на основе SHM.


Немножко скринов

server_edit


service_edit


template_vpn_create


event_create

Комментарии (3)


  1. dimitrius86
    01.09.2022 13:36

    я думал на Perl ничего уже не создаётся, ан нет! )


    1. danuk Автор
      01.09.2022 14:04
      +1

      Создается, даже новые либы народ пишет.

      В целом, не так важно, какой язык. Если продукт востребован, то всегда можно и переписать на что-то более современное. Опять же, если это требуется.


      1. dimitrius86
        01.09.2022 21:15
        +1

        ну это да. Язык это лишь инструмент. Каким инструментом эффективнее умеешь пользоваться тот и используешь.