
Реших да създам портфолио на Laravel 7. Главната страница да бъде лендинг, а цялата информация на нея да може да се променя чрез админка. Но не е важно. Стигнах до деплоя. Намерих няколко добри туториала как да го направя на функциониращ сървър с всички детайли. Не съм много силен в деплоя, по-скоро съм фронтенд разработчик, отколкото фулстек. И, ако мога да пиша и тествам на PHP, то управлението на сървъри и т.н. все още не ми е присъщо. Но трябваше да се запозная.
Сега ще преминем през всички стъпки, започвайки от стартирането през SSH и завършвайки с работещия сайт. Ще се опитаме да избегнем всички подводни камъни.
Може да намерите подобни инструкции в интернет. Нали в крайна сметка и аз намерих. Истина е, че не на едно място, не без помощта на StackOverflow и вероятно не на български. Поредната драма. Затова реших да улесня живота ви.
Всичко ще правим с дроплет в DigitalOcean. Разбира се, не е задължително, изберете всякакъв хостинг. Щом стигнете до работещ сървър на Ubuntu, се върнете. А за тези, които все пак решат да работят с DigitalOcean, ще има още съвети за настройка на домейна. Освен това .
Всички специфични стъпки за DigitalOcean ще бъдат посочени в подобни бележки.
Започваме.
TL;DR (само основните команди)
Създаваме потребител
ssh root@[IP-адрес на дроплета ви]adduser laravelusermod -aG sudo laravelsu laravel
Добавяме му SSH
mkdir ~/.sshchmod 700 ~/.sshvim ~/.ssh/authorized_keys- Поставяме публичния ключ
chmod 600 ~/.ssh/authorized_keys
Firewall
sudo ufw allow OpenSSHsudo ufw enablesudo ufw status
Nginx
sudo apt updatesudo apt install -y nginxsudo ufw allow 'Nginx HTTP'sudo ufw status
MySQL
sudo apt install -y mysql-serversudo mysql_secure_installation,NYNNYsudo mysqlALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '';SELECT user,authentication_string,plugin,host FROM mysql.user;FLUSH PRIVILEGES;exit
PHP
sudo apt updatesudo apt install -y curl wget gnupg2 ca-certificates lsb-release apt-transport-httpssudo apt-add-repository ppa:ondrej/phpsudo apt update7.3:
sudo apt install -y php7.3-fpm php7.3-mysql7.4:
sudo apt install -y php7.4-fpm php7.4-mysqlsudo 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 ;
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:
сървър {
слушай 80;
слушай [::]:80;
корен /var/www/html//public;
индекс index.php index.html index.htm index.nginx-debian.html;
server_name ;
местоположение / {
опитай_файлове $uri $uri/ /index.php?$query_string;
}
местоположение ~ .php$ {
включи snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
}
местоположение ~ /.ht {
откажи всички;
}
}Настройка на HTTPS за Laravel:
сървър {
слушай 80;
слушай [::]:80;
server_name www.;
връщане 301 https://$server_name$request_uri;
}
сървър {
слушай 443 ssl http2;
слушай [::]:443 ssl http2;
server_name www.;
корен /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:ECDHE-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.php index.html index.htm index.nginx-debian.html;
charset utf-8;
местоположение / {
опитай_файлове $uri $uri/ /index.php?$query_string;
}
местоположение ~ .php$ {
включи snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
}
местоположение ~ /.ht {
откажи всички;
}
местоположение ~ /.well-known {
разреши всички;
}
}sudo ln -s /etc/nginx/sites-available/ /etc/nginx/sites-enabled/sudo unlink /etc/nginx/sites-enabled/defaultsudo nginx -tsudo systemctl reload nginx
Laravel
7.3:
sudo apt install -y php7.3-mbstring php7.3-xml composer unzip7.4:
sudo apt install -y php7.4-mbstring php7.4-xml composer unzipmysql -u root -pСЪЗДАЙ БАЗА ДАННИ laravel DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;ДАЙ ВСИЧКИ ПРАВА НА laravel.* НА 'root'@'localhost' ИДЕНТИФИЦИРАН С '' ;FLUSH PRIVILEGES;exitcd /var/www/htmlsudo mkdir -psudo chown laravel:laravelcd ./git clone ./git clone -b --single-branch .composer installvim .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=php artisan migratephp artisan key:generatesudo chown -R $USER:www-data storagesudo chown -R $USER:www-data bootstrap/cachechmod -R 775 storagechmod -R 775 bootstrap/cache
HTTPS
sudo add-apt-repository ppa:certbot/certbotsudo apt install -y python-certbot-nginxsudo certbot certonly --webroot --webroot-path=/var/www/html//public -d -d www.sudo nginx -tsudo ufw allow 'Nginx HTTPS'sudo ufw statussudo systemctl reload nginx
Създайте дроплет на DigitalOcean и регистрирайте нов SSH ключ
Искрено вярвам, че сами ще се справите с регистрацията в DigitalOcean. Тя не е лесна, с много проверки и други неща. Ако по време на проверките с документи постоянно получавате грешка в мрежата, опитайте всичко да стане през VPN, трябва да помогне.
В горното меню натиснете Create->Дроплети. Изберете Ubuntu.
След като се регистрирате, ще получите $100 в сметката си. Но не се заблуждавайте. Имате само 60 дни, за да ги похарчите. А това е много малко. Може, както и аз, да искате да използвате по-скъп план, за да после, когато започнат реалните печалби, да преминете на по-евтин. Казвам директно, няма да стане. Можете да увеличавате, но не и да намалявате. Такива са нещата. Избирам Standard->$5.
Избирам региона, най-близък до нас Франкфурт. VPC мрежа->default-fra1
Ще направим аутентикация веднага чрез SSH. Натиснете Нов SSH ключ. Ако нямате SSH, вдясно има много проста инструкция. Отваряме bash терминал, поставяме
ssh-keygen. След това влизаме в файла с публичния ключ/Users/<Ваше имя пользователя>/.ssh/id_rsa.pub(или простоcat ~\/ .ssh\/ id_rsa.pub), копираме съдържанието и го поставяме в прозореца вляво. Името може да е всяко.Измисляме хостнейм за дроплета.
Натиснете Създайте Дроплет
Създаваме нов потребител
ssh root@[IP-адрес на дроплета ви]- Сигурни ли сте, че искате да продължите с връзката (да/не/[отпечатък])?
yes - Въведете паролата си за SSH
- Създаваме потребител laravel:
adduser laravel - Въведете паролата и друга информация (аз въвеждам само пълно име)
- Добавяме потребителя в групата sudo:
usermod -aG sudo laravel
SSH за новия потребител
- Преминаваме на новия потребител:
su laravel
Всички действия нататък, до края на статията, ще извършваме от името на потребителя laravel. Затова, ако случайно сте прекъснали, влезте отново и въведете su laravel
mkdir ~/.sshchmod 700 ~/.sshvim ~/.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
Статус: активен
До Действие От
-- ------ ----
OpenSSH Разрешено Отвсякъде
OpenSSH (v6) Разрешено Отвсякъде (v6)Всичко е наред.
Инсталираме Nginx
При инсталацията понякога ще ви питат "Сигурни ли сте?". Отговаряйте y (но само, ако сте сигурни).
sudo apt updatesudo apt install nginx
Добавяме Nginx в настройките на фаервола
sudo ufw app listsudo ufw allow 'Nginx HTTP'sudo ufw status
Статус: активен
Кому Действие Откуда
-- ------ ----
OpenSSH ДОПУСТИТЬ Везде
Nginx HTTP ДОПУСТИТЬ Везде
OpenSSH (v6) ДОПУСТИТЬ Везде (v6)
Nginx HTTP (v6) ДОПУСТИТЬ Везде (v6)Отидете на ваш IP. Ако всичко върви добре, трябва да видите следното.

Инсталираме MySQL
sudo apt install mysql-server- Стартираме автоматичния скрипт за защита
sudo mysql_secure_installation
Отговорете на зададените въпроси. Ако не знаете какво да отговорите, ето препоръчителните варианти:
Плъгин за валидация на пароли —
NДа премахнем анонимни потребители? —
YДа забраним отдалечен достъп на root? —
NДа премахнем тестовата база данни и достъпа до нея? —
NДа презаредим таблиците с права сега? —
YВлизаме в MySQL:
sudo mysqlВиждаме методите за достъп:
SELECT user,authentication_string,plugin,host FROM mysql.user;Установяваме парола за root:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '';Проверяваме методите за достъп отново:
SELECT user,authentication_string,plugin,host FROM mysql.user;Прилагаме промените и излизаме от MySQL:
FLUSH PRIVILEGES;иexitСега, за да влезете в MySQL, трябва да използвате
mysql -u root -pи да въведете парола
Инсталираме PHP
Ще използваме външен репозиторий от
sudo apt updatesudo apt install -y curl wget gnupg2 ca-certificates lsb-release apt-transport-httpssudo apt-add-repository ppa:ondrej/phpsudo 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 ;
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/ - Премахваме връзката на
по подразбиране:sudo unlink /etc/nginx/sites-enabled/default - Проверяваме за грешки:
sudo nginx -t - Презареждаме:
sudo systemctl reload nginx
Проверяваме работата:
sudo vim /var/www/html/info.php- Записваме:
<?php phpinfo(); - Преминаваме на
/info.php
Трябва да видите нещо подобно:

Сега този файл може да бъде изтрит: sudo rm /var/www/html/info.php
Инсталираме Laravel
7.3:
sudo apt install php7.3-mbstring php7.3-xml composer unzip7.4:
sudo apt install php7.4-mbstring php7.4-xml composer unzipВлизаме в MySQL:
mysql -u root -pСъздаваме БД с име laravel:
СЪЗДАЙ БАЗА ДАННИ laravel DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;Предоставяме root достъп до laravel:
ДАЙ ВСИЧКИ ПРАВА НА laravel.* НА 'root'@'localhost' ИДЕНТИФИЦИРАН С '' ;FLUSH PRIVILEGES;exitcd /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=Ако копирате своя .env, заменете APP_ENV на production, APP_DEBUG на false и впишете правилните настройки за MySQL.
- Мигрираме базата данни:
php artisan migrate - Генерираме кода:
php artisan key:generate
Променяме правата:
sudo chown -R $USER:www-data storagesudo chown -R $USER:www-data bootstrap/cachechmod -R 775 storagechmod -R 775 bootstrap/cache
Последното, което остава, е да конфигурираме Nginx за Laravel:
sudo vim /etc/nginx/sites-available/
сървър {
слушай 80;
слушай [::]:80;
корен /var/www/html//public;
индекс index.php index.html index.htm index.nginx-debian.html;
server_name ;
местоположение / {
опитай_файлове $uri $uri/ /index.php?$query_string;
}
местоположение ~ .php$ {
включи snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
}
местоположение ~ /.ht {
откажи всички;
}
}Както и миналия път, ако сте избрали версия 7.3 вместо php7.4-fpm.sock впишете php7.4-fpm.sock.
Настройка на домейна в DigitalOcean
Всичко е наистина много просто. Купувате домейн (във всяка платформа), преминавате в DigitalOcean в Create->Domains/DNS. В полето Добавете домейн вписвате този домейн, натискате добави. След това отивате в настройките на домейна и в полето HOSTNAME вписвате @. Избирате проекта и натискате Създаване на запис.
Сега отивате на сайта, където купихте домейна, намирате "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/certbotsudo apt install python-certbot-nginxsudo certbot certonly --webroot --webroot-path=/var/www/html//public -d -d www.
Сега трябва да конфигурираме Nginx (не забравяйте да подмените вашите стойности):
сървър {
слушай 80;
слушай [::]:80;
server_name www.;
връщане 301 https://$server_name$request_uri;
}
сървър {
слушай 443 ssl http2;
слушай [::]:443 ssl http2;
server_name www.;
корен /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:ECDHE-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.php index.html index.htm index.nginx-debian.html;
charset utf-8;
местоположение / {
опитай_файлове $uri $uri/ /index.php?$query_string;
}
местоположение ~ .php$ {
включи snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
}
местоположение ~ /.ht {
откажи всички;
}
местоположение ~ /.well-known {
разреши всички;
}
}Мисля, че вече разбрахте какво трябва да промените за PHP 7.3.
Тук, всъщност, всичко е просто. Пренасочваме всички заявки от HTTP (порт 80) на HTTPS (порт 443). А там правим същото, като преди, но с шифроване.
Остава да зададем правата в защитната стена:
sudo nginx -tsudo ufw app listsudo ufw allow 'Nginx HTTPS'sudo ufw statussudo systemctl reload nginx
Сега всичко трябва да функционира, както трябва.
[Дополнительно] Установка Node.js
Ако случайно ви е нужно да стартирате npm команди директно на сървъра, трябва да инсталирате Node.js.
sudo apt updatesudo apt install -y nodejs npmnodejs -v
Всичко, спирам на този етап. В принципе, резултатът ми удовлетворява. Може би, ще премина от DigitalOcean на някое по-близко до Русия и по-евтино. Но тъй като вече преминах през всички проверки на сайта и всичко беше направено там, показах на техния пример. Освен това, техните стартови 100 долара са отлична основа за тренировки.
P.S. Отделна благодарност на автора , който послужи за основа на всички изброени по-горе действия. Той в някои моменти не работи за Laravel 7, аз го поправих.
P.P.S. Ако сте топ инженер, който мисли в bash команди, моля, не бъдете прекалено строги. Може би нивото на тази статия ще ви се стори ниско, но бих се радвал да я намеря, когато ми беше необходима. Ако имате предложения за подобрение, бъдете сигурни, че ще ги приветствам.
Източник: habr.com
