Z mojego doświadczenia wynika, że większość programistów posiada jakieś swoje własne projekciki na boku. A to jakiś analizator giełdy, a to jakaś apka do ogarniania smogu, a to parsowanie rozkładów jazdy pociągów, względnie sterowanie żarówkami we własnym smart domu.
Takie projekciki charakteryzują się myślą przewodnią: byle szybko zakodzić i byle działało. Z założenia mogą działać tylko w optymistycznych flow i nie posiadać żadnych testów. Mają być radosnym programowanie i sprawdzeniem się, czy jeszcze potrafimy coś zaprogramować w innych „niepracowych” technologiach.
Takimi też przesłankami kierowałem się tworząc swój mini projekcik o roboczej nazwie:
Potrzeba była następująca: posiadam wirtualkę w cloudzie i chciałbym posiadać na niej dużo swoich aplikacji, jednak mam tylko 1GB pamięci i 8GB miejsca na dysku… Bardziej problematyczne jest pierwsze ograniczenie… A Java
– jak to Java
– zjada tyle pamięci, ile się jej przydzieli.
Można oczywiście skorzystać z Graala, skorzystać z Micronauta/Quarkusa i skompilować projekt do kodu natywnego. Problem pojawia się, gdy dziergamy nasze tajne projekty w Spring Boot od kilku lat i jest za dużo kodu do przepisania.
Zatem gdyby tylko istniało jakieś rozwiązanie, które pozwala na uruchamianie naszych serwisów, gdy są potrzebne, a gdy nie są potrzebne, to je ubija. I gdyby jeszcze było w miarę lekkie, nieobciążające zbytnio pamięci ani procesora. Takie Heroku tylko na VPS
ie.
Trochę poszukałem w internecie takie rozwiązania i oczywiście nie znalazłem 😛
No dobra, gdybym szukał trochę dłużej, to bym znalazł. Jednak taki własny projekt zawsze czegoś uczy, domena jest inna niż ta w pracy, więc może warto spróbować samemu coś takiego napisać…
Development
Z założenia rozwiązanie miało być przenaszalne, crossplatformowe oraz w miarę proste, zatem wybór padł na Dockera
, jako sposób zarządzania aplikacjami. Serwerem proxy jest Nginx
(wcześniej już chciałem go nieco poznać). Jednak jak połączyć te dwa światy, żeby za proxy była warstwa zarządzająca kontenerami Dockera
?
Okazuje się, że istnieje takie rozwiązanie jak OpenResty
, który rozszerza Nginx
o możliwość wykonywania skryptów (w języku Pascalo
-podobnym o nazwie Lua
). Zawsze nowy język do CV 😀 Warto mieć jakieś Api dockerowe i panel administracyjny zatem pożeniłem to wszystko z Portainer
.
Zatem poświęciłem kilka wieczorów i oto jest: lambda-for-vps. Jeżli ktoś chciałby spróbować, jak działa, wystarczy zklonować repo i uruchomić:
docker-compose -f docker-compose.yml up
Domyślnie uruchamia się projekt z przykładowym hello-world
, który jest dostępny na http://localhost/hello-world.
Działanie
Co nieco o działaniu jest opisane na githubie, jednak po angielsku. Po polsku to w skrócie:
- Po uderzeniu na endpoint
/hello-world
za pomocąPortainer
sprawdzany jest stan aplikacji (określonej za pomocądocker-compose.yml
). - Jeśli kompozycja nie istnieje, to wszystkie kontenery są automagicznie zaciągane.
- Jeśli kompozycja jest nieżywa, wówczas uruchamia całą kompozycję. Po uruchomieniu kontenerów istnieje opcja czekania określonego czasu od wstania kompozycji.
- Skoro wszystko działa, to request jest obsługiwany.
- Następnie zlecamy ubicie kompozycji o ile nie będzie w między czasie nowych żądań. Innymi słowy kompozycja jest ubijana po podanej liczbie sekund od ostatniego requesta.
Prawdopodobnie projekt nie jest doskonały. Jednak posiada kilka fajnych cech:
- wg
docker images
całość waży 181 MB, - wg
docker stats
obydwa kontenery zużywają 12 MB pamięci i szczątkową część procesora, - jest w nowym nieznanym mi języku
Lua
, - konfiguracja w popularnym
Nginx
, - zarządza apkami trzymanymi w
Dockerze
.
zatem jak na mały projekt jest przynajmniej Good enough.