4

Question

How do I install and setup Magento with sample data to run locally?

Background

I'm using Laravel Valet to manage my local development on Mac OS Sierra and want to do some work on a Magento 2 project.

Pre-requisites

  • PHP Version 7.0.24
  • MySQL Ver 14.14 Distrib 5.7.19, for osx10.12
  • Laravel Valet Version 2.0.4
  • Composer Version 1.5.2
  • mmv brew install mmv

Desired result

3
  • I have given step-by-step instructions to install Magento 2.2.3 on Valet+ which worked for me. ka.lpe.sh/2018/03/20/install-magento-2-2-3-valet-plus-macos
    – Kalpesh
    Mar 20, 2018 at 17:24
  • My answer worked for me, if you care to share your answer as well I'm happy to upvote it :)
    – Luke
    Mar 22, 2018 at 14:01
  • 1
    Good idea. I have shared my answer :)
    – Kalpesh
    Mar 23, 2018 at 22:38

3 Answers 3

6

I have recently installed Magento 2 on Valet+ on my Mac. Here are the steps I have taken to successfully install it:

  1. Install Homebrew if you don't have it on your Mac already
  2. Install PHP 7 brew install homebrew/php/php71
  3. Install Composer brew install homebrew/php/composer
  4. Install Valet+ by weprovide composer global require weprovide/valet-plus
  5. Add export PATH in your bash profile export PATH="$PATH:$HOME/.composer/vendor/bin"
  6. Run valet install command valet install
  7. Create sites directory where you will install Magento 2 mkdir sites && cd sites
  8. Run command valet park to server sites valet park
  9. Install Magento 2 magerun2 install
  10. That's it! Open your newly installed site in browser by running command valet open

For detailed answer with output of each above-mentioned steps, I have already posted it on my blog. You can check it here: http://ka.lpe.sh/2018/03/20/install-magento-2-2-3-valet-plus-macos/

Also, credit to https://github.com/weprovide/valet-plus for providing nice documentation.

1

You should take a look at Valet+ (https://github.com/weprovide/valet-plus). This is based on Valet, but supports Magento 2 out of the box. And easy to install!

0

Answer

1. Complete the various set-up stages below.

2. Install magento using the command below.

php -d memory_limit=-1 magento setup:install \
--admin-firstname="magento" \
--admin-lastname="admin" \
--admin-email="admin@email.com" \
--admin-user='admin' \
--admin-password="Admin123" \
--base-url="https://magento-2.dev" \
--use-rewrites=1 \
--db-host="localhost" \
--db-user="magento_2" \
--db-name="magento_2" \
--db-password="magento_2" \
--use-secure=1 \
--use-sample-data

3. Deploy front end assets.

php -d memory_limit=-1 setup:static-content:deploy -f

Magento directory / webroot setup

  1. Download the Magento CE 2.2 code with bundled sample data
  2. Unzip the archive to ~/www/magento-2
  3. Rename *.ext.sample files to *.ext mmv -c \*.sample \#1

Database setup

I use a custom Valet extension to create local databases. copy the below valet Extension to ~/.valet/Extensions/db.php

<?php
$app->command('db [name]', function ($name) {
    if (!$name) {
        warning('Please specify a database name');
        return;
    }

    $create_db_command = sprintf("mysql -uroot -e \"create database %s\"", $name);
    $create_user_command = sprintf("mysql -uroot -e \"create user '%s'@'localhost' identified by '%s'\"", $name, $name);
    $grant_privileges_command = sprintf("mysql -uroot -e \"grant all privileges on %s.* to '%s'@'localhost'\"", $name, $name);

    $commands = compact('create_db_command', 'create_user_command', 'grant_privileges_command');

    foreach ($commands as $command) {
        if ($error = CommandLine::run($command)) {
            warning($command);
            warning($error);
            return;
        }
    }
    info('The database '.$name.' has been created');
})->descriptions('Create a new database');
  1. valet db magento_2

Valet site setup

  1. cd ~/www/magento-2 && valet link magento-2
  2. valet secure magento-2

Valet driver setup

Add a file containing the below driver code to ~/.valet/Drivers/Magento2ValetDriver.php

<?php
class Magento2ValetDriver extends ValetDriver
{
    private $mageMode;

    public function serves($sitePath, $siteName, $uri)
    {
        return file_exists($sitePath . '/bin/magento') && file_exists($sitePath . '/pub/index.php');
    }

    public function isStaticFile($sitePath, $siteName, $uri)
    {
        $this->checkMageMode($sitePath);
        $route = parse_url(substr($uri, 1))['path'];
        $pub = '';
        if ('developer' === $this->mageMode) {
            $pub = 'pub/';
        }
        if (!$this->isPubDirectory($sitePath, $route, $pub)) {
            return false;
        }
        $magentoPackagePubDir = $sitePath;
        if ('developer' !== $this->mageMode) {
            $magentoPackagePubDir .= '/pub';
        }
        $file = $magentoPackagePubDir . '/' . $route;
        if (file_exists($file)) {
            return $magentoPackagePubDir . $uri;
        }
        if (strpos($route, $pub . 'static/') === 0) {
            $route = preg_replace('#' . $pub . 'static/#', '', $route, 1);
            $_GET['resource'] = $route;
            include $magentoPackagePubDir . '/' . $pub . 'static.php';
            exit;
        }
        if (strpos($route, $pub . 'media/') === 0) {
            include $magentoPackagePubDir . '/' . $pub . 'get.php';
            exit;
        }
        return false;
    }

    private function checkMageMode($sitePath)
    {
        if (null !== $this->mageMode) {
            // We have already figure out mode, no need to check it again
            return;
        }
        if (!file_exists($sitePath . '/index.php')) {
            $this->mageMode = 'production'; // Can't use developer mode without index.php in project root
            return;
        }
        $mageConfig = [];
        if (file_exists($sitePath . '/app/etc/env.php')) {
            $mageConfig = require $sitePath . '/app/etc/env.php';
        }
        if (array_key_exists('MAGE_MODE', $mageConfig)) {
            $this->mageMode = $mageConfig['MAGE_MODE'];
        }
    }

    private function isPubDirectory($sitePath, $route, $pub = '')
    {
        $sitePath .= '/pub/';
        $dirs = glob($sitePath . '*', GLOB_ONLYDIR);
        $dirs = str_replace($sitePath, '', $dirs);
        foreach ($dirs as $dir) {
            if (strpos($route, $pub . $dir . '/') === 0) {
                return true;
            }
        }
        return false;
    }

    public function frontControllerPath($sitePath, $siteName, $uri)
    {
        $this->checkMageMode($sitePath);
        if ('developer' === $this->mageMode) {
            return $sitePath . '/index.php';
        }
        return $sitePath . '/pub/index.php';
    }
}

NGINX configuration.

  1. Valet will have created a magento-2.dev nginx config file
  2. Edit the ~/.valet/Nginx/magento-2.dev
  3. Add the location blocks in the nginx.conf.sample bundled with the Magento source code.

    upstream fastcgi_backend {
       server unix:/Users/user/.valet/valet.sock;
    }
    
    server {
        listen 80;
        server_name magento-2.dev www.magento-2.dev *.magento-2.dev;
        return 301 https://$host$request_uri;
    }
    
    server {
        # SSL Setup
        listen 443 ssl http2;
        server_name magento-2.dev www.magento-2.dev *.magento-2.dev;
        charset utf-8;
    
        # SSL Certifcates
        ssl_certificate /Users/user/.valet/Certificates/magento-2.dev.crt;
        ssl_certificate_key /Users/user/.valet/Certificates/magento-2.dev.key;
    
        # Logs
        access_log /Users/user/.valet/Log/nginx-access.log;
        error_log /Users/user/.valet/Log/nginx-error.log;
    
        # Magento Setup
        set $MAGE_ROOT /Users/user/www/magento-2;
        root $MAGE_ROOT/pub;
        index index.php;
        autoindex off;
        error_page 404 403 = /errors/404.php;
        add_header "X-UA-Compatible" "IE=Edge";
    
        location /41c270e4-5535-4daa-b23e-c269744c2f45/ {
            internal;
            alias /;
            try_files $uri $uri/;
        }
    
        location = /favicon.ico {
            access_log on;
            log_not_found off;
        }
    
        location = /robots.txt  {
            access_log off;
            log_not_found off;
        }
    
        # PHP entry point for setup application
        location ~* ^/setup($|/) {
            root $MAGE_ROOT;
            location ~ ^/setup/index.php {
                fastcgi_pass   fastcgi_backend;
    
                fastcgi_param  PHP_FLAG  "session.auto_start=off \n suhosin.session.cryptua=off";
                fastcgi_param  PHP_VALUE "memory_limit=768M \n max_execution_time=600";
                fastcgi_read_timeout 600s;
                fastcgi_connect_timeout 600s;
    
                fastcgi_index  index.php;
                fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                include        fastcgi_params;
            }
    
            location ~ ^/setup/(?!pub/). {
                deny all;
            }
    
            location ~ ^/setup/pub/ {
                add_header X-Frame-Options "SAMEORIGIN";
            }
        }
    
        # PHP entry point for update application
        location ~* ^/update($|/) {
            root $MAGE_ROOT;
    
            location ~ ^/update/index.php {
                fastcgi_split_path_info ^(/update/index.php)(/.+)$;
                fastcgi_pass   fastcgi_backend;
                fastcgi_index  index.php;
                fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                fastcgi_param  PATH_INFO        $fastcgi_path_info;
                include        fastcgi_params;
            }
    
            # Deny everything but index.php
            location ~ ^/update/(?!pub/). {
                deny all;
            }
    
            location ~ ^/update/pub/ {
                add_header X-Frame-Options "SAMEORIGIN";
            }
        }
    
        location / {
            try_files $uri $uri/ /index.php$is_args$args;
        }
    
        location /pub/ {
            location ~ ^/pub/media/(downloadable|customer|import|theme_customization/.*\.xml) {
                deny all;
            }
            alias $MAGE_ROOT/pub/;
            add_header X-Frame-Options "SAMEORIGIN";
        }
    
        location /static/ {
            # Uncomment the following line in production mode
            # expires max;
    
            # Remove signature of the static files that is used to overcome the browser cache
            location ~ ^/static/version {
                rewrite ^/static/(version\d*/)?(.*)$ /static/$2 last;
            }
    
            location ~* \.(ico|jpg|jpeg|png|gif|svg|js|css|swf|eot|ttf|otf|woff|woff2)$ {
                add_header Cache-Control "public";
                add_header X-Frame-Options "SAMEORIGIN";
                expires +1y;
    
                if (!-f $request_filename) {
                    rewrite ^/static/?(.*)$ /static.php?resource=$1 last;
                }
            }
            location ~* \.(zip|gz|gzip|bz2|csv|xml)$ {
                add_header Cache-Control "no-store";
                add_header X-Frame-Options "SAMEORIGIN";
                expires    off;
    
                if (!-f $request_filename) {
                   rewrite ^/static/?(.*)$ /static.php?resource=$1 last;
                }
            }
            if (!-f $request_filename) {
                rewrite ^/static/?(.*)$ /static.php?resource=$1 last;
            }
            add_header X-Frame-Options "SAMEORIGIN";
        }
    
        location /media/ {
            try_files $uri $uri/ /get.php$is_args$args;
    
            location ~ ^/media/theme_customization/.*\.xml {
                deny all;
            }
    
            location ~* \.(ico|jpg|jpeg|png|gif|svg|js|css|swf|eot|ttf|otf|woff|woff2)$ {
                add_header Cache-Control "public";
                add_header X-Frame-Options "SAMEORIGIN";
                expires +1y;
                try_files $uri $uri/ /get.php$is_args$args;
            }
            location ~* \.(zip|gz|gzip|bz2|csv|xml)$ {
                add_header Cache-Control "no-store";
                add_header X-Frame-Options "SAMEORIGIN";
                expires    off;
                try_files $uri $uri/ /get.php$is_args$args;
            }
            add_header X-Frame-Options "SAMEORIGIN";
        }
    
        location /media/customer/ {
            deny all;
        }
    
        location /media/downloadable/ {
            deny all;
        }
    
        location /media/import/ {
            deny all;
        }
    
        # PHP entry point for main application
        location ~ (index|get|static|report|404|503)\.php$ {
            try_files $uri =404;
            fastcgi_pass   fastcgi_backend;
            fastcgi_buffers 1024 4k;
    
            fastcgi_param  PHP_FLAG  "session.auto_start=off \n suhosin.session.cryptua=off";
            fastcgi_param  PHP_VALUE "memory_limit=768M \n max_execution_time=18000";
            fastcgi_read_timeout 600s;
            fastcgi_connect_timeout 600s;
    
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }
    
        gzip on;
        gzip_disable "msie6";
    
        gzip_comp_level 6;
        gzip_min_length 1100;
        gzip_buffers 16 8k;
        gzip_proxied any;
        gzip_types
            text/plain
            text/css
            text/js
            text/xml
            text/javascript
            application/javascript
            application/x-javascript
            application/json
            application/xml
            application/xml+rss
            image/svg+xml;
        gzip_vary on;
    
        # Banned locations (only reached if the earlier PHP entry point regexes don't match)
        location ~* (\.php$|\.htaccess$|\.git) {
            deny all;
        }
    }
    

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.