Come installare Magento 2.2 su Debian 9 in una VirtualBox

Con questo articolo si vogliono descrivere, sinteticamente, i passi necessari per installare su una macchina virtuale Oracle Virtualbox, un sistema operativo Linux Debian 9, un server Web Apache, un server PHP, un server MySql, su cui poi installare Magento 2.2.x.

Immaginiamo di avere in un ambiente virtuale con Oracle Virtualbox una installazione di Debian 9 in cui si può accedere con il privilegio di amministratore root.

Per leggere correttamente questo articolo dovete conoscere come prerequisiti:

  • come funziona la console di Linux
  • come funziona un web server
  • come funziona un database mysql o simili

Una volta installata la Oracle Virtualbox e installata la Debian 9 includendo anche il web server Apache 2,

si verifica che in essa occorre installare il php.

$sudo apt-get install php php-common php-mcrypt php-curl php-cli php-mysql php-gd php-intl php-xsl php-pear libmcrypt-dev mcrypt php-soap

Pertanto si verifica la versione di php installata

$php -v
PHP 7.0.19-1 (cli) (built: May 11 2017 14:04:47) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies
    with Zend OPcache v7.0.19-1, Copyright (c) 1999-2017, by Zend Technologies

A questo punto si può installare MariaDb, la versione "libera" di MySql

$sudo apt-get -y install mariadb-server mariadb-client

L'installazione va resa "sicura"

$sudo mysql_secure_installation

Per comodità si può installare phpmyadmin, per avere un interfaccia grafica, tramite browser per amministrare i database presenti.

$sudo apt-get install phpmyadmin

Ci si accorge che con Debian 9 si può accedere all'utente root del database mysql solo con l'utente root di Debian. Essendo una macchina virtuale di prova, questo è troppo limitativo. Pertanto si esegue

#sudo mysql -u root -p

mysql> USE mysql;
mysql> UPDATE user SET plugin='mysql_native_password' WHERE User='root';
mysql> FLUSH PRIVILEGES;
mysql> exit;
#exit;
$service mysql restart

Si può verificare l'uso di phomyadmin da questo indirizzo: http://localhost/phpmyadmin/

A questo punto occorre installare Magento 2.2.x.

Per fare questo si installa Composer

dopo essersi posizionati nella cartella /var/www/html che è la document root di Apache.

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('SHA384', 'composer-setup.php') === '544e09ee996cdf60ece3804abc52599c22b1f40f4323403c44d44fdfdd586475ca9813a858088ffbc1f233e9b180f061') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"

E' possibile creare un progetto di "Composer" per Magento con le seguenti istruzioni:

$php composer.phar create-project --repository-url=https://repo.magento.com/ magento/project-community-edition /var/www/html/Magento2

occorre fare questo con l'utente di Debian che lancia apache e che appartiene al gruppo www-data.

Pertanto è più corretto fare:

$sudo -u www-data php composer.phar create-project --repository-url=https://repo.magento.com/ magento/project-community-edition /var/www/html/Magento2

Lanciato il comando precedente si devono inserire delle chiavi sicure ottenute dal sito magento.com. La chiave pubblica è l'username, quella privata è la password. Se la directory Magento2 esiste ed è vuota inizia lo scaricamento.

La cartella /var/www/html/Magento2 viene creata automaticamente. In questo modo l'utente proprietario è www-data che appartiene al gruppo www-data che è quello che lancia Apache web server.

$ ls -l
totale 1832
-rwxr-xr-x  1 magento  magento  1852323 nov 27 16:54 composer.phar
-rw-rw-rw-  1 root     magento    10701 nov 27 14:03 index.html
drwxr-xr-x 13 www-data www-data    4096 nov 28 17:46 Magento2
drwxr-xr-x  2 magento  magento     4096 nov 27 16:32 Test
$ cd Magento2
$ ls -l
totale 1048
drwxr-xr-x  4 www-data www-data   4096 nov 28 17:46 app
-rw-r--r--  1 www-data www-data    138 nov 28 17:46 auth.json.sample
drwxr-xr-x  2 www-data www-data   4096 nov 28 17:46 bin
-rw-r--r--  1 www-data www-data 528505 nov 28 17:46 CHANGELOG.md
-rw-rw-rw-  1 www-data www-data   1921 nov  2 13:30 composer.json
-rw-r--r--  1 www-data www-data 414865 nov 28 17:46 composer.lock
-rw-r--r--  1 www-data www-data   3671 nov 28 17:46 CONTRIBUTING.md
-rw-r--r--  1 www-data www-data    647 nov 28 17:46 COPYING.txt
drwxr-xr-x  5 www-data www-data   4096 nov 28 17:46 dev
drwxr-xr-x  3 www-data www-data   4096 nov 28 17:49 generated
-rw-r--r--  1 www-data www-data     57 nov 28 17:46 grunt-config.json.sample
-rw-r--r--  1 www-data www-data   2994 nov 28 17:46 Gruntfile.js.sample
-rw-r--r--  1 www-data www-data   1370 nov 28 17:46 index.php
-rw-r--r--  1 www-data www-data    691 nov 28 17:46 ISSUE_TEMPLATE.md
drwxr-xr-x  4 www-data www-data   4096 nov 28 17:46 lib
-rw-r--r--  1 www-data www-data  10376 nov 28 17:46 LICENSE_AFL.txt
-rw-r--r--  1 www-data www-data  10364 nov 28 17:46 LICENSE.txt
-rw-r--r--  1 www-data www-data   5518 nov 28 17:46 nginx.conf.sample
-rw-r--r--  1 www-data www-data   1415 nov 28 17:46 package.json.sample
-rw-r--r--  1 www-data www-data    804 nov 28 17:46 php.ini.sample
drwxr-xr-x  2 www-data www-data   4096 nov 28 17:46 phpserver
drwxr-xr-x  6 www-data www-data   4096 nov 28 17:46 pub
-rw-r--r--  1 www-data www-data    804 nov 28 17:46 PULL_REQUEST_TEMPLATE.md
drwxr-xr-x  7 www-data www-data   4096 nov 28 17:46 setup
drwxr-xr-x  7 www-data www-data   4096 nov 28 17:37 update
drwxr-xr-x  5 www-data www-data   4096 nov 28 17:49 var
drwxr-xr-x 39 www-data www-data   4096 nov 28 17:46 vendor

 

Questo è un fatto positivo.

Occorre creare un utente ed un database, dove verrà installato Magento2.x

CREATE USER 'magento_u'@'%' IDENTIFIED VIA mysql_native_password USING '***';GRANT USAGE ON *.* TO 'magento_u'@'%' REQUIRE NONE WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0;GRANT ALL PRIVILEGES ON `magento2`.* TO 'magento_u'@'%';

Si installa Magento

$sudo -u www-data ./bin/magento setup:install --base-url=http://localhost/Magento2/ \
--db-host=localhost --db-name=magento2 --db-user=magento_u --db-password=pass34 \
--admin-firstname=MagentoFirst --admin-lastname=MagentoLast --admin-email=user@example.com \
--admin-user=admin --admin-password=admin1234 --language=en_US \
--currency=USD --timezone=America/Chicago --use-rewrites=0

che permette di creare il database e la struttura base delle tabelle. Non si vuole usare, per il momento la funzionalità URL_REWRITE.

Il processo va a buon fine. Viene correttamente installato il database.

Caches clearing:
Cache cleared successfully
[Progress: 438 / 441]
Disabling Maintenance Mode:
[Progress: 439 / 441]
Post installation file permissions check...
For security, remove write permissions from these directories: '/var/www/html/Magento2/app/etc'
[Progress: 440 / 441]
Write installation date...
[Progress: 441 / 441]
[SUCCESS]: Magento installation complete.
[SUCCESS]: Magento Admin URI: /admin_369rqf
Nothing to import.

Si può lanciare il back end

http://localhost/Magento2/index.php/admin_369rqf/

Manca la parte "statica"

$ sudo -u www-data ./bin/magento --ansi setup:static-content:deploy -f

Deploy using quick strategy
frontend/Magento/blank/en_US            2088/2088           ============================ 100% %  23 secs             
adminhtml/Magento/backend/en_US         2046/2046           ============================ 100% %  15 secs             
frontend/Magento/luma/en_US             2103/2103           ============================ 100% %  12 secs

Execution time: 82.21534705162

Se a questo punto il contenuto delle immagini, dei javascript e dei css non viene scaricato ricopiare il contenuto di /pub/static in /pub/static/version1511895272 dove il numero cambia di volta in volta.

Se si vuole passare in "produzione" ricordarsi di questo:

http://devdocs.magento.com/guides/v2.2/config-guide/cli/config-cli-subcommands-mode.html

Fate buone prove!

DISCLAIMERS
Si è messo questo articolo al solo scopo didattico ed illustrativo. 
Si sconsiglia di usarlo per casi veri ed in produzione 
ma si può usarlo, adattandolo, per ambienti di sviluppo e di test.
Per i casi concreti va studiata ed analizzata una soluzione ad hoc.