Laravel alkalmazás telepítése a Heroku felhőrendszerébe

Gömböcz Zsolt | 2022. 03. 20. 22:04 | Olvasási idő: 3 perc

Címkék: #Adatbázis (Database) #Cloud #git #Heroku #Laravel #Laravel 9 #PHP #PostgreSQL #Publikálás (Deployment) #SQLite #Telepítés (Installation) #Vendégblogger

Alkalmam nyílt arra hogy, bemutassam a Heroku által kínált lehetőségeket egy Laravel alkalmazás esetében. A Heroku egy konténer alapú felhőszolgáltatás, amivel gyorsan és egyszerűen tehetjük alkalmazásainkat elérhetővé mások számára. A Microsoft Azure-rel ellentétben, ez csak alkalmazás futtatására alkalmas és a PostgreSQL-t fogjuk használni, mint adatbázist, mert ezt tudjuk tárolni a Heroku-nál, azonban lokálisan az SQLite-ot. Egy VSCode-ra és egy böngészőre lesz szükség mindössze, ezután lépésről-lépésre fogunk haladni.
laravelXheroku

Hozzunk létre egy Laravel projektet a következő paranccsal, majd nyissuk meg VSCode-al. (Egyszerre csak egy parancsot futtassunk, minden sor egy új parancs!)

composer create-project laravel/laravel laravel_v9_heroku
cd laravel_v9_heroku
code .

Ha problémába ütköztünk, akkor ez a bejegyzés segítség lehet: Laravel 5.7 (és 6, 7, 8, ...) telepítése

Viszont, ha sikerült, akkor ez a kép fogad minket:


Mivel SQLite-ot fogunk használni lolkálisan, ezért először a környezeti változókat kell átállítanunk (.env), majd a database mappába kell egy database.sqlite fájlt létrehozni. 


Ha ezzel megvagyunk, akkor hozzunk is létre egy migrációs fájlt, amivel egy táblát fogunk beszúrni az adatbázisba. Ez a tábla a usernames névre hallgat, és egy elsődleges kulcs és egy string típusú mezője lesz. Migrációról itt olvashattok: Adatbázis-kezelés 1. rész - Bevezetés a migrációk világába

php artisan make:migration create_usernames_table

Ha ezt futtatjuk akkor megkapjuk a migrációs fájlunkat, majd írjuk is át az up() metódust kicsit.

public function up()
{
    Schema::create('usernames', function (Blueprint $table) {
        $table->id();
        $table->string('username');
        $table->timestamps();
    });
}

Ha megvan, akkor mehet is a migráció php artisan migrate paranccsal, azonban a gyors tesztelés érdekében hozzunk létre egy útvonalat dbtest néven a routes/web.php nevű fájlban.

Route::get('/dbtest', function () {
    return dd(
        DB::select("select name from sqlite_schema where type='table' and name not like 'sqlite_%';")
    );
});

(Ha nem szeretnénk warning-ot kapni, akkor importáljuk a DB osztályt, de elvileg enélkül is működnie kell.) Az iménti utasítás minden táblát kilistáz az adatbázisból, majd meg is szakít minden folyamatot a Dump and Die (dd) függvény miatt. Ha most elindítjuk az alkalmazásunkat a php artisan serve paranccsal és elnavigálnuk a /dbtest útvonalra, akkor hasonló dolgot kell látnunk.


Jól látható, hogy a migráció által létrehozott táblánk a usernames szerepel a visszakapott listában. Most alakítsuk át úgy ezt a route-ot, hogy legyen benne egy INSERT és egy SELECT SQL utasítás a könyebb tesztelhetőség érdekében.

Route::get('/dbtest', function () {
    DB::insert("insert into usernames (username) values ('Dave')");

    return dd(
        DB::select("select * from usernames")
    );
});

Ha újra töltjük az oldalt, akkor vissza kapjuk a bevitt adatokat, minden frissítés plusz egy rekordot szúr be... (itt én kétszer szúrtam be ugyanazt a nevet, jelentősége nincsen, csak teszteltem).


Viszont, így már a Heroku-ra feltöltés után is könnyen ellenőrizhetjük, hogy működik-e az adatbázis. Hozzunk létre egy Procfile nevű fájlt a gyökérkönyvtárban, és legyen ez a tartalma:

web: vendor/heroku/heroku-buildpack-php/bin/heroku-php-apache2 public/

Ez a sor meghatározza a build után milyen webszerverrel (heroku-php-apache2) és honnan szolgálja ki az alkalmazást (public/).

Ha nincs még telepítve telepítsük globálisan a Herokut CLI-t az npm install -g heroku paranccsal (esetleg szükség lehet arra, hogy előtte egy npm install -t futtassunk), majd futtassuk a heroku login parancsot és tegyünk úgy ahogy a CLI kéri, nyissuk meg böngészőben a bejelentkezés felületét, majd lépjünk be. (Lehetséges hogy itt nem ajánlja fel a regisztrációt, akkor azt megtehetjük itt: https://signup.heroku.com/) Ha a heroku-s parancsot nem ismerné fel a rendszer, akkor próbáljunk meg egy parancssort adminisztrátorként futtatni és ugyanabban a mappában, ahol a projektünk van, ott futtasuk a heroku-s további parancsokat.

Belépés után hozzunk létre egy új alkalmazást a heroku create segítségével és kapjuk is az üzenetet: "Creating app... done, " majd a létrejövő alkalmazásunk neve, nálam ez (de mindenki másnál más, úgyhogy jegyezzétek fel magatoknak a sajátotok nevét): powerful-meadow-28960

Kérjük le az alkalmazás kulcsát, mert a következő utasításhoz szükség lesz rá (az eredményt másoljuk ki a vágólapra):

php artisan key:generate --show

Majd állítsunk be két környezeti változót:

heroku config:set --app=powerful-meadow-28960 APP_KEY=iménti lekérdezés eredménye
heroku config:set --app=powerful-meadow-28960 DB_CONNECTION=pgsql

Az iménti változók létrejöttét ellenőrizhetjük a webes felületen is: kattintsunk az alkalmazásunkra, majd a fenti vízszintes menüből válasszuk a "Settings" menüpontot, az ott megnyíló második szekció mutatja a "Config Vars" részt, itt ha rákattintunk a "Reveal Config Vars" gombra, akkor kapjuk a listát az eddigi változóinkról:


Adjuk hozzá az előbb létrehozott alkalmazásunkhoz a PostreSQL-t a következő paranccsal:

heroku addons:create --app=powerful-meadow-28960 heroku-postgresql:hobby-dev

Létre is jött az üres adatbázis. Itt a hobby-dev az ingyenes plan, viszont ha ezzel társítottunk egy ingyenes PostreSQL-t, az készen is áll a használatra.

A következő parancsokkal push-oljuk fel a heroku remote repository-ba az alkalmazást. (Egyszerre egy parancs!)

git init
git add .
git commit -m "Initial commit"
heroku git:remote --app=
powerful-meadow-28960
git push heroku master

Ha készen van, akkor ezt kell kapjuk: remote: Verifying deploy... done. A migrációt a

heroku run php artisan migrate --force

paranccsal indíthatjuk el, majd ha végez egy heroku open futtatásával meg is nyílik az oldalunk.


Ha pedig elnavigálunk az előzőleg létrehozott /dbtest útvonalra, akkor látnunk kell, amit lokálisan is, INSERT után megkapott rekord(ok) listázva.


Fontos megjegyzés! Már többféle adatbázis kapcsolatról tanultunk (MySQL, Microsoft SQL, SQLite), most bekerült a listánkba a PostgreSQL is, használata nem különösebben tér el a többitől, viszont, ha szeretnénk lokálisan használni a PostgreSQL-t, ahhoz a xampp/php/php.ini fájlban a ";extension=pdo_pgsql" sort kell keresni és kivenni előle a pontosvesszőt, ami a komment jele itt. Majd egy composer require doctrine/dbal paranccsal telepítjük a szükséges függőségeket. A korábban létrehozott adatbázishoz az URL-t a heroku pg:credentials:url futtatásával kapjuk meg, majd a "Connection String"-ben a "Connection URL" részről a linket kimásolva kell a .env fájlba beállítani mint DATABASE_URL.




Adjunk hozzá egy új útvonalat, és nézzük meg, hogy mennyire egyszerű a változásokat feltölteni Heroku-ra. A route neve /tables legyen hogy ellenőrizzük a tábláinkat. 

Route::get('/tables', function () {
    return dd(
        DB::select("select tablename from pg_catalog.pg_tables where schemaname != 'pg_catalog' and schemaname != 'information_schema'")
    );
});

A git add . paranccsal adjuk hozzá a Staging area-hoz a változtatott fájljainkat, majd a git commit -m "Route added" után egy git push heroku master segítségével el is indul a feltöltés, pár másodperc és ha kész, navigáljunk az újonnan létrehozott útvonalra (/tables) és láthatjuk is a tábláinkat az adatbázisban.

Heroku elérhető böngészőből is, minden alkalmazást lehet itt kezelni és további hasznos információt is meglehet találni: https://dashboard.heroku.com/apps

A végső alkalmazás itt érhető el: https://powerful-meadow-28960.herokuapp.com/


A Heroku-ra deploy-olt alkalmazások ingyenes csomag esetén 30 perc inaktivitás után leállnak. Ameddig futott az alkalmazás azt dyno órákban számolják, ebből egy hónapban 550 van. Azaz az összes alkalmazás maximális használati ideje 550 óra lehet. Hobby szinten ez nagyon sok, személy szerint nekem előző hónapban 4 projekt 12 órát üzemelt összesen. Igaz, vannak hátrányai, mivel az inaktivitás utáni ébredés 10-15 másodpercet vesz igénybe, de ezek mellett használata nagyon egyszerű, Node.js alkalmazások deploy-olása még ennél is gyorsab és könyebb. Könnyebbnek és felhasználó barátabbnak találtam mint az Azure-t, de ne felejtsük el, hogy itt csak alkalmazásokat tudunk futtatni.


Tipp: Ha Heroku-t szeretnénk MySQL adatbázissal használni, akkor folytassuk a munkát ezzel a blogbejegyzéssel: https://attila.gludovatz.hu/posts/heroku-es-a-cleardb-mysql