Deploy aplikacji Javowej na serwer - jak to zrobić profesjonalnie

Deploy aplikacji Javowej na serwer - jak to zrobić profesjonalnie
J1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 25
0

Cześć,
mamy aplikację w Javie i serwer Linuxowy do którego jest dostęp przez ssh. Obecnie deploy polega na skopiowaniu aplikacji na docelowy host oraz uruchomienia aplikacji poprzez ssh.
Problem zaczyna się wtedy np. gdy chcemy zatrzymać aplikację itd. Ktoś musi znać PID tego procesu (jasne, że można robić pgrep, ale nie o to chodzi tutaj). Pytanie brzmi, jak robić taki deploy "state of the art"? Są na pewno dwie opcje:

  1. jako kontener docker - odpada
  2. jako usługa systemowa - odpada bo trzeba sudo
Riddle
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10227
2

Moja rada - nie próbuj robić "state of the art", tylko zacznij najprościej.

Ja bym podniósł aplikację, zapisał pid do pliku i tyle.

Kopiuj
java -jar app.jar &
echo $! > app.pid
Kopiuj
kill $(cat app.pid)

Jeśli będziesz miał jakieś konkretne problemy z tym podejściem, to wtedy będzie się można zastanowić konkretnie jak je rozwiązać, mając konkretny use-case.

marian pazdzioch
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 789
0
johnny12 napisał(a):

ale nie o to chodzi tutaj

A o co chodzi?

SL
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1023
0

Czemu nie rootless docker lub jakaś alternatywa korzystająca z tego samego rodzaju kontenerów? State of the art to zdecydowanie kontenery, bo wszyscy ich używają. Alternatywnie możesz spróbować systemd tylko to niepotrzebny narzut na naukę.

YA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2384
5
johnny12 napisał(a):

Cześć,
mamy aplikację w Javie i serwer Linuxowy do którego jest dostęp przez ssh. Obecnie deploy polega na skopiowaniu aplikacji na docelowy host oraz uruchomienia aplikacji poprzez ssh.
Problem zaczyna się wtedy np. gdy chcemy zatrzymać aplikację itd. Ktoś musi znać PID tego procesu (jasne, że można robić pgrep, ale nie o to chodzi tutaj). Pytanie brzmi, jak robić taki deploy "state of the art"? Są na pewno dwie opcje:

  1. jako kontener docker - odpada
  2. jako usługa systemowa - odpada bo trzeba sudo
Kopiuj
alias stopGracefully='kill -15 $(pidof java)'
alias stopHard='kill -9 $(pidof java)'

Co do sudo, to wiesz, że można tak skonfigurować sudo, że masz passwordless sudo magicCommand i sudo działa tylko dla tej wybranej komendy?
Zakładając, że masz użytkownika bolek, to jednorazowo robisz: sudo visudo i wskazujesz co może zrobić (np. systemctl start|stop|status|restart <wybranaUsluga>)

Kopiuj
bolek ALL=(ALL) NOPASSWD: /bin/systemctl start mojaUsluga, /bin/systemctl stop mojaUsluga, /bin/systemctl status mojaUsluga, /bin/systemctl restart mojaUsluga

Do tego definiujesz usługę systemową i powinno śmigać.

superdurszlak
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Kraków
  • Postów: 2002
0
johnny12 napisał(a):

Cześć,
mamy aplikację w Javie i serwer Linuxowy do którego jest dostęp przez ssh. Obecnie deploy polega na skopiowaniu aplikacji na docelowy host oraz uruchomienia aplikacji poprzez ssh.
Problem zaczyna się wtedy np. gdy chcemy zatrzymać aplikację itd. Ktoś musi znać PID tego procesu (jasne, że można robić pgrep, ale nie o to chodzi tutaj).
Pytanie brzmi, jak robić taki deploy "state of the art"?

Ja to bym zaczął od niewchodzenia z ręki na serwery żeby coś uruchamiać i ubijać, bo ani to state-of-the-art, ani najprościej - ręce sobie urobisz, łatwo o pomyłkę, jak ktoś napsuje to trudno zreprodukować i odgadnąć co się wydarzyło bez grzebania w logach systemowych i szukania winnego.

Od deploymentu na serwer powinien być system CI/CD, a nie człowiek. Człowiek może zapomnieć przetestować i wrzucić popsutą wersję, pomylić coś pod presją czasu, a może też wkurzyć się na firmę i celowo napsuć.

Są na pewno dwie opcje:

Odrzucasz z marszu dwie najbardziej normalne opcje 🙃

  1. jako kontener docker - odpada

A byłoby spoko, bo mógłbyś prosto podnosić i ubijać aplikację w umiarkowanie izolowanym środowisku. Dlaczego docker odpada?

  1. jako usługa systemowa - odpada bo trzeba sudo

To by była najprostsza opcja bez dockera i innych wodotrysków, by postawić serwer jako usługę która ma sama wstawać, restartować się i ewentualnie być wyłączana.

Opcji na obejście trzeba sudo masz kilka:

  • Możesz stworzyć sobie service account będący właścicielem tej usługi, i z jego poziomu nią zarządzać, mniej więcej: $ systemctl start --user <service>.service
  • Dałoby się poczarować grupami i daniem uprawnień grupie do zarządzania usługą poprzez plik sudoers: https://unix.stackexchange.com/a/736119

Chyba najlepiej byłoby mieć faktycznie taki service account ew. z przydzieloną grupą (by ograniczyć mu uprawnienia do minimum) ale nie dawać ludziom wjazdu, by korzystali z niego bezpośrednio, tylko poprzez deployment job w CI/CD odpowiedzialny za wrzucanie nowej wersji aplikacji. Ewentualnie wyłączenie jej, jeśli to potrzebne.

piotrpo
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3303
0
slsy napisał(a):

Czemu nie rootless docker lub jakaś alternatywa korzystająca z tego samego rodzaju kontenerów? State of the art to zdecydowanie kontenery, bo wszyscy ich używają. Alternatywnie możesz spróbować systemd tylko to niepotrzebny narzut na naukę.

Dobra odpowiedź ze złym uzasadnieniem. To nie "Bo tak robią wszyscy" nie jest powodem, dla którego warto używać kontenerów. Oczywiście wyjaśnienie dlaczego tak jest lepiej, to już pod magisterkę podchodzi, jak nie doktorat, a nie post na forum.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.