2022-08-16-07-08-46-rozwiazywanie-problemow-z-laravelem-w-systemie-debian.png

Rozwiązywanie problemów z Laravelem w systemie Debian

Problemy z jakimi się spotkałem w trakcie uruchomienia aplikacji Laravel w systemie Debian 11 Bullseye.

Nasz blog może się rozwijać dzięki naszym sponsorom. Nasz kurs dockera powstał dzięki współpracy z chmurami Vultr i tam dokładnie został przetestowany. Nasz szablon pochodzi z Envato MarketPlace. Wszystkie pluginy i elementy stron internetowych, jakie opisujemy, pochodzą z Envato Elements. Wszystkie książki, opisane na tym blogu, są dostepne u wydawcy Helion. Jesteśmy także partnerem Respondent.io, platformy, która płaci za testowanie aplikacji.

Każdy ze swoich dotychczasowych artykułów w których opisywałem sposoby instalacji lub konfiguracji aplikacji były opracowywane z wykorzystaniem systemu Debian. Niejednokrotnie wspominałem, że wymieniony system jest moim ulubionym z którego korzystam na co dzień. Ze względu na zmianę dotychczasowej pracy zmienił się zakres moich obowiązków który w bardzo dużym stopniu ma związek z używanym systemem operacyjnym, a bardziej z wersjami oprogramowania zawartymi w repozytoriach systemowych.

Niektórzy z was znają ten system i wiedzą, że szczególnie w wersji stabilnej oprogramowanie w repozytorium bywa stare. Przyczyną tego jest oczywiście wspomniana stabilność. Taka polityka została przyjęta i nie będę opisywał ją w negatywny sposób ponieważ ma swoje bardzo ogromne plusy.

Niestety w swojej pracy napotykam ogromne minusy takiego podejścia i z przykrością muszę stwierdzić, że system Debian w wersji stabilnej może dołożyć sporo dodatkowej pracy jeżeli musimy na przykład testować aplikację z wykorzystaniem najnowszych wersji oprogramowania.

W związku z wymienionymi problemami rozpocząłem swoje poszukiwania nowego systemu operacyjnego opartego o dystrybucje Linuksowe. I do moich faworytów w obecnej chwili należy Fedora oraz OpenSuse. Natomiast dystrybucje które odrzucam to Ubuntu, Linux Mint i wspomniany już Debian choć wiem o różnych wersjach tego systemu tj Stable, Testing i Etch. W związku z powyższym mam prośbę, jeżeli dysponujesz chwilą i możesz napisać dlaczego właśnie któryś z dwóch wymienionych powinienem wybrać lub masz jeszcze inną propozycję będę wdzięczny. Zależy mi jak pewnie każdemu na niezawodności, ale tego przy nowym oprogramowaniu nie uda się osiągnąć. Repozytorium powinno być odpowiednio obszerne ponieważ instalacja z tak zwanych paczek wymaga ręcznych aktualizacji, czy też dodawanie co rusz nowego repozytorium wymaga częstych ingerencji co zabiera ten cenny czas.

Niemniej jednak to, że coś wymaga dodatkowego nakładu czasu wcale nie oznacza, że jest nie do wykonania. Dlatego w dalszej części artykułu pokażę w jaki sposób zainstalować PHP w wersji 8+ i uruchomić oraz ustawić aplikację Laravel z wykorzystaniem kontenerów Dockera.

Instalacja PHP

Pierwszą czynnością jaką należy wykonać jest instalacja php w wersji 8+. W standardowym repozytorium debiana znajduje się wersja 7.4 w związku z tym musimy dodać repozytorium zawierające wyższą wersję. Robimy to w następujący sposób:

sudo apt update && sudo apt dist-upgrade
sudo apt install ca-certificates apt-transport-https software-properties-common
echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/sury-php.list
wget -qO - https://packages.sury.org/php/apt.gpg | sudo apt-key add -
sudo apt update
sudo apt install php
sudo apt dist-upgrade

Na dzień 13.08.2022 r wersja php która instaluje się w ten sposób to:

php -v
PHP 8.1.8 

Jeżeli miałeś zainstalowaną wersję wcześniejszą to po dodaniu repozytorium powinno wystarczyć wpisać:

sudo apt update && sudo apt dist-upgrade

Repozytorium posiada jeszcze inne wersje dlatego jeżeli potrzebujesz konkretnej to wystarczy że zmodyfikujesz polecenie w poniższy sposób: sudo apt install php

W moim przypadku określono mi wersję PHP 8 lub wyższą dlatego przeprowadziłem najprostszy sposób instalacji.

Aplikacja Laravel

Aplikacja z której będę korzystał znajduje się w folderze app. Jest ona skonstruowana przy pomocy frameworka Laravel i chcę aby wszystko zostało uruchomione w kontenerach dockerowskich.

Laravel Sail

W celu ułatwienia tego zadania skorzystam z narzędzia zwanego Laravel Sail. O samym Sail pisałem już artykuł który znajduje się pod adresem https://silencedevs.com/blog/wpis/laravel-i-docker-srodowisko-programistyczne-sail, dlatego jeżeli chcesz bardziej zapoznać się z tym tematem zajrzyj pod wskazany link.

Composer

Jak ustaliliśmy, pracujemy na istniejącej i działającej aplikacji. My musimy ją uruchomić i do tego użyjemy saila. W tym celu musimy dodać go do projektu co robimy przy pomocy polecenia:

composer require laravel/sail --dev

Rozwiązanie problemów powstałych w composerze

W tym miejscu pojawiły się pierwsze problemy które u mnie wyglądały następująco:

Problem 1
- laravel/dusk is locked to version v6.25.1 and an update of this package was not requested.
- laravel/dusk v6.25.1 requires ext-zip * -> it is missing from your system. Install or enable PHP's zip extension.
Problem 2
- moneyphp/money v4.0.4 requires ext-bcmath * -> it is missing from your system. Install or enable PHP's bcmath extension.
- laravel/cashier v13.14.0 requires moneyphp/money ^3.2|^4.0 -> satisfiable by moneyphp/money[v4.0.4].
- laravel/cashier is locked to version v13.14.0 and an update of this package was not requested.

Po analizie otrzymanego błędu widać, że brakuje „jakiś pakietów”. Przyglądając się pierwszemu:

laravel/dusk v6.25.1 requires ext-zip

Brakuje czegoś co nazywa się ext-zip. Zakładając, że nie wiem czym dany pakiet jest, a wskazanego nie ma w repozytorium skorzystałem z wyszukiwarki google gdzie na jednej ze stron odnalazłem informację o niezainstalowanym pakiecie:

sudo apt install php-zip

Analizując drugi problem oraz wiedząc jak rozwiązany został pierwszy przystąpiłem od razu do instalacji brakującego pakietu:

sudo apt install php-bcmath

Po zainstalowaniu wskazanego w poprzednich dwóch przykładach oprogramowania możemy ponownie przystąpić do instalacji:

composer require laravel/sail --dev

Artisan

Tym razem wszystko powinno zakończyć się powodzeniem i jako wynik otrzymamy:

php artisan sail:install
Which services would you like to install? [mysql]:
  [0] mysql
  [1] pgsql
  [2] mariadb
  [3] redis
  [4] memcached
  [5] meilisearch
  [6] minio
  [7] mailhog
  [8] selenium
 > 1

Przy próbie wybrania któregokolwiek z serwisów bazy danych możemy otrzymać błąd:

 ErrorException 

  file_get_contents(/home/darki/app/.env): Failed to open stream: No such file or directory

  at vendor/laravel/sail/src/Console/InstallCommand.php:126
    122▕      * @return void
    123▕      */
    124▕     protected function replaceEnvVariables(array $services)
    125▕     {
  ➜ 126▕         $environment = file_get_contents($this->laravel->basePath('.env'));
    127▕ 
    128▕         if (in_array('pgsql', $services)) {
    129▕             $environment = str_replace('DB_CONNECTION=mysql', "DB_CONNECTION=pgsql", $environment);
    130▕             $environment = str_replace('DB_HOST=127.0.0.1', "DB_HOST=pgsql", $environment);

      +15 vendor frames 
  16  artisan:37
      Illuminate\Foundation\Console\Kernel::handle()
Bardzo ważna informacja znajduje się w linii:
file_get_contents(/home/darki/app/.env): Failed to open stream: No such file or directory

Oznacza ona, że nie odnaleziono pliku .env w którym znajduje się podstawowa konfiguracja aplikacji. Ten błąd nie zawsze wystąpi ponieważ przyznam, że większość aplikacji posiada taki plik wygenerowany. Natomiast gdy spotkasz się z powyższą sytuacją to warto sprawdzić czy w zasobach aplikacji nie masz pliku o nazwie .env.example:

ls .env.example 
.env.example

Jeżeli taki plik się znajduje to wystarczy, że zmienisz jego nazwę na plik noszący nazwę .env. Robimy to przy pomocy polecenia:

cp .env.example .env

Na razie nie ingerujmy w jego zawartość tylko uruchommy poprzednie polecenie:

php artisan sail:install

Tym razem otrzymałem informację:

Sail scaffolding installed successfully.

Najłatwiejszy sposób na bazę danych

Teraz chciałbym pokazać pewne ułatwienie które może zaoszczędzić czas, a mianowicie będziemy korzystali z bazy danych sqlite gdzie wszystkie dane przesyłane będą do pliku który stworzymy. Dlatego w katalogu databases stwórzmy plik jak w poniższym przykładzie:

touch database/database.sqlite

Pamiętaj, że prezentowany sposób powinien być wykorzystany jedynie do testów!

Następnie edytujemy plik .env i modyfikujemy naszą bazę danych:

DB_CONNECTION=sqlite
#DB_HOST=pgsql
#DB_PORT=5432
#DB_DATABASE=laravel
#DB_USERNAME=sail
#DB_PASSWORD=password

Czyli odznaczamy (hash #) wszystkie opcje w ustawieniach bazy danych, pozostawiając tylko nazwę którą ustawiamy na sqlite, czyli na plik który stworzyliśmy w poprzednim przykładzie. Chcemy skorzystać z sqlite, ale najprawdopodobniej nie zainstalowaliśmy obsługi tego typu bazy przez php dlatego zróbmy to teraz:

sudo apt install php-sqlite3

Następnie musimy przeprowadzić migrację danych aplikacji do naszej bazy danych:

php artisan migrate

Port 80

Teoretycznie mamy wszystko przygotowane, ale jeżeli masz zainstalowany oraz uruchomiony serwer apache2 to port 80 jest przez niego zajęty. Moja apka korzysta z tego portu w związku z tym nie udało mi się jej uruchomić ponieważ powstał logiczny konflikt, port jest już używany. W tej sytuacji masz do wyboru albo wybrać inny port dla aplikacji, albo wyłączyć serwis apache2 przy pomocy polecenia:

sudo service apache2 stop

Uruchomienie aplikacji z wykorzystaniem dockera

Po wykonaniu powyższych kroków spróbujmy stworzyć odpowiednie kontenery oraz uruchomić naszą aplikację:

./vendor/bin/sail up

Wszystko powinno się udać tylko framework Laravel wymaga jeszcze klucza api. Po wejściu na stronę localhost pojawi się button lub link do wygenerowania takiego po czym nasza aplikacja powinna już działać.

Podsumowanie

Z mojej strony chciałbym dodać, że artisan nie jest idealny i czasami potrafi się zwiesić dlatego warto powtórzyć niektóre czynności z nim związane jeżeli wydaje się, że wszystko zrobiliśmy prawidłowo. Pamiętaj jeszcze, że istnieje magiczny przycisk zwany wyczyść dane przeglądarki który przy uruchamianiu, testowaniu czy też modyfikacji aplikacji jest niezbędny.

Aplikacji jest dużo i uruchamianie każdej różni się od siebie. Zadanie jakie sobie postawiłem pisząc ten artykuł to zwrócenie uwagi na najprostsze sposoby rozwiązania problemów jakie mogą się pojawić. Jeżeli przeczytałeś ten artykuł w całości to zwróciłeś pewnie uwagę, że najczęstszym pojawiającym się błędem jest brak zainstalowanej paczki oprogramowania.

Udostępnij

Porozmawiajmy o Twoich potrzebach

POROZMAWIAJMY O USŁUGACH, JAKICH POTRZEBUJESZ DLA SWOJEGO BIZNESU

Z chęcia pomożemy Ci wzrastać w wybranym przez Ciebie biznesie.