Adatbázis hozzáférés 4. B rész - Felköltözés a felhőbe - Laravel 9

Attila | 2022. 03. 15. 16:28 | Olvasási idő: 4 perc

Címkék: #Apache #Azure #Cloud #git #Laravel #Laravel 9 #Nginx #PHP #Publikálás (Deployment) #Telepítés (Installation)

Visszatérek a felhőbe. Mégpedig azért, mert elég nagy változások történtek a legutóbbi látogatásom óta, pedig nem is volt régen... Kijött a Laravel 9, ami olyan változásokat hozott el, amelyek alapvetően változtatták meg a felhőbe való költözés körülményeit. Gondolok itt elsősorban a legalább PHP 8-as verziószámú fordítóra és a megváltozott webszerverre (Apache --> Nginx). De nem rohanok előre, bemutatok mindent lépésről lépésre.
Laravel-v9-Azure

Kiindulás

A kiindulási pont egy friss, üres 9-es verziószámú Laravel alkalmazás létrehozása (ennek a telepítését nem részletezném, mert már néhányszor megcsináltuk). Ami viszont fontos, hogy érjük el a v9-es alkalmazásban is azt az állapotot, ami megvolt eszerint a blogbejegyzés szerint: Adatbázis hozzáférés 3. rész - Kapcsolódás a felhőhöz Az eredmény itt az volt, hogy a lokálisan működő alkalmazásunk képes volt hozzáférni a felhőben lévő adatbázishoz. Legyenek meg tehát a következő dolgok (rövid checklist, hogy ne felejtsünk ki semmit):

  1. Saját erőforráscsoport (Resource Group)
  2. Saját flexibilis MySQL szerver
  3. Tűzfalbeállítások
  4. Kapcsolódás tesztelése a flexibilis MySQL szerverünkhöz (MySQL Console-lal)
  5. Tesztadatbázis létrehozása a távoli flexibilis MySQL szerveren
  6. Új .env.production fájl létrehozása a projektünk gyökerébe az .env alapján
  7. Az .env.production fontos paraméterértékeinek módosítása (APP_ENV, DB_ kezdetűek és a MYSQL_SSL)
  8. Tanúsítvány (certification) letöltése a projektünk gyökerében lévő ssl mappába
  9. Projektünkben lévő config / database.php mysql driver-ének módosítása
  10. php artisan parancsok futtatása
    1. key:generate --env=production
    2. migrate --env=production
    3. a helyi teszteléshez a serve --env=production

Ezen felül még egyetlen dolgot csináljunk meg, mert nem biztos, hogy az alkalmazás futtatásához szükség van az adatbázis elérésre (nincs is!), és talán emiatt azt is gondolhatjuk, hogy működik minden, miközben hiba van a háttérben... Ezért szúrjunk be egy sort a routes/web.php -ban lévő új útvonal (dbtest) regisztrációjához (plusz felül importáljuk a DB-t), amivel ellenőrizzük a csatlakozást:

use Illuminate\Support\Facades\DB;
...
Route::get('/dbtest', function () {
  $migrations = DB::select('select * from migrations');

  foreach ($migrations as $m) {
    echo nl2br($m->migration . "\n");
  }
});


Ha behozzuk az új "dbtest" útvonalunkat, akkor a következőt kell látnunk a böngészőben:

Ha ezeket elvégeztük, akkor futnia kell lokálisan a friss, felhős adatbázishoz kapcsolódó Laravel 9-es alkalmazásunknak. Ha valami nem menne, akkor érdemes újra ellenőrizni a fenti checklist-en lévő dolgokat.


Dolgok, amik nem változtak...

Vannak olyan elemek, amik nem változtak a Laravel 8-as alkalmazás publikálási folyamata óta, de mivel szeretném, hogy itt minden egyben meglegyen, ezért ezeket is itt fel fogom sorolni.

"App Service Plan" (Alkalmazás szolgáltatási terv) létrehozása

Most több utasítást is végrehajtunk az Azure Shell segítségével, a korábbi bejegyzésben megmutattam, hogy hogyan kell megnyitni az Azure Portal-on a Shell terminal-t.

az appservice plan create --name myAppServicePlan --resource-group GA_RG --sku F1 --is-linux

Az én "App Service Plan"-em neve myAppServicePlan lett, de ahogy korábban is hangsúlyoztam, ezek szabadon változtathatók, arra viszont figyeljünk, hogy utána ugyanazt használjuk, amit itt definiáltunk. Én továbbra is a GA_RG Resource Group-omat használom, "amibe pakolom a szolgáltatásokat". Az --sku az árazásra vonatkozik, az F1 pedig azt mutatja, hogy ingyenes lesz a használata ("Fun fact": az Azure Portál webes felületén nem lehet kiválasztani az ingyenes verziót, csak a fizetőset. Viszont a Shell-ben működik az ingyenes megadása). Az --is-linux kapcsolóval tudjuk Linux alapú konténerben működtetni majd az alkalmazásunkat. Később ez kisebb problémával fog járni, vagyis hogy nehezebben tudunk fejlesztői szolgáltatásokat igénybe venni, nem csak néhány kattintással, de az ingyenességnek "ez az ára". Ahogy már említettem, a terminal mindig vissza fog jelezni nekünk, remélhetőleg a pozitív eredményről adott JSON válasszal, vagy pedig valamilyen beszédes hibaüzenettel, amelyet majd meg kell oldanunk. Ha hibát kapunk, akkor további információ az "App Service Plan" létrehozásának mikéntjéről, parancshoz tartozó paramétereiről itt olvasható: https://docs.microsoft.com/en-us/cli/azure/appservice/plan#az_appservice_plan_create

"Deployment User" (Telepítési felhasználó) létrehozása

Ugyanúgy az Azure Portal-on belüli Shell terminal-t használjuk:

az webapp deployment user set --user-name gludovatza --password BBBbbb1234

Itt a --user-name és a --password kapcsolók utáni érték beállítások nyilván az én értékeim ismét. Ha hibát kapunk (Conflict), akkor a Password kulcshoz nem lesz értékünk, és például 409-es hibakódot is kaphatunk, akkor próbáljuk meg módosítani a felhasználónevet a fenti parancsban. Vagy 400-as hibakódot is adhat a rendszer, ekkor próbáljunk meg erősebb jelszót megadni (legalább 8 karakteres és legyen benne kisbetű, nagybetű, szám is, mindegyikből legalább 2).


Dolgok, amik változtak...

"Web App" (Webes alkalmazás - helyének) létrehozása

Itt is az Azure Shell-t fogjuk használni. Most hozzuk létre konkrétan a webes alkalmazásunkat ezzel az utasítással:

az webapp create --resource-group GA_RG --plan myAppServicePlan --name laravel-v9-azure --runtime "PHP|8.0" --deployment-local-git

A szokásos Resource Group-omat (GA_RG) itt is megadtam. A korábbi pontban létrehozott "terv"-re (plan) itt lesz szükségünk, adjuk meg neki a myAppServicePlan nevet. A --name kapcsoló után következik a webes alkalmazásunk neve, ez fontos, hogy valamilyen egyedi, eddig senki más által nem használt név legyen. A későbbiekben ezzel a névvel azonosítjuk az alkalmazásunkat és a felhős weboldal URL-jébe is ez kerül be. A --runtime (kvázi futtatókörnyezet) nálam a PHP 8.0-s verziója (a legfrissebb 2022. márciusában), mert ezt használom lokálisan is és tudom, hogy működik, illetve ez kell a Laravel 9-es verziójához. Az utolsó kapcsoló, --deployment-local-git is fontos, mert majd Git-et fogunk használni a lokális projektünk felhőbe való telepítésére.

A parancs kiadása után itt még fontosabb, hogy figyeljünk a JSON válaszra, ami az Azure-től érkezik, annak is konkrétan a deploymentLocalGitUrl kulcshoz tartozó értéket mentsük el. Ennek az értéknek a formája a következő minta szerint épül fel:

https://<username>@<app-name>.scm.azurewebsites.net/<app-name>.git


Adatbázis-elérés paramétereinek beállítása

Ugye ezek azok a paraméterek, amelyeket lokálisan az .env fájlunkban állítottunk be: DB_HOST, DB_DATABASE, DB_USERNAME, DB_PASSWORD és majd még néhány dolgot beállítunk. Ehhez a következő utasítást adjuk meg, természetesen figyeljetek arra, hogy nálatok mások lesznek ezek a paraméterek:

az webapp config appsettings set --name laravel-v9-azure --resource-group GA_RG --settings DB_HOST="server197968907.mysql.database.azure.com" DB_DATABASE="laravel_v9_db" DB_USERNAME="phpappuser" DB_PASSWORD="MySQLAzure2020" MYSQL_SSL="true"

A fenti utasításban a webes alkalmazást nevét az imént állítottuk be, azt kell itt is alkalmazni, a többi beállítás adja magát. Figyeljünk arra, hogy az érték oldalon (egyenlőség jeltől jobbra) idézőjelek közé kerüljön. Nyilván a sárgával jelzett részeket mindig le kell cserélni a saját alkalmazásunkban használtra, ezt sose feledjük...


Laravel 9 alkalmazás beállítása

Szükségünk van egy alkalmazás kulcsra (APP_KEY), de úgy, hogy ne kerüljön be a parancs futtatása után az .env fájlba:

php artisan key:generate --show

Amit eredményül adott kulcsot, azt a következő Azure-ös parancshoz fel kell használnunk:

az webapp config appsettings set --name laravel-v9-azure --resource-group GA_RG --settings APP_KEY="iménti-lekérdezés-eredménye" APP_DEBUG="true" SCM_DISABLE_BUSTER_KUDU="true"

Az APP_KEY utáni idézőjelek közé kell beilleszteni az iménti "key:generate"-es parancs eredményét. Az APP_DEBUG attribútum true-ra állítása kezdetben segíthet nekünk, ha problémák adódnak, akkor emiatt a beállítás miatt látni fogjuk a konkrét hibákat (exception-öket) a böngészőben. Ha majd hibamentesen fog menni az alkalmazásunk, akkor ezt a paramétert átállíthatjuk false-ra. Az SCM_DISABLE_BUSTER_KUDU attribútum pedig amiatt kell, hogy fel tudjuk majd tölteni Git segítségével a projektünket a távoli repository-ba.


Feltöltjük a Laravel projektünket a lokális repository-ból az Azure repository-jába

A lokális Laravel 9-es projektben (mondjuk a VSCode terminal-jában) kössük hozzá a projektet a git repository-hoz.

git init

Most van szükség a korábban elmentésre javasolt deploymentLocalGitUrl paraméterre:

git remote add azure https://gludovatza@laravel-v9-azure.scm.azurewebsites.net/laravel-v9-azure.git

Ellenőrizzük le, hogy melyik fejlesztési ágon (branch-en ) vagyunk:

git status

Ez valószínűleg master vagy main lesz. Attól függően, hogy master vagy main ágon vagyunk, adjuk ki a következő utasítást az Azure Portal Shell-jében (én a master ágon vagyok):

az webapp config appsettings set --name laravel-v9-azure --resource-group GA_RG --settings APP_URL="http://127.0.0.1:8000" DEPLOYMENT_BRANCH="master"

Adjuk hozzá a könyvtárakat és fájlokat a staging directory-hoz, majd a lokális repository-hoz:

git add .

git commit -m "First commit"

A felhőben lévő git repository használatához szükség van két fájlra, mindkettő a projektünk gyökerébe kerüljön be. Az első fájl neve: .deployment a tartalma pedig:

[config]
command = bash deploy.sh

A második fájl deploy.sh névre hallgat. Ez egy jóval hosszabb fájl, úgyhogy ezt külön megosztom itt (bejelentkezés nélkül letölthető). Amit érdemes erről tudni, az az, hogy ez alapján fog megtörténni a projekt könyvtárainak és fájljainak felhőbe való telepítése php, node, composer és npm utasítások segítségével.

Utána következhet a projekt feltöltése az Azure-be az iménti deploy.sh fájl alapján:

git push azure master

Ezzel egy hosszabb folyamat indul be, aminek a végén sikeresen feltöltődik a projekt az Azure-be. A folyamat legelején felugrik egy bejelentkezési kisablak, amiben ott van a korábban létrehozott "deployment user" neve és az ahhoz szükséges jelszót kell megadni, ami itt nálam a BBBbbb1234 volt.

Itt azonban sajnos még nem végeztünk, ugyanis a PHP 8-as verzióját használva, és Linux konténert működtetve a felhőben, az Azure átállt Apache webszerverről Nginx-re. Aminek "egy picit matatnunk kell" a beállításai között azért, hogy ténylegesen működésre tudjuk bírni a webalkalmazásunkat. Menjünk az Azure Portal-on keresztül az alkalmazásunkra, (nálam laravel-v9-azure névre hallgató) App Service-ünkre. Ott a menüben keressük ki a "Development Tools" (Fejlesztői eszközök) csoportban az SSH-t:

Az SSH-ban pedig a következő utasításokat, majd beállításokat kell elvégeznünk:

cp /etc/nginx/sites-enabled/default /home/default

Ezzel az utasítással lemásoltuk az Nginx webszerver beállítási fájlját a saját home könyvtárunkba default néven.

nano /home/default

Ezzel az utasítással megnyitjuk a nano nevű szövegszerkesztőt és ezt a lemásolt fájlt szerkeszthetjük. A megnyitott fájlban két beállítást kell módosítanunk (lásd még az alábbi képet segítségül): az 1. a root -os elérési út végére oda kell írnunk a wwwroot után a /public szöveget, hiszen a Laravel alkalmazás kiszolgálása a /public mappában indul el; 2. azért, hogy a routing (útvonalválasztás) is működjön az oldalunkon a "location / { ... }" részt is szerkesztenünk kell, adjuk hozzá ennek a magjához a következő sort:

try_files $uri $uri/ /index.php$is_args$args;

Az eredmény, amit látnunk kell, kiemelve a módosított részekkel, így néz ki:

CTRL + x -szel ki tudunk lépni a nano szövegszerkesztőből, és megkérdezi alul, hogy mentsük-e, nyomjunk y-t és egy ENTER-t.

A lemásolt fájlunk tehát már megvan, amiben átírtuk az Nginx webszerver beállításait, azonban ennek még nem lenne hatása a mi alkalmazásunk futására. Ezért most beállítjuk azt, hogy az újonnan szerkesztett fájl mindig felülírja a webszerver indulásakor az Nginx beállítási fájlját. Menjünk az Azure Portal-ra vissza és az App Service-ünk menüjében keressük ki a "Configuration" (Beállítások) menüpontot a beállítások közül, majd a jobb oldali részen válasszuk a második lapfület (General settings, Általános beállítások) és ott a Startup Command részbe írjuk be ezt az utasítást:

cp /home/default /etc/nginx/sites-enabled/default; service nginx restart

Ami gyakorlatilag az imént szerkesztett fájlt visszamásolja az alkalmazás induláskor mindig az Nginx beállításai helyére és újraindítja a webszervert az új beállításokkal. Ezután felül kattintsunk a Save (Mentés) gombra, hogy érvényre jussanak a beállítások.


Ennek következtében *elvileg* a folyamat végetért és következhet a weboldal megtekintése a böngészőben, ami itt elérhető az én alkalmazásom esetén: http://laravel-v9-azure.azurewebsites.net/

(jobb alul látható, hogy a Laravel verziója 9.4.1, a PHP verziója pedig 8.0.11)