Дэплой прыкладання на Laravel 7 на Ubuntu & Nginx

Дэплой прыкладання на Laravel 7 на Ubuntu & Nginx

Вырашыў я тут сваё партфоліё зрабіць на Laravel 7. Каб галоўная старонка была лендынгам, а ўсю інфармацыю на ёй можна было мяняць з дапамогай адмінкі. Не сутнасць. Справа дайшла да дэплою. Знайшоў пару добрых тутарыялаў, як гэта зрабіць на паўнавартасным серверы са ўсімі замарочкамі. У дэплоі я не вельмі моцны, я ўвогуле больш фронт, чым фулстэк. І, калі пісаць і тэставаць на PHP я яшчэ магу, то да кіравання серверам і да т.п. я яшчэ не дарос. Але прыйшлося разбірацца.

Цяпер пройдземся па ўсіх кроках, пачынальна з запуску праз SSH і сканчаючы працоўным сайтам. Паспрабуем абысці ўсе падводныя камяні.

Магчыма, вы зможаце знайсці аналагічныя інструкцыі ў інтэрнэце. Бо я ж у рэшце рэшт знайшоў. Праўда не ў адным месцы, не без дапамогі StackOverflow і ці наўрад на рускай. Я памучыўся. Таму вырашыў вам жыццё спрасціць.

Рабіць мы ўсё будзем з драплетам на DigitalOcean. Гэта, вядома, неабавязкова, выбірайце любы хостынг. Дайдзеце да працоўнага сервера на Ubuntu, вяртайцеся. Для тых, хто ўсё ж вырашыў рабіць на DigitalOcean, будуць яшчэ парады па наладзе дамена. А таксама реферальная спасылка на 100 $.

Усе спецыфічныя для DigitalOcean крокі будуць дадзены ў падобных зносках.

Пачнем.

TL;DR (толькі асноўныя каманды)

Ствараем карыстальніка

  • ssh root@[IP-адрес вашего дроплета]
  • adduser laravel
  • usermod -aG sudo laravel
  • su laravel

Дадаем яму SSH

  • mkdir ~/.ssh
  • chmod 700 ~/.ssh
  • vim ~/.ssh/authorized_keys
  • Устаўляемы публічны ключ
  • chmod 600 ~/.ssh/authorized_keys

Фаервол

  • sudo ufw allow OpenSSH
  • sudo ufw enable
  • sudo ufw status

Nginx

  • sudo apt update
  • sudo apt install -y nginx
  • sudo ufw allow 'Nginx HTTP'
  • sudo ufw status

MySQL

  • sudo apt install -y mysql-server
  • sudo mysql_secure_installation, NYNNY
  • sudo mysql
  • ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '<Ваш пароль для MySQL>';
  • SELECT user,authentication_string,plugin,host FROM mysql.user;
  • FLUSH PRIVILEGES;
  • exit

PHP

  • sudo apt update

  • sudo apt install -y curl wget gnupg2 ca-certificates lsb-release apt-transport-https

  • sudo apt-add-repository ppa:ondrej/php

  • sudo apt update

  • 7.3: sudo apt install -y php7.3-fpm php7.3-mysql

  • 7.4: sudo apt install -y php7.4-fpm php7.4-mysql

  • sudo vim /etc/nginx/sites-available/<Ваш домен>

Базавая настройка:

server {
        listen 80;
        root /var/www/html;
        index index.php index.html index.htm index.nginx-debian.html;
        server_name <Ваш домен или IP>;

        location / {
                try_files $uri $uri/ =404;
        }

        location ~ .php$ {
                include snippets/fastcgi-php.conf;
                fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
        }

        location ~ /.ht {
                deny all;
        }
}

Толькі HTTP настройка пад Laravel:

server {
    listen 80;
    listen [::]:80;

    root /var/www/html/<Имя проекта>/public;
    index index.php index.html index.htm index.nginx-debian.html;

    server_name <Ваш домен или IP>;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ .php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
    }

    location ~ /.ht {
        deny all;
    }
}

HTTPS налада пад Laravel:

server {
    listen 80;
    listen [::]:80;

    server_name <Ваш домен> www.<Ваш домен>;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name <Ваш домен> www.<Ваш домен>;
    root /var/www/html/<Имя проекта>/public;

    ssl_certificate /etc/letsencrypt/live/<Ваш домен>/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/<Ваш домен>/privkey.pem;

    ssl_protocols TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
    ssl_prefer_server_ciphers on;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options "nosniff";

    index index.php index.html index.htm index.nginx-debian.html;

    charset utf-8;

    location / {
            try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ .php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
    }

    location ~ /.ht {
            deny all;
    }

    location ~ /.well-known {
            allow all;
    }
}

  • sudo ln -s /etc/nginx/sites-available/<Ваш домен> /etc/nginx/sites-enabled/
  • sudo unlink /etc/nginx/sites-enabled/default
  • sudo nginx -t
  • sudo systemctl reload nginx

Laravel

  • 7.3: sudo apt install -y php7.3-mbstring php7.3-xml composer unzip

  • 7.4: sudo apt install -y php7.4-mbstring php7.4-xml composer unzip

  • mysql -u root -p

  • CREATE DATABASE laravel DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

  • GRANT ALL ON laravel.* TO 'root'@'localhost' IDENTIFIED BY '<Ваш пароль от MySQL>';

  • FLUSH PRIVILEGES;

  • exit

  • cd /var/www/html

  • sudo mkdir -p <Имя проекта>

  • sudo chown laravel:laravel <Имя проекта>

  • cd ./<Имя проекта>

  • git clone <ссылка на проект> . / git clone -b <имя ветки> --single-branch <ссылка на проект> .

  • composer install

  • vim .env

APP_NAME=Laravel
APP_ENV=production
APP_KEY=
APP_DEBUG=false
APP_URL=http://<Ваш домен>

LOG_CHANNEL=stack

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=<Ваш пароль от MySQL>

  • php artisan migrate

  • php artisan key:generate

  • sudo chown -R $USER:www-data storage

  • sudo chown -R $USER:www-data bootstrap/cache

  • chmod -R 775 storage

  • chmod -R 775 bootstrap/cache

HTTPS

  • sudo add-apt-repository ppa:certbot/certbot

  • sudo apt install -y python-certbot-nginx

  • sudo certbot certonly --webroot --webroot-path=/var/www/html/<Имя проекта>/public -d <Ваш домен> -d www.<Ваш домен>

  • sudo nginx -t

  • sudo ufw allow 'Nginx HTTPS'

  • sudo ufw status

  • sudo systemctl reload nginx

Ствараем дроплет на DigitalOcean і які рэгіструецца новы SSH-ключ

Я шчыра веру, што вы самі разбярэцеся з рэгістрацыяй на DigitalOcean. Яна няпростая, з кучай верыфікацый і іншай байды. Калі ў вас пры верыфікацыі з дапамогай дакументаў увесь час узнікае памылка сеткі, паспрабуйце ўсё зрабіць праз VPN, павінна дапамагчы.

У меню зверху націскаем Ствараць->Кропелькі. Выбіраемы Ubuntu.

Як толькі зарэгістраваліся, вы атрымаеце 100 $ на рахунак. Але не спакушайцеся. У вас ёсць усяго 60 дзён, каб іх патраціць. А гэта мала. Вы можаце, як і я, захацець выкарыстоўваць план даражэй, каб потым, калі ўжо пойдуць рэальныя грошы, перасесці на танней. Адразу кажу, не атрымаецца. Павялічваць можна, памяншаць нельга. Такія справы. Я абіраю стандарт->$5.

Рэгіён я выбіраю бліжэйшы да нас Франкфурт-на. Сетка VPC->default-fra1

Аўтэнтыфікацыю адразу зробім праз SSH. Націскаем New SSH Key. Калі ў вас няма SSH, справа ёсць вельмі простая інструкцыя. Адкрываем bash-тэрмінал, устаўляемы ssh-keygen. Потым заходзім у файл з публічным ключом. /Users/<Ваше имя пользователя>/.ssh/id_rsa.pub (Ці проста cat ~/.ssh/id_rsa.pub), які капіюецца змесціва і ўстаўляемы ў акно злева. Імя любое.

Прыдумляем для драплета хостнейм.

Націскаем Create Droplet

Ствараем новага карыстальніка

  • ssh root@[IP-адрес вашего дроплета]
  • Ці здарылася б вы, каб пачаць connecting (yes/no/[fingerprint])? yes
  • Увядзіце ваш пароль ад SSH
  • Ствараем карыстальніка Laravel: adduser laravel
  • Увядзіце пароль і іншую інфармацыю (я ўводжу толькі Full Name)
  • Дадаем карыстальніка ў групу sudo: usermod -aG sudo laravel

SSH для новага карыстальніка

  • Пераключаемся на новага карыстальніка: su laravel

Усе дзеянні далей, да канца артыкула, мы праводзім ад імя карыстальніка laravel. Таму, калі вы раптам перапыніліся, перазайдзіце і ўвядзіце su laravel

  • mkdir ~/.ssh
  • chmod 700 ~/.ssh
  • vim ~/.ssh/authorized_keys

Мы адкрылі файл у Vim. Калі вы з ім не знаёмыя наогул, можаце працаваць у Nano, ваша права.

Самыя базавыя каманды Vim

Для таго, каб па ходзе артыкула карыстацца рэдактарам Vim, вам дастаткова ведаць наступнае.

  • У Vim ёсць розныя рэжымы: звычайны (Normal mode), у якім вы ўводзіце каманды і выбіраеце рэжымы і астатнія.
  • Каб выйсці з любога рэжыму і патрапіць у звычайны рэжым дастаткова націснуць Esc
  • Перасоўвацца: можна проста стрэлкамі
  • Выйсці без захавання <Normal mode>: :q!
  • Выйсці і захаваць <Normal mode>: :wq
  • Перайсці ў рэжым уводу тэксту <Normal mode>: i (Ад англ. INSERT)
  • Устаўляемы наш публічны ключ (які мы рабілі вышэй)
  • Абараняем ад змен: chmod 600 ~/.ssh/authorized_keys

Усталёўваны фаервол

  • Глядзім усе даступныя налады: sudo ufw app list
  • Дазваляем OpenSSH (інакш нас залочыць): sudo ufw allow OpenSSH
  • Запускаем фаервол: sudo ufw enable, y
  • правяраем: sudo ufw status

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)

Усё ў парадку.

Усталёўваны Nginx

Пры ўсталёўцы вас часам будзе пытаць "Вы ўпэўненыя?". Адказвайце y (ну толькі, калі ўпэўненыя).

  • sudo apt update
  • sudo apt install nginx

Дадаем Nginx у налады фаервала

  • sudo ufw app list
  • sudo ufw allow 'Nginx HTTP'
  • sudo ufw status

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
Nginx HTTP                 ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
Nginx HTTP (v6)            ALLOW       Anywhere (v6)

Перайдзіце па вашым IP. Калі ўсё ідзе добра, вы павінны ўбачыць наступнае.

Дэплой прыкладання на Laravel 7 на Ubuntu & Nginx

Усталёўваны MySQL

  • sudo apt install mysql-server
  • Запускаем аўтаматычны скрыпт па абароне sudo mysql_secure_installation

Адкажыце на пастаўленыя пытанні. Калі вы не ведаеце, што адказваць, вось рэкамендуемыя варыянты:

  • Validate password plugin N

  • Remove anonymous users? - Y

  • Disallow root login remotely? - N

  • Remove test database and access to it? - N

  • Reload privilege tables now? - Y

  • Заходзім у MySQL: sudo mysql

  • Глядзім метады доступу: SELECT user,authentication_string,plugin,host FROM mysql.user;

  • Усталеўваны пароль для root: ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '<Ваш пароль для MySQL>';

  • Глядзім метады доступу зноў: SELECT user,authentication_string,plugin,host FROM mysql.user;

  • Ужывальны змены і выходзім з MySQL: FLUSH PRIVILEGES; и exit

  • Цяпер, каб увайсці ў MySQL трэба выкарыстоўваць mysql -u root -p і ўводзіць пароль

Усталёўваны PHP

Скарыстаемся іншым рэпазітаром ад Ондржэй Суры

  • sudo apt update
  • sudo apt install -y curl wget gnupg2 ca-certificates lsb-release apt-transport-https
  • sudo apt-add-repository ppa:ondrej/php
  • sudo apt update

Цяпер выбіраем. Для Laravel 7 можна абраць PHP 7.3 ці 7.4. Адрозненне будзе толькі ў лічбах 3 і 4.

  • 7.3: sudo apt install -y php7.3-fpm php7.3-mysql
  • 7.4: sudo apt install -y php7.4-fpm php7.4-mysql

PHP FastCGI Process Manager (fpm) працуе з PHP запытамі. mysql, натуральна, для працы з MySQL.

Далей я ўсё буду рабіць на 7.4.

Наладжваем Nginx

  • sudo vim /etc/nginx/sites-available/<Ваш домен>

Замест "<Ваш дамен>" упішыце дамен (напрыклад, mysite.ru), які хочаце выкарыстоўваць у будучыні. Калі ў вас такога пакуль няма, пішыце любы, потым проста паспрабуйце дзеянні ў гэтым раздзеле для свайго дамена, калі абярыце яго.

Упісваем наступнае:

server {
        listen 80;
        root /var/www/html;
        index index.php index.html index.htm index.nginx-debian.html;
        server_name <Ваш домен или IP>;

        location / {
                try_files $uri $uri/ =404;
        }

        location ~ .php$ {
                include snippets/fastcgi-php.conf;
                fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
        }

        location ~ /.ht {
                deny all;
        }
}

Калі Вы выбралі версію 7.3 замест php7.4-fpm.sock упішыце php7.4-fpm.sock.

Слухаем 80 порт на server_name, калі прыходзім запыт у корані /var/www/html бярэм index-файл. Калі пасля server_name нешта ёсць, шукаем такі файл. Не знаходзім, выкідваем 404. Калі заканчваецца на .php, праганяем праз fpm. Калі ёсць .ht, забараняем (403).

  • Які робіцца спасылку з sites-available в sites-enabled: sudo ln -s /etc/nginx/sites-available/<Ваш домен> /etc/nginx/sites-enabled/
  • Выдаляем спасылку на default: sudo unlink /etc/nginx/sites-enabled/default
  • Правяраем на памылкі: sudo nginx -t
  • Перазагружаем: sudo systemctl reload nginx

Правяраем працу:

  • sudo vim /var/www/html/info.php
  • Пішам: <?php phpinfo();
  • Пераходзім на <Ваш IP>/info.php

Вы павінны ўбачыць нешта падобнае:

Дэплой прыкладання на Laravel 7 на Ubuntu & Nginx

Цяпер гэты файл можна выдаліць: sudo rm /var/www/html/info.php

Ставім Laravel

  • 7.3: sudo apt install php7.3-mbstring php7.3-xml composer unzip

  • 7.4: sudo apt install php7.4-mbstring php7.4-xml composer unzip

  • Заходзім у MySQL: mysql -u root -p

  • Ствараем БД з імем Laravel: CREATE DATABASE laravel DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

  • Падаем root доступ да Laravel: GRANT ALL ON laravel.* TO 'root'@'localhost' IDENTIFIED BY '<Ваш пароль от MySQL>';

  • FLUSH PRIVILEGES;

  • exit

  • cd /var/www/html

  • Ствараем тэчку для праекту: sudo mkdir -p <Имя проекта>

  • Падаем карыстачу Laravel правы на праект: sudo chown laravel:laravel <Имя проекта>

Далей трэба перанесці праект. Напрыклад, кланаваннем з Github.

  • cd ./<Имя проекта>
  • git clone <ссылка на проект> .

Варта ўлічваць, што, калі вы не захоўвалі статычныя файлы (напрыклад, з /public) на Github, то іх у вас, натуральна, не будзе. Я, напрыклад, для вырашэння гэтага стварыў асобную галінку deploy, з якой ужо і кланаваў: git clone -b <имя ветки> --single-branch <ссылка на проект> ..

  • Усталёўваны залежнасці: composer install
  • Ствараем .env: vim .env

Базавая версію яго выглядае так:

APP_NAME=Laravel
APP_ENV=production
APP_KEY=
APP_DEBUG=false
APP_URL=http://<Ваш домен>

LOG_CHANNEL=stack

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=<Ваш пароль от MySQL>

Калі вы капіруеце свой .env, заменіце APP_ENV на production, APP_DEBUG на false і ўпішыце правільныя налады для MySQL.

  • Мігруем БД: php artisan migrate
  • Які генеруецца код: php artisan key:generate

Змяняем дазволы:

  • sudo chown -R $USER:www-data storage
  • sudo chown -R $USER:www-data bootstrap/cache
  • chmod -R 775 storage
  • chmod -R 775 bootstrap/cache

Апошняе, што засталося, - пераналадзіць Nginx пад Laravel:

sudo vim /etc/nginx/sites-available/<Ваш домен>

server {
    listen 80;
    listen [::]:80;

    root /var/www/html/<Имя проекта>/public;
    index index.php index.html index.htm index.nginx-debian.html;

    server_name <Ваш домен или IP>;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ .php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
    }

    location ~ /.ht {
        deny all;
    }
}

Як і ў мінулы раз, калі Вы выбралі версію 7.3 замест php7.4-fpm.sock упішыце php7.4-fpm.sock.

Настройка дамена на DigitalOcean

Усё, насамрэч, вельмі проста. Вы купляеце дамен (дзе заўгодна), пераходзіце на DigitalOcean у Ствараць->Domains/DNS. У полі Дадаць дамен вы ўпісваеце гэты дамен, націскаеце дадаць. Затым пераходзіце ў налады дамена і ў поле ХАСНІМ упісваеце @. Выбіраеце праект і націскаеце Стварыць запіс.
Цяпер пераходзіце на сайт, дзе куплялі дамен, знаходзіце тамака "DNS Серверы" (ці нешта падобнае) і ўпісваеце серверы DigitalOcean (а менавіта ns1.digitalocean.com, ns2.digitalocean.com, ns3.digitalocean.com). Цяпер трэба крыху (ці шмат) пачакаць, пакуль гэтыя налады будуць прынятыя. Гатова!
Адзіная праблема - у вас сайт будзе адкрывацца толькі як HTTP. Каб быў HTTPS, пераходзім да наступнай часткі.

Наладжваем HTTPS

Усталёўваны certbot і перадаем яму імя дамена (фармату mysite.ru) і імя дамена з www (www.mysite.ru).

  • sudo add-apt-repository ppa:certbot/certbot
  • sudo apt install python-certbot-nginx
  • sudo certbot certonly --webroot --webroot-path=/var/www/html/<Имя проекта>/public -d <Ваш домен> -d www.<Ваш домен>

Зараз трэба пераналадзіць Nginx (не забудзьцеся падставіць свае значэнні):

server {
    listen 80;
    listen [::]:80;

    server_name <Ваш домен> www.<Ваш домен>;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name <Ваш домен> www.<Ваш домен>;
    root /var/www/html/<Имя проекта>/public;

    ssl_certificate /etc/letsencrypt/live/<Ваш домен>/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/<Ваш домен>/privkey.pem;

    ssl_protocols TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
    ssl_prefer_server_ciphers on;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options "nosniff";

    index index.php index.html index.htm index.nginx-debian.html;

    charset utf-8;

    location / {
            try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ .php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
    }

    location ~ /.ht {
            deny all;
    }

    location ~ /.well-known {
            allow all;
    }
}

Думаю, вы ўжо зразумелі, што трэба памяняць для PHP 7.3.

Тут, насамрэч, усё проста. Мы проста перанакіроўваем усе запыты з HTTP (порт 80) на HTTPS (порт 443). А там робім усё тое самае, што і раней, але ўжо з шыфраваннем.

Засталося паставіць дазволы ў фаерволі:

  • sudo nginx -t
  • sudo ufw app list
  • sudo ufw allow 'Nginx HTTPS'
  • sudo ufw status
  • sudo systemctl reload nginx

Цяпер усё павінна працаваць, як трэба.

[Дадаткова] Устаноўка Node.js

Калі раптам вам спатрэбілася запускаць npm-каманды на серверы, вам трэба ўсталяваць Node.js.

  • sudo apt update
  • sudo apt install -y nodejs npm
  • nodejs -v

Усё, я спыніўся на гэтым этапе. У прынцыпе, вынік мяне задавальняе. Магчыма, я перайду з DigitalOcean куды-небудзь бліжэй да Расіі і танней. Але паколькі я ўжо прайшоў усе колы верыфікацыі на сайце і ўсё рабіў там, я паказваў на іх прыкладзе. Да таго ж іх стартавыя 100 долараў - выдатны плацдарм для трэніровак.

PS Асобная падзяка аўтару вось гэтага гіста, які паслужыў асновай усіх вышэйпералічаных дзеянняў. Ён у некаторых момантах не працуе для Laravel 7, я гэта паправіў.

PPS Калі вы раптам топавы інжынер, які думае камандамі з bash, калі ласка, не судзіце строга. Магчыма, вам узровень гэтага артыкула здасца нізкаватым, але я быў бы рады знайсці такі, калі ён мне быў патрэбны. Калі ёсць прапановы па паляпшэнні, я абедзвюма рукамі "за".

Крыніца: habr.com

Дадаць каментар