
Cześć! Jesteśmy «Hosting Technologie» i 5 lat temu uruchomiliśmy — pierwszy hosting vds stworzony specjalnie dla programistów. Staramy się, aby był tak wygodny jak DigitalOcean, ale z rosyjskim wsparciem, metodami płatności i serwerami w Rosji. Ale DigitalOcean to nie tylko niezawodność i cena, to także serwis.
Oprogramowanie od ISPsystem okazało się być liną, która krępowała nasze ręce w drodze do świetnej obsługi. Trzy lata temu korzystaliśmy z systemu billingowego Billmanager i panelu zarządzania serwerami VMmanager i szybko zrozumieliśmy, że świadczenie dobrego serwisu bez własnego panelu jest praktycznie niemożliwe.
Jak ISPsystem psuł wygodę
Błędy
Nie mogliśmy sami naprawić błędu — za każdym razem musieliśmy pisać do obcej pomocy technicznej i czekać. Rozwiązanie jakiegokolwiek problemu wymagało reakcji zewnętrznej firmy.
Wsparcie ISPsystem odpowiadało normalnie, ale poprawki przychodziły tylko w kolejnych wydaniach, i to nie zawsze i nie wszystkie. Czasami krytyczne błędy były naprawiane przez kilka tygodni. Musieliśmy uspokajać klientów, przepraszać i czekać, aż ISPsystem naprawi błąd.
Zagrożenie przestojami
Aktualizacje mogły powodować nieprzewidywalne przestoje, które prowokowały nowe błędy.
Każda aktualizacja była jak gra losowa: musieliśmy zakrywać billing i składać ofiary bogom aktualizacji — kilka razy aktualizacja powodowała przestój na minutę 10-15. W tym czasie nasi administratorzy siedzieli w niepewności — nigdy nie wiedzieliśmy, jak długo potrwa przestój i nie mogliśmy prognozować, kiedy ISPsystem zdecyduje się wydać nową aktualizację.
W piątej generacji Billmanager stało się lepiej, ale aby uzyskać dostęp do potrzebnych funkcji musieliśmy zainstalować wersję beta, która aktualizowała się co tydzień. Jeśli coś się psuło, musieliśmy dać dostęp obcym programistom, aby naprawili to, co się zepsuło.
Niewygodny interfejs panelu
Wszystko było podzielone na różne panele i zarządzane z różnych miejsc. Na przykład, klienci płacili przez Billmanager, a ponowne uruchomienie lub reinstalacja VDS musiała odbyć się w VMManager. Nasi pracownicy również musieli przełączać się między oknami, aby pomóc klientowi, sprawdzić obciążenie jego serwera lub zobaczyć, jaki system operacyjny używa.
Taki interfejs zabiera czas — zarówno nasz, jak i klientów. O wygodzie, jak w DigitalOcean, w takiej sytuacji nie może być mowy.
Krótkie cykle życia z częstymi aktualizacjami API
Stworzyliśmy własne wtyczki – na przykład wtyczkę z dodatkowymi metodami płatności, których brakuje w VMManager.
W ostatnich latach VMManager miał stosunkowo krótki cykl życia, a w nowych wersjach nazwy zmiennych lub funkcji w API mogły się losowo zmieniać – to łamało nasze wtyczki. Wsparcie dla starych wersji szybko było wycofywane, co zmuszało nas do aktualizacji.
Nie można modyfikować
Właściwie można, ale to niezwykle nieefektywne. Ograniczenia licencyjne nie pozwalają na wprowadzanie zmian w kodzie źródłowym, można jedynie pisać wtyczki. Maksimum wtyczek – to jakieś elementy menu, kreator krok po kroku. ISPsystem jest zaprojektowany do uniwersalności, a my potrzebowaliśmy specjalistycznych rozwiązań.
Tak zapadła decyzja, aby napisać własny panel. Ustawiliśmy cele:
- Szybko reagować na błędy, usterki i mieć możliwość ich samodzielnego usuwania, nie zmuszając klienta do czekania.
- Swobodnie modyfikować interfejs dostosowany do procesów roboczych i potrzeb klienta.
- Zwiększyć użyteczność dzięki czystemu i zrozumiałemu designowi.
I rozpoczęliśmy rozwój.
Architektura nowego panelu
Mamy samowystarczający zespół programistów, więc panel napisaliśmy sami.
Główną pracę wykonało trzech inżynierów – dyrektor techniczny Sergey wymyślił architekturę i napisał agenta serwerowego, Alexey zrobił billing, a frontend zbudował nasz frontendowiec Artysh.
Krok 1. Agent serwerowy
Agent serwerowy to serwer WWW oparty na Pythonie, który zarządza biblioteką , która z kolei zarządza .
Agent zarządza wszystkimi usługami na serwerze: tworzenie, zatrzymywanie, usuwanie vds, instalacja systemów operacyjnych, zmiana parametrów itd. za pośrednictwem biblioteki libvirt. W momencie publikacji artykułu jest to ponad czterdzieści różnych funkcji, które dopasowujemy w zależności od zadań i potrzeb klienta.
Teoretycznie libvirt można było zarządzać bezpośrednio z billingiem, ale to wymagało zbyt wielu dodatkowych kodów, dlatego postanowiliśmy rozdzielić te funkcje pomiędzy agentem a billingiem – billing po prostu wysyła żądania do agenta przez JSON API.
Agent to pierwsze, co zrobiliśmy, ponieważ nie wymagał żadnego interfejsu i można go było testować bezpośrednio z konsoli serwera.
Co dał nam agent serwerowy: Pojawiła się warstwa, która ułatwia życie wszystkim — billing nie musi przekazywać setek komend, a jedynie wysłać zapytanie. A agent zrobi wszystko, co należy: na przykład przydzieli miejsce na dysku i pamięć operacyjną.
Krok 2. Billing
Dla naszego dewelopera Alexa to nie była pierwsza panel zarządzania — Alex jest w hosting od dawna, więc w zasadzie rozumiał, co jest potrzebne klientowi, a co dostawcy.
Billing nazywamy między sobą «panelem zarządzania»: zawiera nie tylko pieniądze i usługi, ale także zarządzanie nimi, wsparcie klientów i wiele więcej.
Aby przejść z oprogramowania ISPSystem, należało w pełni zachować poprzednią funkcjonalność klientów, przenieść wszystkie finansowe działania użytkowników z starego systemu billingowego do nowego, a także wszystkie usługi i powiązania między nimi. Zbadaliśmy, co jest w obecnym produkcie, później rozwiązania konkurencji, głównie DO i Vultr. Przyjrzeliśmy się wadom i zaletom, zebraliśmy opinie ludzi, którzy pracowali z starymi produktami od ISPsystem.
W nowym billing użyto dwóch stosów: klasyczny PHP, MySQL (a w przyszłości planujemy przejść na PostgreSQL), Yii2 jako frameworka na backendzie oraz VueJS na frontendzie. Stosy pracują niezależnie od siebie, są rozwijane przez różnych ludzi, a komunikują się za pomocą JSON API. Do rozwoju wtedy i dzisiaj używamy i od JetBrains i szczerze je kochamy (hej, chłopaki!)
Panel zaprojektowano w sposób modułowy: moduły systemów płatności, moduł rejestratorów domen lub na przykład moduł certyfikatów SSL. Można łatwo dodać nową funkcję lub usunąć starą. Architektura uwzględnia możliwość rozszerzenia, w tym w stronę «hardware».

Co otrzymaliśmy: panel zarządzania, nad którym mamy pełną kontrolę. Teraz błędy są naprawiane w ciągu godzin, a nie tygodni, a nowe funkcje wdrażane są na prośbę klientów, a nie z inicjatywy ISPSystem.
Krok 3. Interfejs

Interfejs — nasze wspólne dzieło.
Najpierw zastanawialiśmy się, co się stanie, jeśli zrobimy nadbudowę nad API ISPsystem, nic radykalnie nie zmieniając w interfejsie. Wyszło średnio i postanowiliśmy wszystko zrobić od zera.
Wierzyliśmy, że najważniejsze jest stworzenie logicznego interfejsu z czystym i minimalistycznym designem, co pozwoli uzyskać ładny panel. Rozmieszczenie elementów omawialiśmy w Megaplanie i stopniowo powstał ten interfejs, który użytkownicy widzą teraz w panelu sterowania.
Jako pierwszy powstał projekt strony rozliczeniowej, ponieważ już wcześniej tworzyliśmy wtyczki płatności dla ISPsystem.
Frontend
Panel postanowiono stworzyć jako aplikację SPA — niewymagającą zasobów i z szybkim ładowaniem danych. Nasz frontendowiec Artysz zdecydował się napisać go w Vue — w tamtym czasie Vue właśnie się pojawił. Założyliśmy, że framework będzie się dynamicznie rozwijał, tak jak React, że spośród społeczności Vue wkrótce powstanie wiele bibliotek. Postawiliśmy na Vue i nie żałowaliśmy — teraz dodanie nowych funkcji na frontalnej części, które już zaprogramowano po stronie backendu, zajmuje mało czasu. Szczegóły dotyczące frontendu panelu przedstawimy w osobnym artykule.
Połączenie frontendu z backendem
Frontend połączono z backendem za pomocą push. Musieliśmy się wysilić i napisać własny handler, ale teraz aktualizacja informacji na stronie odbywa się prawie natychmiastowo.
Co uzyskaliśmy: Interfejs panelu stał się prostszy. Uczyniliśmy go responsywnym, a szybkie ładowanie pozwala korzystać z niego nawet z urządzeń mobilnych w ostatnich minutach przed startem, bez konieczności instalowania oddzielnej aplikacji do obsługi panelu.
Krok 4. Testowanie i schemat migracji
Kiedy wszystko ruszyło i przeszliśmy pierwsze testy, pojawiło się pytanie o migrację. Na początku zainstalowaliśmy billing i zaczęliśmy testować jego współpracę z agentem serwerowym.
Następnie napisaliśmy prosty skrypt, który przenosi bazę danych ze starego systemu billingowego do nowego.
Musieliśmy testować i weryfikować dosłownie wszystko, ponieważ dane były łączone w nową bazę z trzech starych: Billmanager, VMmanager i IPmanager. Chyba testowe migracje były najtrudniejszym zadaniem, z którym się spotkaliśmy w trakcie tworzenia nowego panelu.
Po weryfikacjach zamknęliśmy stary billing. Finalna migracja danych była bardzo stresującym momentem, ale, na szczęście, odbyła się w kilka minut i bez zauważalnych problemów. Były drobne błędy, które naprawialiśmy przez tydzień. Najwięcej czasu zajęło testowanie tego, co udało się osiągnąć.
Następnie wysłaliśmy wiadomości e-mail do klientów z adresem nowego panelu i systemu billingowego oraz ustawiliśmy przekierowanie.
W rezultacie: TO ŻYJE!
Szczęśliwe zakończenie
Od pierwszych godzin pracy naszego oprogramowania odczuliśmy wszystkie korzyści płynące z migracji. Kod był w pełni nasz, z wygodną architekturą, a interfejs — czysty i logiczny.

Pierwsza opinia po uruchomieniu nowego panelu
Rozpoczęliśmy proces migracji w grudniu, tuż przed Nowym Rokiem 2017, когда obciążenie było najmniejsze, aby ułatwić przejście klientom — prawie nikt nie pracuje przed świętami.
Najważniejsze, co zyskaliśmy przy przejściu na nasz system (oprócz ogólnej niezawodności i wygody) — możliwość szybkiego dodawania funkcjonalności na potrzeby kluczowych klientów — być dla nich twarzą, a nie tyłem.
Co dalej?
Rośniemy, rośnie liczba danych, klientów i danych klientów. Na backendzie pojawił się serwer Memcached oraz dwóch menedżerów kolejek z różnymi zadaniami. Na frontendzie mamy buforowanie i własne kolejki.
Oczywiście, mieliśmy też przygody podczas rozwoju i komplikacji produktu, na przykład, gdy dodawaliśmy HighLoad.
W następnym artykule opowiemy, jak uruchomiliśmy taryfę Hi-CPU: o sprzęcie, oprogramowaniu, jakie zadania realizowaliśmy i co nam się udało.
Źródło: habr.com
