Blog

Jak wdrożyć aplikację na produkcję bez pożaru

Jak wdrożyć aplikację na produkcję bez pożaru

Poruszymy dziś pozornie skomplikowany temat wdrożenia aplikacji na produkcję. Na pierwszy rzut oka wydaje się on trudny, jednak gdy się w niego zagłębimy, okaże się, że nie ma się czego bać.

Zacznijmy od tego, czym w ogóle jest wdrożenie aplikacji na produkcję? Otóż jest to nic innego, jak przekazanie jej do użytkowników końcowych, którzy będą z niej korzystać.

Po kolei omówimy możliwe rozwiązania z uwzględnieniem ich wad i zalet, a na koniec czeka na Ciebie niespodzianka, czyli wyjaśnienie jak to wszystko można zrobić w chmurze AWS.

Tradycyjny hosting

Pierwsza z opcji to wdrożenie aplikacji na serwer, na którym nie mamy zbyt wielu uprawnień, czyli tradycyjny hosting. W tym wypadku poza dostępem do FTP i czasami ograniczonym SSH nie mamy więcej opcji.

W przypadku FTP nie pozostaje nam nic innego jak skopiować nasze pliki z lokalnego komputera na serwer, wykorzystując do tego któryś z dostępnych klientów FTP, np. FileZilla.

Podobnie będzie, jeśli mamy dostęp do SSH, czyli terminala naszego serwera. Jest to serwer współdzielony przez wielu użytkowników, dlatego nie będziemy tutaj mogli instalować nowych aplikacji. O dostępie jako administrator również możemy zapomnieć. Pozostaje nam ta sama opcja, co w przypadku FTP, czyli kopiowanie plików z komputera na serwer.

Główną przewagą SSH nad FTP jest możliwość podpięcia naszego edytora kodu i synchronizowanie plików z serwerem. Pozwala nam to na edycję pliku i obserwowanie wprowadzonych zmian od razu na serwerze docelowym, ale uwaga! Stanowczo należy unikać takich praktyk na serwerze, z którego korzystają użytkownicy aplikacji. Natomiast jest to świetne rozwiązanie, gdy korzystamy z serwera testowego. Pozwala nam to uniknąć konfigurowania wielu rzeczy lokalnie.

Hosting jest stosunkowo tanim rozwiązaniem, ale ma jeszcze jedno ograniczenie. Mianowicie technologia, z której możemy skorzystać. W większości wypadków wspierane jest tylko PHP. Coraz częściej pojawia się także wsparcie dla Nodejs, ale to wciąż nie jest powszechna praktyka.

Serwer dedykowany

Jeśli hosting daje zbyt ograniczone możliwości w stosunku do naszych potrzeb, musimy rozglądać się za innym rozwiązaniem, jakim może być serwer dedykowany, vps lub serwer w naszej serwerowni.

W tym przypadku mamy dostęp do serwera jako administrator, co otwiera przed nami zupełnie nowe możliwości. Oczywiście na serwerze dedykowanym także możemy skorzystać z opcji wspomnianych przy wdrożeniu na tradycyjny hosting, jednak szkoda byłoby zatrzymywać się na tych podstawowych możliwościach, mając tak szeroki wybór.

Pierwszą z ciekawych opcji jest skorzystanie z wirtualizacji. W dużym uproszczeniu pozwala ona na tworzenie wirtualnych systemów w obrębie jednej maszyny fizycznej. Dzięki temu każda maszyna wirtualna działa niezależnie od innych i nie ingeruje w swojego hosta. Zwiększa to znacząco bezpieczeństwo całego rozwiązania, gdyż ewentualny atak na konkretną maszynę wirtualną nie poskutkuje atakiem na cały serwer fizyczny. Oczywiście wirtualizacja to dużo szersze zagadnienie, ale na potrzeby tego artykułu ta wiedza Ci wystarczy.

Przydatne narzędzia

Najpopularniejszym narzędziem przy wdrożeniach z wykorzystaniem wirtualizacji jest Vagrant. Pozwala on na stworzenie wirtualnej maszyny, na której następnie zainstalujemy aplikację.

Z pomocą pliku: Vagrantfile możemy zainstalować wszystkie biblioteki wymagane przez naszą aplikację, wskazać gdzie znajduje się kod aplikacji lub zainstalować ją z zewnętrznego źródła. Takie działanie pozwala nam uruchamiać tworzony system zawsze w tych samych warunkach, dzięki czemu unikniemy typowej sytuacji w IT: „U mnie działa!”. ;) Przynajmniej nie z powodu różnic w konfiguracji serwera, ponieważ wszystkie środowiska i wszyscy programiści pracują na identycznej maszynie.

Jeśli nie mamy możliwości uruchomienia wirtualizacji na naszym serwerze albo nie przypadła nam ona do gustu, możemy zainteresować się Dockerem i konteneryzacją. Jest to nic innego jak zamknięcie tworzonego systemu wraz ze wszystkimi bibliotekami w jedną paczkę zwaną kontenerem.

Być może zastanawiasz się, czym w takim razie różni się konteneryzacja od wirtualizacji? Otóż z punktu widzenia aplikacji, kontenery są odrębnymi i niezależnymi od siebie środowiskami. Mimo wszystko kontener nie symuluje w 100% systemu operacyjnego. Bez wprowadzenia odpowiednich uprawnień, haker może przedostać się z kontenera do hosta i narobić sporego zamieszania. Pomimo tych niedoskonałości, według mnie Docker jest w ostatnich latach wykorzystywany dużo częściej, niż Vagrant.

Automatyzacja procesu

W mojej pracy najczęściej spotykam się właśnie z trzema omówionymi powyżej sposobami wdrażania aplikacji. Niezależnie od wybranego sposobu, warto wersjonować aplikację, a wszystkie wersje gotowe do wdrożenia „wrzucać” do repozytorium artefaktów, czyli paczki z naszą aplikacją.

W zależności od wybranego sposobu artefaktami będą zupełnie inne obiekty. Dla FTP i SSH są to pliki lub spakowane pliki, a dla Dockera lub Vagranta są to obrazy.

Bez względu na wybrany proces wdrożenia, warto by był on zautomatyzowany. To działanie ma nawet swoją nazwę: Continuous Deployment (CD), czyli ciągłe wdrożenia.

Założenie jest proste — wdrożenia są realizowane szybko i często. W tym celu wykorzystywane są zewnętrzne narzędzia, takie jak Jenkins czy Travis-CI lub Pipeline wbudowane w repozytorium kodu, np. GitLab. Osobiście korzystam głównie z tego ostatniego rozwiązania, jednak zasada działania we wszystkich jest podobna.

Oczywiście poszczególne kroki będą się różniły, bo czym innym jest skopiowanie plików, a czym innym wdrożenie obrazu aplikacji, jednak wszystkie sprowadzają się do tego, że jeśli wprowadzono jakieś zmiany w kodzie, aplikacja powinna zostać zbudowana i wrzucona na serwer.

Elastic beanstalk, czyli ułatwienie od aws

Wszystkie powyższe operacje wymagają od nas wiedzy z zakresu administracji i podstaw linii komend. W małych projektach z ograniczonym budżetem zatrudnienie osoby dedykowanej do tego zadania może być trudne, a obecni członkowie zespołu niekoniecznie muszą się fascynować tym procesem. Tym bardziej że nieodpowiednia konfiguracja może być źródłem niepotrzebnych problemów.

aws-beanstalk żródło: https://aws.amazon.com/elasticbeanstalk/

W takim przypadku z pomocą przychodzi Elastic Beanstalk od AWS. Jest to usługa wdrażania i skalowania aplikacji internetowych. Wystarczy, że prześlesz swój kod, a narzędzie automatycznie zajmie się jego wdrożeniem, rozpoczynając od utworzenia serwera, poprzez równoważenie obciążenia i automatyczne skalowanie, aż po monitorowanie stanu aplikacji.

Oczywiście nie zaszkodzi tutaj podstawowa wiedza z zakresu AWS, choćby po to, żeby uniknąć wysokich rachunków, natomiast jej zdobycie jest na wyciągnięcie ręki. Wystarczy zapoznać się z dokumentacją AWS Elastic Beanstalk dostępną tutaj:

https://aws.amazon.com/elasticbeanstalk

Rozwiązanie to zdobywa coraz większą popularność, bo ściąga z programistów znaczną część pracy przy wdrażaniu aplikacji, np. przy konfigurowaniu procesu automatycznej aktualizacji.

Mam nadzieję, że ten artykuł pomógł Ci znacznie lepiej zrozumieć, czym jest wdrożenie aplikacji na produkcję. Jeśli masz jakieś pytania, pisz do nas! Chętnie odpowiemy.

Grzegorz Kielar

Grzegorz Kielar

Architekt możliwości

W Kielni Kodu dbam o to, żeby proponowane rozwiązania i technologie były dobrane do potrzeb i budżetu klienta. Poza zarządzaniem firmą i kontaktem z klientami odpowiadam za backend oprogramowania, kwestie związane z serwerami i usługami chmurowymi. Innymi słowy, robię wszystko to, czego nikt nie widzi i nie wie, dlaczego działa, ale działa :)

Prywatnie fotograf amator, mąż i właściciel psa Eliota.