VulCode

WaveHost

Integracje panelu klienta WaveHost: VPS-y zakładane na węzłach Proxmox VE przez kolejkę zadań, serwery gier w Pterodactylu z konsolą i zasilaniem z panelu, płatności Stripe z podpisanym webhookiem i sklep, który sam pobiera oferty ze strony marki. Panel pilnuje zasobów węzłów i wycofuje ze sprzedaży pakiety, które już się nie zmieszczą, a każde zgłoszenie wsparcia dostaje prywatny kanał na Discordzie, z którego zespół odpowiada prosto do panelu.

TypIntegracje panelu hostingu
BackendNext.js 15, Prisma, MySQL
KolejkaBullMQ, Redis
IntegracjeProxmox VE, Pterodactyl, Stripe
WaveHost

Wprowadzenie

WaveHost to marka hostingowa, która sprzedaje VPS-y, serwery dedykowane i serwery gier. Jej panel klienta nie jest wyspą: VPS-y żyją na węzłach Proxmox VE, serwery gier w Pterodactylu, oferta na stronie marki, płatności w Stripe, a wsparcie na Discordzie.

Panel spina to wszystko tak, żeby klient zamawiał, płacił i zarządzał usługami w jednym miejscu, a zespół niczego nie przepisywał ręcznie z jednego systemu do drugiego.

VPS-y na Proxmox VE

Zamówienie VPS-a nie stawia maszyny w trakcie żądania klienta. Trafia do kolejki zadań, którą obsługuje osobny worker, więc długie operacje na węźle nie blokują panelu, a nieudany krok można ponowić. Worker rozmawia z API Proxmox VE każdego węzła, a dane dostępowe węzłów, czyli adres API, identyfikator i sekret tokenu, trzyma baza. Nowy węzeł dodaje się w panelu administratora, bez zmiany konfiguracji serwera.

Ten sam worker zbiera metryki maszyn i przelicza je w agregaty, z których korzystają wykresy w panelu klienta.

Serwery gier w Pterodactylu

Panel gier zostaje Pterodactylem, a panel klienta rozmawia z nim przez dwa interfejsy. Application API obsługuje sprawy administracyjne: konta, serwery i alokacje portów. Client API daje to, czego Application API nie wystawia: zasilanie, konsolę i zużycie zasobów na żywo. Klient restartuje serwer i patrzy w konsolę z panelu WaveHost, bez logowania się gdzie indziej.

Klienci starego panelu łączą swoje konto podpisanym linkiem. Dane konta i saldo idą zakodowane i podpisane HMAC-SHA256 wspólnym sekretem obu stron, z czasem ważności, więc nikt nie podrobi połączenia, a klient nie zakłada konta drugi raz.

Sklep zasilany ze strony marki

Oferta marki ma jedno źródło prawdy: panel administracyjny strony. Panel klienta sam pobiera z niej oferty i pakiety razem z nazwami, cenami, opisami, listami cech i oznaczeniami. Parametry techniczne, czyli węzeł, gra oraz dokładne rdzenie, pamięć i dysk, zostają w rękach administratora panelu i są tylko wstępnie wypełniane z listy cech, gdy pole jest puste.

Strona marki

marketing ustawia ofertę, cenę i opis w panelu strony.

Synchronizacja

panel klienta pobiera oferty jako kategorie, a pakiety jako produkty sklepu.

Administrator

przypisuje węzeł, grę i parametry techniczne.

Dostępność

panel sprawdza zasoby węzła i decyduje, czy pakiet można kupić.

Pakiety, które się nie zmieszczą

Platforma pilnuje zasobów węzłów i sama wycofuje ze sprzedaży oferty, które już się na nich nie zmieszczą, zostawiając zapas pamięci i dysku. Oferty w trybie ręcznym zostają nietknięte, a tryb przełącza się w panelu administratora. Klient nie zapłaci za serwer, którego nie da się postawić.

Płatności i logowanie

Płatności idą przez Stripe, a webhook Stripe jest przyjmowany tylko z poprawnym podpisem. Logowanie obsługuje dwuetapowe kody TOTP i passkeys, formularze chroni Cloudflare Turnstile, a e-maile wychodzą przez serwer SMTP marki.

Wsparcie na Discordzie

Każde nowe zgłoszenie w panelu zakłada prywatny kanał na serwerze Discorda zespołu, ukryty przed wszystkimi poza administracją, z przypiętą kartą zgłoszenia: temat, priorytet, pierwsza wiadomość i dane klienta. Odpowiedź napisana na tym kanale wraca do zgłoszenia w panelu, a bot oznacza ją reakcją jako dostarczoną. Zespół odpowiada tam, gdzie i tak siedzi, a klient widzi całą rozmowę w panelu.

Pytania o WaveHost

Więcej projektów

Inne realizacje z tej samej kategorii - zobacz, jak podchodzimy do podobnych wyzwań.

Masz podobny projekt?

Napisz do nas - wycena jest bezpłatna i wraca w godzinę.