Heroku és a ClearDB MySQL

Attila | 2022. 05. 15. 16:16 | Olvasási idő: 2 perc

Címkék: #Cloud #Heroku #Laravel #Laravel 9 #MySQL #Publikálás (Deployment) #Telepítés (Installation)

A Heroku (Salesforce felhőszolgáltatás) alapértelmezetten a PostgreSQL adatbáziskezelő rendszerrel képes együttműködni. Ha valakinek viszont kényelmesebb (megszokottabb) a MySQL használata, akkor bővítenie kell a szolgáltatásai körén. Ennek folyamatát mutatom be ebben a bejegyzésben.
heroku_mysql_cleardb

Legutóbbi bejegyzés a Heroku használatáról, ebből fogok most kiindulni a bővítés előtt: https://attila.gludovatz.hu/posts/laravel-alkalmazas-telepitese-a-heroku-felhorendszerebe

MySQL használatához egy kiterjesztés szükségeltetik, ami a ClearDB MySQL: https://elements.heroku.com/addons/cleardb

Az iménti linkre kattintva betöltődik egy oldal, ami a ClearDB MySQL kiterjesztésre viszi a felhasználót (fejlesztőt). A telepítéshez be kell jelentkezni az oldalra a Heroku-s felhasználónkkal jobb felül "Log in".

Bejelentkezés után kattinthatunk az "Install ClearDB MySQL" gombra jobb felül. Kipróbáláshoz elég az ingyenes "Ignite" nevű csomagot választani, ami 5 MB-ot engedélyez nekünk.

Utána jöhet az "App to provision to" mező kitöltése, amelybe ha elkezdjük beírni a saját alkalmazásunk nevét, akkor ki tudjuk választani azt, amelyhez csatolni szeretnénk a MySQL adatbázist.


Az alkalmazás kiválasztása után ezt a képet kapjuk (az én alkalmazásom neve powerful-meadow-28960). Utána alul megnyomhatjuk a "Submit Order Form" gombot.

Bár a szolgáltatás ingyenes, a telepítéshez mégis kérte tőlem a bankkártya adataimat, amit meg is adtam, így utána már működött is kattintással a kiegészítő telepítése.

Ahogy az látható az iménti ábrán, sikeresen települt, a bővítmény használatához pedig a "Dev Center"-t (dokumentációt) javasolja az értesítés.

Megpróbálhatjuk "átcsatolni" a fenti kép szerint a ClearDB MySQL-re az alkalmazásunkat, viszont nem biztos, hogy működni fog így rögtön és simán. Nálam előbb le kellett választani a "Heroku Postgres"-t az alkalmazásról. Leválasztás terminal-ban:

heroku addons:detach DATABASE -a powerful-meadow-28960

Utána pedig törölnöm is kellett ezt az adatbázist, mert az alkalmazás beállításai között van egy paraméter (DATABASE_URL), amit nem engedett sem szerkeszteni, sem törölni, amíg létezett ez a "Heroku Postgres" adatbázis.

heroku addons:destroy heroku-postgresql:hobby-dev

Megerősítéshez meg kellett adnom az alkalmazásom nevét (powerful-meadow-28960).

A következő utasításhoz sajnos nem jó a sima Windows-os terminal vagy parancssor. Ehhez inkább javaslom a Git Bash alkalmazást (vagy egy WSL terminalt, ha van a gépünkön ilyen). Megnyitás után navigáljunk el az alkalmazásunk projekt mappájába és adjuk ki a következő parancsot:

heroku config | grep CLEARDB_DATABASE_URL

Eredményül megkapjuk a CLEARDB_DATABASE_URL-t, aminek az értékét másoljuk ki, mert a következő utasításhoz szükség lesz rá:

heroku config:set DATABASE_URL='mysql://b1983a29ef1764:a5b954af@us-cdbr-east-05.cleardb.net/heroku_516551b3b0a324e?reconnect=true'

Így összekötöttük a Heroku-ban lévő alkalmazásunkat az új ClearDB MySQL adatbázissal. Jöhet a migrálás:

heroku run php artisan migrate --force

Itt viszont kapunk egy hibaüzenetet, ami már ismerős lehet a számunkra korábbról, és egyben jelzi nekünk azt is, hogy már ténylegesen MySQL adatbázissal van dolgunk:

SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes (SQL: alter table `users` add unique `users_email_unique`(`email`))

Ezt egy módosítással tudjuk orvosolni az app/Providers/AppServiceProvider.php fájlban. A boot() függvény magjához adjuk hozzá ezt:

Schema::defaultStringLength(191);

Természetesen ezt importáljuk is be a fájl elején:

use Illuminate\Support\Facades\Schema;

Mentsük el, és következhet a feltöltés git-tel és visszatérhetünk ehhez a Windows-os terminalba:

git add .

git commit -m "mysql-specific 1071 error - fix"

git push heroku master

Majd utána már tudjuk újra migrálni (fresh!):

heroku run php artisan migrate:fresh --force

Működik is! De azért legyünk gyanakvóak és ellenőrizzük le:

Én a web.php-hoz hozzáadtam egy új útvonalat, amivel tudjuk csekkolni az adatbázisunkat:

Route::get('/d-tables', function () {
  return dd(
    DB::select("show tables")
  );
});

Ezután viszont a fenti git-es parancsokat újra ki kell adnunk, természetesen a commit "message" részét írjuk át arra, hogy mondjuk "added mysql-specific route", és a git push után már tesztelhetjük is a böngészőben:

Tipp: ha 500-as hibát kapnánk, akkor a Heroku-s változókhoz adjuk hozzá az APP_DEBUG változót és állítsuk az értékét true-ra (menedzselő felületen Config Vars részen), így beszédesebb hibaüzeneteket kaphatunk. Amikor pedig már minden jól működik, akkor változtassuk vissza false-ra, vagy egyszerűen töröljük ezt a változót (alapértelmezetten mivel itt "production" környezetben vagyunk az értéke false).

És ne feledjük, ez az 5 MB-os ClearDB MySQL kiterjesztési terv arra elég, hogy kipróbáljuk a működését, ha pedig fontos projekten dolgozunk, akkor elgondolkodhatunk, hogy az "Ignite" ingyenes csomag helyett más tervet válasszunk a ClearDB ajánlatai közül.

További Heroku kiterjesztések itt érhetők el: https://elements.heroku.com/addons

A ClearDB MySQL kiterjesztés használatára a javaslatot hallgatóm, Bagi Miklós László "Milász" adta, amit ezúton is köszönök neki.