Każdy kiedyś zaczynał... wprowadzenie

DevOps sie 28, 2020

Jakimś cudem udało Ci się znaleźć tą stronę w otchłani Internetu,  myślisz sobie "Ehhh kolejny zapychacz, który marnuje domenę na swoje wymysły, nie wnosząc nic nowego". Być może Cię zaskoczę, ale nie mam zamiaru mówić Ci w jaki sposób powinieneś się uczyć, szukać motywacji czy robić cokolwiek.  

Co tutaj znajdziesz?

Ten blog to poniekąd dziennik pokładowy, który powstał by monitorować własny proces nauki i rozwoju. Możesz być pewien, że nie znajdziesz tutaj poradników "krok po kroku", możesz za to spodziewać się relacji z problemów, jakie napotkałem podczas konfiguracji, pisania skryptów, automatyzacji i wielu innych.

Na pierwszy ogień rzucam platformę Ghost, na której właśnie powstał ten blog. Jako, że jestem sympatykiem Ansible, chciałem postawić blog z jego wykorzystaniem. Po pierwsze, aby odświeżyć trochę wiedzę po kilkumiesięcznej przerwie z tym narzędziem. Po drugie, chcę zakosztować paradygmatu "Immutable Infrastructure", nie będę jednak tłumaczyć tego zagadnienia, podlinkowałem definicję do odpowiedniego artykułu (chętnych zapraszam do przeczytania). Krótko mówiąc, syzyfową pracą byłoby kasowanie środowiska i stawianie go na nowo, manualnie.

Pierwsza konfiguracja

Konfiguracja na pierwszy rzut oka jest prosta, a wręcz prowadzi usera za rękę, więc nie trzeba być wcale "informatykiem", żeby postawić platformę Ghost na własnym serwerze. Mój pierwszy problem zrodził się po prostu z niewiedzy i braku doświadczenia z MySQL.

Podczas instalacji tego silnika bazodanowego, dodawany jest user root bez zabezpieczenia hasłem. Ghost do konfiguracji potrzebuje dostępu do root, który ma nadane hasło - po co? Otóż Ghost na podstawie podanych credentials dodaje nowego usera do MySQL który będzie operował na bazie danych z uprawnieniami tylko takimi, jakich potrzebuje. Można podać do konfiguracji innego, wcześniej stworzonego MySQL usera, ale nie znam konkretnych uprawnień jakich wymaga Ghost, a nie chce zaśmiecać skrzynki ani forów developerów :)

Co tak naprawdę przeszkodziło mi w konfiguracji?

Tuż przed rozpoczęciem konfiguracji zmieniłem hasło dla root'a. Sprawdzam poprzez CLI czy się loguje - no loguje! Super, czas na konfigurację Ghost! Uzupełniam domenę, uzupełniam host na którym mam SQL - dostaję cudowny zielony znaczek ✔. Przychodzi etap podania loginu i hasła do MySQL - wpisuje dane i potwierdzam, że chcę aby Ghost sam stworzył dla siebie odpowiedniego usera w MySQL i zonk - czerwony X...

Hmmm, myślę sobie lecimy dalej, oszukuję się, że wyświetlił się przez pomyłkę, a dalej wszystko będzie działać - ostatni etap z pytaniem "Czy uruchomić Ghost?" - no oczywiście! Chyba, nie muszę mówić, że aplikacja nie wystartowała, ale za to zwróciła piękny log błędu - "Message: Error trying to connect to the MySQL database.". No za jakie grzechy?!

Wpadam na terminal, loguję się userem root do serwera SQL - no działa. No to idę dalej, tworzę sobie nowego usera - działa... Tworzę nową bazę danych - działa! "Halo Hjuston mamy problem :(". Pierwsza myśl jaka mi wpadła, to że może niepoprawną komendą zmieniłem hasło - wcześniej wpadło mi w oczy, że do różnych wersji MySQL, Papa StackOverFlow zalecał inne komendy.

No to do roboty, drop VPS, zmiana w playbooku Ansible komendy na modyfikację hasła dla root - VPS wstał? Wstał! No to zapuszczamy. Myk myk, Ansible szybko zrobił takie środowisko jakiego potrzebowałem, zapuszczam konfigurację, uzupełniam dane myk myk... czerwony X. Hmm... I co teraz?

W logu ta sama informacja o tym, że nie można dobić się do głównej bazy MySQL'a... Google > "Change password for root user MySQL" - czytam od deski do deski pierwszy z artykułów - hmmm a co to za komenda "flush privileges". Komenda dodana do playbooka, VPS ubity i postawiony na nowo, Ansible zrobił swoje i konfigurujemy - dane wpisane i... ✔ :) Tego oczekiwałem! Z tego co rozumiem, ta komenda działa jako takie odświeżenie uprawnień - pewnie wystarczyło by po prostu zrestartować MySQL po zmianie hasła, ale nawet wtedy o tym nie myślałem - no cóż, ważne, że działa :)

Jeżeli myślisz, że to wszystko co mnie zatrzymało, to jesteś w błędzie. Nie chciałem wcześniej wspominać, ale podczas konfiguracji pojawił się jeszcze jeden przeklęty X, otóż chodziło o wygenerowanie certyfikatu SSL i podpięcie go do Ghost. O ile w przypadku problemu z logowaniem MySQL nic mi nie przychodziło do głowy, o tyle tutaj podejrzewałem sprawcę z miejsca - mój playbook napisany w Ansible składał się z kilku etapów konfiguracji.

Poza instalacją samego Ghost, chciałem zarazem trochę zabezpieczyć VPS - zmiana portu SSH, wyłączenie możliwości autoryzacji poprzez hasło itp. Nie zapomniałem również o uruchomieniu firewall Ufw - pomyślałem o dodaniu do reguł SSH, samego serwera webowego Nginx, którego wymagał Ghost, ale zupełnie nie pomyślałem o Let's Encrypt, na którym Ghost generuje certyfikat SSL i podpina go pod stronę. Papa StackOverFlow powiedział, że trzeba odblokować porty 80 i 443 na protokole TCP - po dodaniu ich do reguł, cała konfiguracja Ghost wreszcie przebiegła poprawnie.

Co dalej?

W najbliższych dniach chcę odświeżyć wiedzę z Docker oraz postawić kilka aplikacji na innych VPS. Będzie to Jenkins pod CI/CD, Prometheus pod monitoring moich aplikacji i serwerów VPS oraz PostHog - aplikacja, która analizuje co słychać na stronie internetowej i jakie podstrony są najczęściej odwiedzane. Mam zamiar podpiąć ją pod tego bloga, żeby zobaczyć, kiedy jakaś zbłąkana duszyczka pojawi się w mych skromnych progach :) Mam nadzieję, że nie obejdzie się bez żadnych problemów. Brzmi to dziwnie, ale dzięki temu można nauczyć się czegoś więcej poza konfiguracją danych aplikacji, a ja przy okazji będę miał co opisać w kolejnym poście. Do następnego!

Tagi

Bartłomiej Komendarczuk

Newbie DevOps :)

Great! You've successfully subscribed.
Great! Next, complete checkout for full access.
Welcome back! You've successfully signed in.
Success! Your account is fully activated, you now have access to all content.