Вырашыў я тут сваё партфоліё зрабіць на Laravel 7. Каб галоўная старонка была лендынгам, а ўсю інфармацыю на ёй можна было мяняць з дапамогай адмінкі. Не сутнасць. Справа дайшла да дэплою. Знайшоў пару добрых тутарыялаў, як гэта зрабіць на паўнавартасным серверы са ўсімі замарочкамі. У дэплоі я не вельмі моцны, я ўвогуле больш фронт, чым фулстэк. І, калі пісаць і тэставаць на PHP я яшчэ магу, то да кіравання серверам і да т.п. я яшчэ не дарос. Але прыйшлося разбірацца.
Цяпер пройдземся па ўсіх кроках, пачынальна з запуску праз SSH і сканчаючы працоўным сайтам. Паспрабуем абысці ўсе падводныя камяні.
Магчыма, вы зможаце знайсці аналагічныя інструкцыі ў інтэрнэце. Бо я ж у рэшце рэшт знайшоў. Праўда не ў адным месцы, не без дапамогі StackOverflow і ці наўрад на рускай. Я памучыўся. Таму вырашыў вам жыццё спрасціць.
Рабіць мы ўсё будзем з драплетам на DigitalOcean. Гэта, вядома, неабавязкова, выбірайце любы хостынг. Дайдзеце да працоўнага сервера на Ubuntu, вяртайцеся. Для тых, хто ўсё ж вырашыў рабіць на DigitalOcean, будуць яшчэ парады па наладзе дамена. А таксама
Усе спецыфічныя для 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. Калі ўсё ідзе добра, вы павінны ўбачыць наступнае.
Усталёўваны 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
Вы павінны ўбачыць нешта падобнае:
Цяпер гэты файл можна выдаліць: 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 Асобная падзяка аўтару
PPS Калі вы раптам топавы інжынер, які думае камандамі з bash, калі ласка, не судзіце строга. Магчыма, вам узровень гэтага артыкула здасца нізкаватым, але я быў бы рады знайсці такі, калі ён мне быў патрэбны. Калі ёсць прапановы па паляпшэнні, я абедзвюма рукамі "за".
Крыніца: habr.com