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