Am decis să-mi fac portofoliul folosind Laravel 7. Pentru ca pagina principală să fie o pagină de destinație, iar toate informațiile de pe ea să poată fi modificate folosind panoul de administrare. Nu ideea. S-a ajuns la desfășurare. Am găsit câteva tutoriale bune despre cum să fac asta pe un server cu drepturi depline, cu toate problemele. Nu sunt foarte puternic în implementare; în general, sunt mai mult în față decât în stack complet. Și, dacă mai pot scrie și testa în PHP, atunci înainte de a gestiona serverul etc. Încă nu am crescut. Dar a trebuit să-mi dau seama.
Acum vom parcurge toți pașii, începând cu lansarea prin SSH și terminând cu site-ul de lucru. Vom încerca să evităm toate capcanele.
Este posibil să găsiți instrucțiuni similare online. La urma urmei, în sfârșit l-am găsit. Adevărat, nu într-un singur loc, nu fără ajutorul lui StackOverflow și cu greu în rusă. Am suferit. De aceea am decis să-ți simplific viața.
Vom face totul cu o picătură pe DigitalOcean. Acest lucru, desigur, nu este necesar; alegeți orice găzduire. Când ajungeți la un server de lucru pe Ubuntu, reveniți. Pentru cei care încă decid să o facă pe DigitalOcean, vor exista mai multe sfaturi despre configurarea unui domeniu. Și
Toți pașii specifici DigitalOcean vor fi indicați în note de subsol ca acestea.
Să începem.
TL;DR (numai comenzi de bază)
Creați un utilizator
ssh root@[IP-адрес вашего дроплета]
adduser laravel
usermod -aG sudo laravel
su laravel
Adăugați SSH la el
mkdir ~/.ssh
chmod 700 ~/.ssh
vim ~/.ssh/authorized_keys
- Introduceți cheia publică
chmod 600 ~/.ssh/authorized_keys
Firewall
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/<Ваш домен>
Configurare de bază:
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;
}
}
Doar configurarea 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 <Ваш домен или 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;
}
}
Setare 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/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
Creați o picătură pe DigitalOcean și înregistrați o nouă cheie SSH
Cred cu adevărat că vă veți da seama cum să vă înregistrați la DigitalOcean. Nu este ușor, cu multe verificări și alte lucruri. Dacă primiți în mod constant o eroare de rețea la verificarea utilizării documentelor, încercați să faceți totul printr-un VPN, ar trebui să vă ajute.
În meniul din partea de sus, faceți clic Crea->Picături. Alege Ubuntu.
De îndată ce vă înregistrați, veți primi 100 USD în contul dvs. Dar nu te lăsa păcălit. Ai doar 60 de zile să-l petreci. Și asta este foarte puțin. S-ar putea, ca și mine, să doriți să utilizați un plan mai scump, pentru ca mai târziu, când încep să curgă banii reali, să puteți trece la unul mai ieftin. Îți spun imediat că nu va funcționa. Îl poți crește, dar nu îl poți reduce. Așa merge. aleg Standard->$5.
Aleg regiunea cea mai apropiată de noi Frankfurt. Rețeaua VPC->implicit-fra1
Vom efectua imediat autentificarea prin SSH. Clic Noua cheie SSH. Dacă nu aveți SSH, în dreapta sunt instrucțiuni foarte simple. Deschideți un terminal bash și lipiți
ssh-keygen
. Apoi mergem la fișierul cu cheia publică/Users/<Ваше имя пользователя>/.ssh/id_rsa.pub
(sau pur și simplucat ~/.ssh/id_rsa.pub
), copiați conținutul și lipiți-l în fereastra din stânga. Orice nume.Am venit cu un nume de gazdă pentru picătură.
presa Creați picătură
Creați un utilizator nou
ssh root@[IP-адрес вашего дроплета]
- Sigur doriți să continuați conectarea (da/nu/[amprenta])?
yes
- Introduceți parola SSH
- Creați un utilizator laravel:
adduser laravel
- Introduceți parola și alte informații (eu introduc doar numele complet)
- Adăugați utilizatorul în grupul sudo:
usermod -aG sudo laravel
SSH pentru utilizator nou
- Comutați la noul utilizator:
su laravel
Efectuăm toate acțiunile în continuare, până la sfârșitul articolului, în numele utilizatorului laravel. Prin urmare, dacă sunteți întrerupt brusc, reconectați-vă și intrați su laravel
mkdir ~/.ssh
chmod 700 ~/.ssh
vim ~/.ssh/authorized_keys
Am deschis fișierul în Vim. Dacă nu ești deloc familiarizat cu el, poți lucra în Nano, dreptate.
Cele mai elementare comenzi Vim
Pentru a utiliza editorul Vim pe parcursul articolului, trebuie doar să știți următoarele.
- Vim are diferite moduri: Modul normal, în care introdu comenzi și selectezi moduri și altele.
- Pentru a ieși din orice mod și a reveni la modul normal, trebuie doar să apăsați
Esc
- Deplasați-vă: puteți utiliza doar săgețile
- Iesire fara salvare
<Normal mode>
::q!
- Ieșiți și salvați
<Normal mode>
::wq
- Comutați la modul de introducere a textului
<Normal mode>
:i
(din engleză. insera)
- Introducem cheia noastră publică (ceea ce am făcut mai sus)
- Ne protejăm împotriva schimbărilor:
chmod 600 ~/.ssh/authorized_keys
Instalarea unui firewall
- Să ne uităm la toate setările disponibile:
sudo ufw app list
- Permite OpenSSH (altfel ne va bloca):
sudo ufw allow OpenSSH
- Să lansăm firewall-ul:
sudo ufw enable
,y
- Verificăm:
sudo ufw status
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Totul e bine.
Instalarea Nginx
În timpul instalării, uneori vi se va întreba „Ești sigur?” Răspuns y
(bine, doar daca esti sigur).
sudo apt update
sudo apt install nginx
Adăugarea Nginx la setările paravanului de protecție
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)
Accesați IP-ul dvs. Dacă totul merge bine, ar trebui să vedeți următoarele.
Instalarea MySQL
sudo apt install mysql-server
- Rulați un script de protecție automată
sudo mysql_secure_installation
Răspunde la întrebările puse. Dacă nu știi ce să răspunzi, iată câteva opțiuni sugerate:
-
Validați pluginul pentru parolă -
N
-
Eliminați utilizatori anonimi? —
Y
-
Nu permiteți conectarea la root de la distanță? —
N
-
Eliminați baza de date de testare și accesul la ea? —
N
-
Reîncărcați acum tabelele de privilegii? —
Y
-
Să mergem la MySQL:
sudo mysql
-
Să ne uităm la metodele de acces:
SELECT user,authentication_string,plugin,host FROM mysql.user;
-
Setați o parolă pentru root:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '<Ваш пароль для MySQL>';
-
Să ne uităm din nou la metodele de acces:
SELECT user,authentication_string,plugin,host FROM mysql.user;
-
Aplicați modificările și părăsiți MySQL:
FLUSH PRIVILEGES;
иexit
-
Acum, pentru a vă conecta la MySQL, trebuie să utilizați
mysql -u root -p
și introduceți parola
Instalarea PHP
Să folosim un depozit terță parte de la
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
Acum hai să alegem. Pentru Laravel 7, puteți alege PHP 7.3 sau 7.4. Singura diferență va fi în numerele 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) funcționează cu solicitări PHP. mysql, desigur, pentru lucrul cu MySQL.
De acum înainte voi face totul pe 7.4.
Configurarea Nginx
sudo vim /etc/nginx/sites-available/<Ваш домен>
În loc de „<Domeniul dvs.>” introduceți domeniul (de exemplu, mysite.ru
) pe care doriți să le utilizați în viitor. Dacă nu aveți încă unul, scrieți unul, apoi repetați pașii din acest capitol pentru domeniul dvs. când îl selectați.
Introduceți următoarele:
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;
}
}
Dacă ați ales versiunea 7.3 php7.4-fpm.sock
scrie in php7.4-fpm.sock
.
Ascultați portul 80 server_name
când ajungem la cererea rădăcină /var/www/html
luați fișierul index. Dacă după server_name
Există ceva, căutăm un astfel de fișier. Dacă nu îl găsim, aruncăm 404. Dacă se termină cu .php
, alerga prin fpm
... Daca exista .ht
, interzice (403).
- Realizarea unui link de la
sites-available
вsites-enabled
:sudo ln -s /etc/nginx/sites-available/<Ваш домен> /etc/nginx/sites-enabled/
- Se elimină linkul către
default
:sudo unlink /etc/nginx/sites-enabled/default
- Verificarea erorilor:
sudo nginx -t
- Reporniți:
sudo systemctl reload nginx
Verificarea lucrarii:
sudo vim /var/www/html/info.php
- Noi scriem:
<?php phpinfo();
- Mergeți la
<Ваш IP>/info.php
Ar trebui să vezi așa ceva:
Acum acest fișier poate fi șters: sudo rm /var/www/html/info.php
Instalați 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
-
Să mergem la MySQL:
mysql -u root -p
-
Creați 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 '<Ваш пароль от MySQL>';
-
FLUSH PRIVILEGES;
-
exit
-
cd /var/www/html
-
Creați un folder pentru proiect:
sudo mkdir -p <Имя проекта>
-
Oferim utilizatorului laravel drepturi asupra proiectului:
sudo chown laravel:laravel <Имя проекта>
În continuare, trebuie să transferați proiectul. De exemplu, clonarea din Github.
cd ./<Имя проекта>
git clone <ссылка на проект> .
Merită să luați în considerare faptul că, dacă nu ați salvat fișiere statice (de exemplu, din /public
) pe Github, atunci, desigur, nu le veți avea. De exemplu, am creat un thread separat pentru a rezolva acest lucru deploy
, din care am clonat deja: git clone -b <имя ветки> --single-branch <ссылка на проект> .
.
- Instalarea dependențelor:
composer install
- Creați .env:
vim .env
Versiunea de bază a acesteia arată astfel:
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>
Dacă copiați .env, înlocuiți APP_ENV cu producție, APP_DEBUG cu false și introduceți setările corecte pentru MySQL.
- Migrarea bazei de date:
php artisan migrate
- Generarea codului:
php artisan key:generate
Modificarea permisiunilor:
sudo chown -R $USER:www-data storage
sudo chown -R $USER:www-data bootstrap/cache
chmod -R 775 storage
chmod -R 775 bootstrap/cache
Ultimul lucru rămas este să reconfigurați 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 <Ваш домен или 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;
}
}
Ca și data trecută, dacă ați ales versiunea 7.3 php7.4-fpm.sock
scrie in php7.4-fpm.sock
.
Configurarea unui domeniu pe DigitalOcean
Totul este de fapt foarte simplu. Cumperi un domeniu (oriunde), treci la DigitalOcean la Crea->Domenii/DNS... În câmp Adăugați un domeniu introduceți acest domeniu și faceți clic pe adăugare. Apoi accesați setările domeniului și câmpul NOMUL DE GĂȘTARE introduce @. Selectați un proiect și faceți clic Creați înregistrarea.
Acum accesați site-ul de unde ați cumpărat domeniul, găsiți acolo „Servere DNS” (sau ceva similar) și introduceți serverele DigitalOcean (și 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ă este că site-ul dvs. se va deschide numai ca HTTP. Pentru a avea HTTPS, treceți la următoarea parte.
Configurarea HTTPS
Instalați certbot și transmiteți-i numele de domeniu (format mysite.ru
) și numele de domeniu cu 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.<Ваш домен>
Acum trebuie să reconfigurați Nginx (nu uitați să vă înlocuiți valorile):
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ă înțelegeți deja ce trebuie schimbat pentru PHP 7.3.
Aici, de fapt, totul este simplu. Pur și simplu redirecționăm toate solicitările de la HTTP (portul 80) la HTTPS (portul 443). Și acolo facem totul la fel ca înainte, dar cu criptare.
Tot ce rămâne este să setați permisiunile în firewall:
sudo nginx -t
sudo ufw app list
sudo ufw allow 'Nginx HTTPS'
sudo ufw status
sudo systemctl reload nginx
Acum totul ar trebui să funcționeze așa cum ar trebui.
[Avansat] Instalarea Node.js
Dacă brusc trebuie să rulați comenzi npm direct pe server, trebuie să instalați Node.js.
sudo apt update
sudo apt install -y nodejs npm
nodejs -v
Gata, m-am oprit la faza asta. În principiu, sunt mulțumit de rezultat. Poate voi trece de la DigitalOcean undeva mai aproape de Rusia și mai ieftin. Dar din moment ce deja trecusem prin toate rundele de verificare de pe site și făcusem totul acolo, le-am arătat prin exemplu. În plus, cei 100 de dolari de pornire sunt o trambulină excelentă pentru antrenament.
PS Mulțumiri speciale autorului
PPS Dacă se întâmplă să fiți un inginer de top care gândește în comenzi bash, vă rugăm să nu judeca aspru. S-ar putea să găsiți acest articol ca fiind de un standard scăzut, dar m-aș fi bucurat să găsesc unul când aveam nevoie de unul. Dacă există sugestii de îmbunătățire, sunt de acord.
Sursa: www.habr.com