
Am decis să-mi creez un portofoliu pe Laravel 7. Cea mai importantă pagină va fi un landing page, iar tot conținutul de pe aceasta poate fi modificat prin intermediul panoului de administrare. Dar să trecem la lucru. Am ajuns la etapa de deploy. Am găsit câteva tutoriale utile despre cum să fac asta pe un server complet, cu toate detaliile tehnice. Nu sunt foarte bun la deploy, de fapt, mă pricep mai bine la front-end decât la full stack. Și, chiar dacă pot scrie și testa în PHP, în gestionarea serverelor nu am ajuns încă. Dar a trebuit să învăț.
Acum vom parcurge toți pașii, începând cu lansarea prin SSH și terminând cu un site funcțional. Vom încerca să evităm toate capcanele.
Poate veți găsi instrucțiuni similare pe internet. Până la urmă, eu am găsit. De fapt, nu într-un singur loc, ci cu ajutorul StackOverflow și probabil nu și în limba română. M-am chinuit. De aceea am decis să vă simplific viața.
Vom face totul cu un droplet pe DigitalOcean. Evident, nu este obligatoriu, alegeți orice serviciu de hosting. Odată ce ajungeți la un server funcțional pe Ubuntu, întoarceți-vă. Pentru cei care au decis să utilizeze DigitalOcean, vor exista și sfaturi pentru configurarea domeniului. De asemenea, .
Toți pașii specifici pentru DigitalOcean vor fi oferiți în note de subsol similare.
Să începem.
TL;DR (doar comenzile principale)
Creăm utilizatorul
ssh root@[IP-ul dropletului dvs.]adduser laravelusermod -aG sudo laravelsu laravel
Adăugăm cheia SSH
mkdir ~/.sshchmod 700 ~/.sshvim ~/.ssh/authorized_keys- Inserăm cheia publică
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/
Configurarea de bază:
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;
}
}Doar configurația HTTP pentru Laravel:
server {
listen 80;
listen [::]:80;
root /var/www/html//public;
index index.php index.html index.htm index.nginx-debian.html;
server_name ;
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;
}
}Configurare HTTPS pentru 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/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 -pCREATE DATABASE laravel DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;GRANT ALL ON laravel.* TO 'root'@'localhost' IDENTIFIED BY '';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
Creăm un droplet pe DigitalOcean și înregistrăm o nouă cheie SSH
Cred cu tărie că veți reuși să vă înregistrați pe DigitalOcean. Procesul nu este simplu, având multe verificări și alte complicații. Dacă întâmpinați o eroare de rețea în timpul verificării documentelor, încercați să faceți totul prin VPN, ar trebui să ajute.
În meniul de sus, apăsăm Creează->Droplets. Alegem Ubuntu.
Odată ce v-ați înregistrat, veți primi 100$ în cont. Dar nu vă lăsați păcăliți. Aveți doar 60 de zile pentru a-i cheltui. Și aceasta este foarte puțin. Puteți, ca și mine, să doriți să utilizați un plan mai scump, astfel încât, când vor începe să vină banii reali, să treceți la un plan mai ieftin. Vă spun de la început, nu va funcționa. Puteți să măriți, dar nu să micșorați. Așa stau lucrurile. Eu aleg Standard->$5.
Regiunea pe care o aleg este cea mai apropiată de noi Frankfurt. Rețea VPC->default-fra1
Vom face autentificarea imediat prin SSH. Facem clic pe Cheie SSH nouă. Dacă nu aveți SSH, în partea dreaptă există un ghid foarte simplu. Deschideți terminalul bash, lipiți
ssh-keygen. Apoi, intrați în fișierul cu cheia publică/Users/<Ваше имя пользователя>/.ssh/id_rsa.pubsau simplucat ~\/ .ssh\/ id_rsa.pub), copiați conținutul și lipiți în fereastra din stânga. Numele poate fi orice.Găsim un nume de gazdă pentru droplet.
Facem clic pe Creează Droplet
Creăm un nou utilizator
ssh root@[IP-ul dropletului dvs.]- Sunteți sigur că doriți să continuați conectarea (da/nu/[amprenta])?
da - Introduceți parola dvs. SSH
- Creăm utilizatorul laravel:
adduser laravel - Introduceți parola și alte informații (eu introduc doar Numele complet)
- Adăugăm utilizatorul în grupul sudo:
usermod -aG sudo laravel
SSH pentru noul utilizator
- Ne schimbăm pe noul utilizator:
su laravel
Toate acțiunile de aici, până la finalul articolului, le facem în numele utilizatorului laravel. Așadar, dacă vă întrerupeți, reconectați-vă și introduceți su laravel
mkdir ~/.sshchmod 700 ~/.sshvim ~/.ssh/authorized_keys
Am deschis fișierul în Vim. Dacă nu sunteți familiarizat cu acesta, puteți lucra în Nano, este dreptul dvs..
Cele mai de bază comenzi Vim
Pentru a utiliza editorul Vim pe parcursul articolului, trebuie doar să cunoașteți următoarele.
- În Vim există diferite moduri: modul normal (Normal mode), în care introduceți comenzi și alegeți moduri și altele.
- Pentru a ieși din orice mod și a reveni în modul normal, este suficient să apăsați
Esc - Pentru a vă deplasa: puteți folosi pur și simplu săgețile
- Ieșiți fără a salva
<Normal mode>::q! - Ieșiți și salvați
<Normal mode>::wq - Trebuie să intrați în modul de introducere a textului
<Normal mode>:i(de la engleză inserați)
- Lipim cheia publică (pe care am creat-o mai sus)
- Protejăm de modificări:
chmod 600 ~/.ssh/authorized_keys
Instalăm firewall-ul
- Vedem toate setările disponibile:
sudo ufw app list - Permitem OpenSSH (altfel ne va bloca):
sudo ufw allow OpenSSH - Pornim firewall-ul:
sudo ufw enable,Stabiliți o parolă și păstrați-o în siguranță! - Verificăm:
sudo ufw status
Status: activ
Către Acțiune De la
-- ------ ----
OpenSSH ALLOW Orice
OpenSSH (v6) ALLOW Orice (v6)Totul este în regulă.
Instalăm Nginx
Când instalați, uneori veți fi întrebat "Sunteți sigur?". Răspundeți Stabiliți o parolă și păstrați-o în siguranță! (numai dacă sunteți sigur).
sudo apt updatesudo apt install nginx
Adăugăm Nginx în setările firewall-ului
sudo ufw app listsudo ufw allow 'Nginx HTTP'sudo ufw status
Status: activ
Către Acțiune De la
-- ------ ----
OpenSSH PERMITE Oricine
Nginx HTTP PERMITE Oricine
OpenSSH (v6) PERMITE Oricine (v6)
Nginx HTTP (v6) PERMITE Oricine (v6)Accesați IP-ul dumneavoastră. Dacă totul merge bine, ar trebui să vedeți următoarele.

Instalăm MySQL
sudo apt install mysql-server- Porniți scriptul automat de securitate
sudo mysql_secure_installation
Răspundeți la întrebările puse. Dacă nu știți ce să răspundeți, iată variantele recomandate:
Plugin pentru validarea parolei —
NEliminați utilizatorii anonimi? —
YInterziceți conectarea root de la distanță? —
NEliminați baza de date de test și accesul la aceasta? —
NReîncărcați tabelele de privilegii acum? —
YIntrăm în MySQL:
sudo mysqlVizionăm metodele de acces:
SELECT user,authentication_string,plugin,host FROM mysql.user;Stabilim parola pentru root:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '';Verificăm din nou metodele de acces:
SELECT user,authentication_string,plugin,host FROM mysql.user;Aplicăm modificările și ieșim din MySQL:
FLUSH PRIVILEGES;șiexitAcum, pentru a intra în MySQL trebuie să folosiți
mysql -u root -pși să introduceți parola
Instalăm PHP
Vom folosi un depozit extern de
sudo apt updatesudo apt install -y curl wget gnupg2 ca-certificates lsb-release apt-transport-httpssudo apt-add-repository ppa:ondrej/phpsudo apt update
Acum alegem. Pentru Laravel 7, puteți alege PHP 7.3 sau 7.4. Diferența va fi doar în cifrele 3 și 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) lucrează cu cererile PHP. mysql, desigur, pentru a lucra cu MySQL.
În continuare, voi face totul pe 7.4.
Configurăm Nginx
sudo vim /etc/nginx/sites-available/
În loc de "", introduceți domeniul (de exemplu, mysite.ro), pe care doriți să-l folosiți în viitor. Dacă nu aveți unul încă, scrieți orice, apoi repetați pur și simplu pașii din acest capitol pentru domeniul dvs. atunci când îl alegeți.
Introducem următoarele:
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;
}
}Dacă ați ales versiunea 7.3 în loc de php7.4-fpm.sock introduceți php7.4-fpm.sock.
Ascultăm portul 80 la server_name, atunci când venim cu cererea în rădăcină /var/www/html luăm fișierul index. Dacă după server_name există altceva, căutăm un astfel de fișier. Nu găsim, aruncăm 404. Dacă se termină cu .php, trecem prin fpm. Dacă există .ht, interzicem (403).
- Facem un link din
sites-availableînsites-enabled:sudo ln -s /etc/nginx/sites-available/ /etc/nginx/sites-enabled/ - Ștergem linkul de la
default:sudo unlink /etc/nginx/sites-enabled/default - Verificăm erorile:
sudo nginx -t - Reîncărcăm:
sudo systemctl reload nginx
Verificăm funcționarea:
sudo vim /var/www/html/info.php- Scriem:
<?php phpinfo(); - Accesăm
/info.php
Ar trebui să vedeți ceva de genul:

Acum acest fișier poate fi șters: sudo rm /var/www/html/info.php
Instalăm 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 unzipIntrăm în MySQL:
mysql -u root -pCreăm o bază de date cu numele laravel:
CREATE DATABASE laravel DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;Oferim acces root la laravel:
GRANT ALL ON laravel.* TO 'root'@'localhost' IDENTIFIED BY '';FLUSH PRIVILEGES;exitcd /var/www/htmlCreăm un folder pentru proiect:
sudo mkdir -pOferim utilizatorului laravel drepturi pe proiect:
sudo chown laravel:laravel
Apoi trebuie să transferați proiectul. De exemplu, prin clonare de pe Github.
cd ./git clone .
Trebuie să luați în considerare că, dacă nu ați salvat fișierele statice (de exemplu, din /public) pe Github, atunci nu le veți avea, desigur. Eu, de exemplu, am creat o ramură separată pentru a rezolva asta, deploydin care am clonat deja: git clone -b --single-branch ..
- Instalăm dependențele:
composer install - Creăm .env:
vim .env
Versiunea de bază arată așa:
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=Dacă copiați .env-ul dvs., schimbați APP_ENV în production, APP_DEBUG în false și introduceți setările corecte pentru MySQL.
- Migram baza de date:
php artisan migrate - Generăm cod:
php artisan key:generate
Schimbăm permisiunile:
sudo chown -R $USER:www-data storagesudo chown -R $USER:www-data bootstrap/cachechmod -R 775 storagechmod -R 775 bootstrap/cache
Ultimul lucru care rămâne – reconfigurarea Nginx pentru 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 ;
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;
}
}Ca și data trecută, dacă ați ales versiunea 7.3 în loc de php7.4-fpm.sock introduceți php7.4-fpm.sock.
Configurarea domeniului pe DigitalOcean
Totul este, de fapt, foarte simplu. Cumpărați un domeniu (unde doriți), mergeți pe DigitalOcean la Creează->Domains/DNS. În câmpul Adăugați un domeniu introduceți acest domeniu, apăsați adăugați. Apoi mergeți la setările domeniului și în câmpul HOSTNAME introduceți @. Alegeți proiectul și apăsați Creează înregistrare.
Acum mergeți pe site-ul de unde ați cumpărat domeniul, găsiți acolo "Servere DNS" (sau ceva similar) și introduceți serverele DigitalOcean (anumens1.digitalocean.com,ns2.digitalocean.com,ns3.digitalocean.com). Acum trebuie să așteptați puțin (sau mult) până când aceste setări sunt acceptate. Gata!
Singura problemă – site-ul dvs. se va deschide doar ca HTTP. Pentru a avea HTTPS, trecem la partea următoare.
Configurăm HTTPS
Instalăm certbot și îi transmitem numele domeniului (format mysite.ro) și numele domeniului cu www (www.mysite.ro).
sudo add-apt-repository ppa:certbot/certbotsudo apt install python-certbot-nginxsudo certbot certonly --webroot --webroot-path=/var/www/html//public -d -d www.
Acum trebuie să reconfigurăm Nginx (nu uitați să introduceți valorile dvs.):
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;
}
}Cred că deja ați înțeles ce trebuie să schimbați pentru PHP 7.3.
Aici, de fapt, totul este simplu. Redirecționăm toate solicitările de la HTTP (portul 80) la HTTPS (portul 443). Iar acolo facem la fel ca înainte, dar deja cu criptare.
Rămâne să setăm permisiunile în firewall:
sudo nginx -tsudo ufw app listsudo ufw allow 'Nginx HTTPS'sudo ufw statussudo systemctl reload nginx
Acum totul ar trebui să funcționeze cum trebuie.
[Дополнительно] Установка Node.js
Dacă dintr-o dată aveți nevoie să rulați comenzi npm direct pe server, trebuie să instalați Node.js.
sudo apt updatesudo apt install -y nodejs npmnodejs -v
Totul, eu m-am oprit în acest pas. În principiu, rezultatul mă mulțumește. Poate că mă voi muta de la DigitalOcean undeva mai aproape de Rusia și mai ieftin. Dar, având în vedere că am parcurs toate etapele de verificare pe site și totul am făcut acolo, am arătat pe exemplul lor. În plus, cei 100 de dolari de început sunt o bază excelentă pentru antrenamente.
P.S. Mulțumiri speciale autorului , care a servit ca bază pentru toate acțiunile enumerate mai sus. În unele momente nu funcționează pentru Laravel 7, am corectat asta.
P.P.S. Dacă ești un inginer de top care gândește în comenzi bash, te rog să nu judeci prea aspru. Este posibil ca nivelul acestui articol să ți se pară prea scăzut, dar m-aș fi bucurat să găsesc așa ceva când aveam nevoie. Dacă ai sugestii de îmbunătățire, sunt foarte deschis la ele.
Sursa: habr.com
