Jak to działa?


Strona internetowa
Strona internetowa

Aplikacja wykorzystuje środowisko uruchomieniowe Node.js - generuje ona stronę internetową, wraz z panelem sterującym. Zmienne elementy strony są przechowywane w bazie MySQL, która jest replikowana pomiędzy serwerami. Aplikacja bazuje na potencjale kontenerów Docker, produkcyjnie uruchamiana jest w klastrze Kubernetes. Aby zapewnić szybkie wdrażanie kodu korzystamy z techniki CI/CD przy pomocy serwisów GitLab i Docker Hub.
Strona dla użytkownika jest dostarczana z najbliższego serwera poprzez usługę od firmy Cloudflare. Maszyny produkcyjne komunikują się między sobą poprzez VPN WireGuard pracujący w konfiguracji siatki (mesh). Infrastruktura jest zaprojektowana pod kątem wysokiej dostępności oraz możliwości szybkiego skalowania.

Użyte technologie:

  • Node.js - środowisko uruchomieniowe do tworzenia aplikacji napisanych w języku JavaScript, w jakim powstała aplikacja
  • Nginx - służy jako serwer proxy pomiędzy aplikacją a Cloudflare
  • Kubernetes - jest to platforma, na której uruchomiana jest nasza aplikacja umożliwiając szybkie skalowanie
  • GitLab - pozwala na automatyzację procesu wdrażania oprogramowania
  • Cloudflare - pozwala na dostarczanie treści z najbliższego serwera użytkownikowi, umożliwia równomierne rozkładanie obciążenia pomiędzy serwerami

Sterownik
Sterowanie oświetleniem

Informacje o kolorach lub efektach wysyłane są do sterownika w danej lokalizacji poprzez oprogramowanie Socket.io.
Każdy z nas ma różne autorskie sterowniki, jednak całość bazuje na kodzie klienta napisanym w języku programowania JavaScript. Do oświetlenia wykorzystujemy: karty z przekaźnikami, kontrolery jasności PWM, diody programowalne, taśmy LED. Do realizacji całości przydatny jest najczęściej mały komputer Raspberry Pi lub mikrokontroler ESP8266/ESP32. Na mikrokontrolerze zainstalowane jest oprogramowanie WLED lub ESP Easy.

Użyte technologie:

  • Socket.io - zapewnia dwukierunkową komunikację pomiędzy użytkownikiem na stronie, naszą aplikacją i elementami wykonawczymi
  • Redis - jest szybką, ulotną bazą danych, wymienia informacje o aktualnych nastawach światełek
  • WLED - oprogramowanie open-source dla mikrokontrolerów ESP8266/ESP32 - służy do kontroli programowalnych diod LED
  • ESPEasy - oprogramowanie open-source dla mikro kontrolerów ESP8266/ESP32 - służy do kontroli PWM kolorowych diod LED oraz kart przekaźnikowych
  • Raspberry Pi - jednopłytkowy komputer - zwykle jest pomostem pomiędzy stroną sterowania a światełkami

Karty graficzne w serwerze
Transmisja obrazu

Nasz serwis streamingowy jest zbudowany na zasadach mikrousług, co zapewnia wyjątkową elastyczność i skalowalność infrastruktury. Używając konfiguracji docker-compose, tworzymy spójne środowisko, które jest zarówno łatwe w zarządzaniu, jak i wysoce konfigurowalne.
Jako odbiorca sygnału video służy nginx-rtmp, który jest pierwszym punktem przetwarzania strumienia i zarządza autoryzacją. Następnie sygnał kierowany jest do OvenMediaEngine, gdzie odbywa się dalsze przetwarzanie w celu dostarczenia transmisji z jak najmniejszym opóźnieniem. W obecnym ustawieniu nie dokonujemy transkodowania obrazu, co pozwala na bardzo szybką dystrybucję materiału do użytkownika końcowego.
System wykorzystuje skrypty do synchronizacji i generowania miniatur, które są następnie dystrybuowane między serwerami za pomocą rsync. Dzięki temu proces jest zautomatyzowany i efektywny, zapewniając bieżące aktualizacje bez nadmiernego obciążania sieci.

Użyte technologie:

  • nginx-rtmp - odbiera przychodzące strumienie, zarządza autoryzacją i przekazuje je dalej
  • FFmpeg - przetwarza strumienie, generowanie miniatur
  • OvenMediaEngine - generuje strumienie niskiego opóźnienia WebRTC
  • Open Broadcaster Software (OBS) - pozwala nam na nałożenie różnych grafik na transmisję lub miksowanie obrazu z kamer

ELK Kibana
Monitoring

Cała nasza infrastruktura oraz aplikacja jest monitorowana i testowana 24h/7. Monitoring dostępności zapewniony jest poprzez Uptime Kuma, Uptime Robot, Zabbix i LibreNMS. Do monitorowania zdarzeń aplikacji wykorzystujemy oprogramowanie Elasticsearch. Parametry sprzętowe oraz wydajnościowe maszyn wirtualnych monitorujemy przy użyciu Zabbix.

Użyte technologie:

Drukarka termiczna
Drukarka termiczna

Pomysł udostępnienia drukarki był całkowicie spontaniczny. Do realizacji tego zadania chcieliśmy wybrać drukarkę, która będzie mogła być bezobsługowa w najbardziej możliwym stopniu. Po przejrzeniu wielu ofert wybraliśmy drukarkę Epson TM-T88IV. Drukarka wspiera standard ESC/POS, więc można do niej "pisać" z wykorzystaniem gotowych bibliotek dostępnych w sieci.
Za przekazywanie wiadomości z Discord na drukarkę odpowiedzialny jest nasz autorski skrypt, korzystający z biblioteki DiscordPHP. Generowana jest odpowiednia wiadomość i przekazywana do RabbitMQ.
Za przekazywanie wiadomości z Tipply odpowiedzialna jest nasza autorska biblioteka, która również komunikuje się z RabbitMQ. Wykorzystujemy RabbitMQ do kolejkowania wiadomości wychodzących do drukarki. Drukarka do komputera podłączona jest portem RS232, który mógłby nie nadążyć przy dużej ilości wiadomości - dlatego kolejkujemy wiadomości.

Rzeczy wykorzystane do realizacji tej części projektu:

  • EPSON TM-T88IV - około 150zł
  • Kamera Logitech C920 - około 350zł
  • Kabel/Konwerter USB na RS232 - Unitek + przejściówka DB9F/DB25M - 40zł
  • Karta graficzna GTX 750 Ti - 420zł
  • Kabel null-modem - zrobiony ręcznie z posiadanych kabli
  • Lampka doświetlająca - około 25zł
  • Rolki 80mm/80m - 5zł / sztuka
  • Serwer SuperMicro (streaming)
  • Komputer Intel NUC (obsługa drukarki)
Oprogramowanie:
  • https://github.com/mike42/escpos-php
  • https://github.com/discord-php/DiscordPHP
  • RabbitMQ
  • ...i własnościowe skrypty

Masz dodatkowe pytania? Chcesz dowiedzieć się czegoś więcej?

Zobacz również zakładkę "O autorach"

Dołącz do naszej społeczności!

Fanpage na Facebooku

Przejdź na Facebook

Czat tekstowy i głosowy na Discordzie

Dołącz na Discord