Architektura systemu
Orbito składa się z trzech głównych warstw: serwera Orbito (rdzeń), modułów uruchamianych w kontenerach oraz bazy danych MongoDB. Każda z nich ma ściśle określoną rolę.
┌─────────────────────────────────────────────────┐
│ Przeglądarka │
│ (Panel administracyjny) │
└─────────────────────┬───────────────────────────┘
│ HTTP
┌─────────────────────▼───────────────────────────┐
│ Serwer Orbito (Core) │
│ - routing żądań - zarządzanie sesją │
│ - orkiestracja modułów - proxy HTTP (fetch) │
│ - system hooków - renderowanie stron │
└──────┬────────────────────────────┬─────────────┘
│ protokół Orbito │
┌──────▼──────────┐ ┌──────────▼──────────────┐
│ Moduł A │ │ Moduł B │
│ (kontener │ │ (kontener Docker) │
│ Docker) │ │ │
│ @orbito/api-lib│ │ @orbito/api-lib │
└──────┬──────────┘ └──────────┬──────────────┘
│ │
┌──────▼────────────────────────────▼─────────────┐
│ MongoDB │
│ (kolekcje zarządzane przez Orbito Core) │
└─────────────────────────────────────────────────┘
Serwer Orbito
Serwer Orbito jest centralnym punktem całego systemu. Pełni kilka kluczowych ról jednocześnie:
Orkiestrator modułów – zarządza cyklem życia każdego modułu: uruchamia kontenery Docker, monitoruje ich stan i restartuje je w razie awarii.
Router żądań – przyjmuje żądania od panelu administracyjnego i kieruje je do właściwego modułu na podstawie ścieżki URL lub nazwy wywoływanej metody.
Proxy HTTP – pośredniczy we wszystkich wychodzących żądaniach HTTP modułów (poprzez Core.fetch). Sprawdza, czy domena docelowa należy do listy zatwierdzonych przez administratora firmy.
Broker hooków – przyjmuje wywołania execHook i rozsyła je do wszystkich modułów zarejestrowanych na dany hook.
Renderer stron – na żądanie przeglądarki odpytuje właściwy moduł o definicję strony i renderuje ją jako HTML.
Wiele procesów rdzenia
Na większej instalacji serwer Orbito działa jako pula rdzeni — kilka procesów na kilku serwerach. Każda firma jest wtedy obsługiwana w całości przez jeden z nich, a po jego awarii przejmuje ją inny proces puli. Moduł łączy się z lokalnym routerem (core-router), który kieruje go do procesu obsługującego firmę. Dla modułu nic się nie zmienia poza tym, że po przejęciu firmy biblioteka @orbito/api-lib łączy się ponownie (w ciągu kilku sekund) — dlatego moduł nie powinien zakładać, że połączenie z platformą trwa przez cały czas życia kontenera. Opis dla operatora instalacji: Pule rdzeni i router.
Moduły
Moduł to samodzielny pakiet Node.js działający w izolowanym kontenerze Docker. Każda instalacja modułu — nazywana instancją — ma własny, niezależny kontener. Firma może zainstalować ten sam moduł wielokrotnie (np. trzy sklepy Prestashop); każda instalacja dostaje wtedy osobny kontener, osobną konfigurację i osobne kolekcje w bazie. Szczegóły w Kontekst firmy i instancji.
Kluczowe cechy modułu:
- Brak bezpośredniego dostępu do sieci – cały ruch wychodzący przechodzi przez serwer Orbito.
- Własna przestrzeń plików – moduł widzi tylko swoje pliki; nie ma dostępu do systemu plików hosta ani innych modułów.
- Standardowy Node.js – moduł może używać dowolnych pakietów npm, tak jak każda aplikacja Node.js.
- Bezstanowość między wywołaniami – stan biznesowy powinien być persystowany w MongoDB, nie w pamięci procesu (kontener może zostać zrestartowany).
Komunikacja
Moduł komunikuje się z platformą i innymi modułami wyłącznie przez bibliotekę @orbito/api-lib. Biblioteka ta implementuje protokół komunikacyjny Orbito i ukrywa jego szczegóły za prostym API.
Moduł Serwer Orbito
│ │
│── Core.registerMethod(name, fn) ─►│ rejestracja metody
│ │
│◄─ fn(params, ctx) ───────────────│ wywołanie przez platformę
│ │
│── Core.callModule(id, method) ──►│ wywołanie innego modułu
│◄─ wynik ────────────────────────│
│ │
│── Core.fetch(url, options) ─────►│ wychodzące HTTP
│◄─ response ──────────────────────│
│ │
│── Log.info(msg, data) ──────────►│ logowanie
Szczegóły każdej z tych metod znajdziesz w sekcji API biblioteki.
