Ukázali sme si už, ako nainštalovať čisté Magento cez Docker a tiež ako z tohto shopu spraviť multistore. V praxi sa ale často stáva, že potrebujeme rozbehať existujúci shop. Nie je to až také ťažké, ako sa to na prvý pohľad zdá, no aj napriek tomu sa môže vyskytnúť počas inštalácie zopár výziev. V tomto článku zazdieľam skúsenosti, ako som to zvládol ja na našich projektoch.

Zatiaľ čo prvotnú inštaláciu vieme zvládnuť pomocou jedného príkazu behom pár minút, inštaláciu existujúceho shopu rozdelíme do viacerých krokov. Opäť som sa inšpiroval repozitárom od Marka Shusta, kde je popísaný aj celý proces v angličtine. Vyzerá to jednoducho, ale ja som si musel zostaviť svoj vlastný postup.

Takže najprv vytvoríme adresár, do ktorého stiahneme Docker compose template pomocou príkazu

curl -s https://raw.githubusercontent.com/markshust/docker-magento/master/lib/template | bash

Zmena konfigurácie v compose.yaml

Predtým, než naštartujeme containery, urobíme zmeny v súboroch

  • compose.yaml
  • compose.dev.yaml
  • compose.healthcheck.yaml
  • bin/setup-install

Zmeny sa môžu týkať niektorých súborov, všetkých súborov, ale taktiež aj žiadneho. To v prípade, že nechceš meniť nastavenie žiadneho zo servisov.

V dobe písania tohto článku je aktuálna verzia Magenta 2.4.7, čomu zodpovedajú aj nastavenia servisov – PHP 8.3, MariaDB 10.6, OpenSearch 2.12 a ostatné. Ja som potreboval rozbehať Magento 2.4.5, ktoré sme mali nainštalované na jednom z našich projektov. S tým súviselo PHP 7.4, MariaDB 10.4 a namiesto OpenSearch sme bežali ešte na ElasticSearch 7.17.

Všetky potrebné verzie servisov pre jednotlivé verzie Magenta nájdeš na tejto adrese https://experienceleague.adobe.com/en/docs/commerce-operations/installation-guide/system-requirements

V súbore compose.yaml som teda zmenil image pre nasledujúce servisy:

  • phpfpm: markoshust/magento-php:7.4-fpm
  • db: mariadb:10.4
  • elasticsearch: markoshust/magento-elasticsearch:7.17-1

Zakomentoval som celú definíciu pre opensearch a odkomentoval definíciu pre elasticsearch.

V súbore compose.dev.yaml som nateraz nič nemenil. Ale po úspešnej inštalácii tam môžeš odkomentovať niektoré volumes (napr. adresár src/var/log), aby si ich mal synchronizované medzi hostom a containerom.

Ak si zmenil opensearch na elasticsearch, tak ako som to menil ja, budeš musieť spraviť zmenu v súbore compose.healthcheck.yaml. Opäť zakomentuj všetko, čo sa týka opensearchu a odkomentuj elasticsearch. Nezabudni aj na sekciu phpfpm, ktorá by mala vyzerať nejako takto:

phpfpm:
  depends_on:
    db:
      condition: service_healthy     
    redis:
      condition: service_healthy
    # opensearch:
    #   condition: service_healthy
    rabbitmq:
      condition: service_healthy
    elasticsearch:
      condition: service_healthy

V prípade zmeny na elasticsearch budeš musieť urobiť zmeny aj v súbore bin/setup-install, kde vymaž parametre

  • –opensearch-host
  • –opensearch-port

a hodnotu –search-engine nastav napríklad na elasticsearch7 v závislosti od verzie ElasticSearch.

Inštalácia Magenta

Hotovo. Teraz môžeme stiahnuť čisté Magento. Z root adresára projektu (tam, kde máš compose.yaml) spusti príkaz

bin/download 2.4.5 community

kde 2.4.5 community je verzia Magenta, ktorú sťahujeme.

Ďalej príkazom

bin/setup magento.test

spustíš samotnú inštaláciu Magenta na lokálnej doméne magento.test. Je to vlastne ten istý skript, ktorý sa spustil v prípade, kedy sme inštalovali čisté Magento. Po jeho dokončení si môžeš otvoriť browser a mal by si vidieť čisté Magento v danej verzii.

Import existujúcich súborov a dát

Teraz potrebujeme dostať do nášho projektu súbory a databázu z existujúceho projektu. Začneme tým, že nakopírujeme existujúce moduly a témy do adresárov

  • src/app/code
  • src/app/design/frontend
  • prípadne src/app/design/adminhtml

Tieto adresáre sú synchronizované. Čo ale nie je synchronizované s containerom, je obsah priečinka src/pub/media, ktorý obsahuje obrázky. Ak teda máš vo svojom projekte napr. obrázky produktov, skopíruj ich do src/pub/media a po skončení skopíruj obsah tohto adresár do containera pomocou

bin/copytocontainer pub/media

Pôvodný projekt pravdepodobne obsahuje nejaké moduly nainštalované cez composer. Takže aktualizuj sekciu „require“ v src/composer.json. Ak niektorý modul vyžaduje autorizáciu, pridaj kľúče do src/auth.json. Dávaj však pozor, že tento súbor tiež nie je defaultne synchronizovaný. Teda ak si nespravil zmenu v compose.dev.yaml.

Teraz môžeš spustiť príkaz

bin/composer update

ktorý nainštaluje všetky potrebné moduly do adresára vendor (do containera!!!).

Môžeš tieto moduly tiež zapnúť pomocou

bin/magento module:enable Vendor_Module [–all]

ale nespúšťaj ešte upgrade databázy. Najprv musíme naimportovať databázu z pôvodného projektu do tohto projektu. Pred samotným importom, odporúčam urobiť si zálohu aktuálnej databázy cez

bin/mysqldump > new_db.sql

Teraz už môžeš začať importovať pôvodnú databázu. Dávaj ale pozor, aby si to robil cez bin/clinotty ako root, ináč sa môže počas importu vyskytnúť chyba, že nemáš dostatočné oprávnenia. Celý príkaz je

bin/clinotty mysql -hdb -uroot -pmagento magento < existing_db.sql

Hodnoty parametrov host, root password a názov databázy som zobral zo súboru env/db.env. Ak si ale doteraz nič nemenil, budú presne také isté, ako v mojom príkaze.

V naimportovanej databáze nezabudni spraviť všetky požadované zmeny. Minimálne však zmeniť base URL na magento.test, pretože pôvodný projekt bol pravdepodobne na inej URL.

Teraz už môžeš spustiť samotné databázové skripty cez

bin/magento setup:upgrade

Ak nastane chyba „Could not validate a connection to Elasticsearch. No alive nodes found in your cluster“, je to z toho dôvodu, že v pôvodnej databáze bol pravdepodobne server hostname pre elasticsearch nastavený „localhost“. V contajneri sa ale tento servis volá „elasticsearch“, resp. „opensearch“ v prípade OpenSearch.

Choď preto do databázy a zmeň hodnotu
catalog/search/elasticsearch7_server_hostname na elasticsearch.

Ako poslednú vec by som zmazal obsah adresára src/vendor na hoste a nakopíroval tam obsah z vendora z containera

bin/copyfromcontainer vendor

Verím, že podľa tohto návodu sa ti podarilo rozbehať existujúci Magento projekt na Dockeri. Ak nie, skús prejsť celý postup ešte raz, či si nezabudol niečo nastaviť podľa môjho odporúčania. Dobrý zdroj riešenia problémov je aj sekcia „Issues“ na Githube tohto repozitára.