
Ho deciso di creare un portfolio su Laravel 7. Volevo che la homepage fosse un landing page, con la possibilità di cambiare tutte le informazioni tramite il pannello di amministrazione. Ma non è questo il punto. Siamo arrivati al deployment. Ho trovato un paio di buoni tutorial su come farlo su un server completo con tutte le complicazioni. Non sono molto esperto di deployment, sono più un frontend che un fullstack. Se posso ancora scrivere e testare in PHP, non sono ancora alla pari con la gestione del server e simili. Ma ho dovuto informarmi.
Ora passeremo attraverso tutti i passaggi, dal lancio tramite SSH fino al sito web funzionante. Cercheremo di evitare tutte le trappole.
È possibile trovare istruzioni simili in internet. Infondo, anche io le ho trovate. Anche se non in un unico posto, non senza l'aiuto di StackOverflow e probabilmente non in russo. Ho faticato. Perciò ho deciso di semplificarvi la vita.
Faremo tutto con un droplet su DigitalOcean. Questo, ovviamente, non è obbligatorio, scegliete qualsiasi hosting. Arrivate a un server funzionante su Ubuntu, poi tornate. Per coloro che hanno deciso di utilizzare DigitalOcean, ci saranno anche consigli sulla configurazione del dominio. Inoltre, .
Tutti i passaggi specifici per DigitalOcean saranno forniti in note simili.
Iniziamo.
TL;DR (solo comandi principali)
Creiamo un utente
ssh root@[IP-del-tuo-droplet]adduser laravelusermod -aG sudo laravelsu laravel
Aggiungiamo la sua SSH
mkdir ~/.sshchmod 700 ~/.sshvim ~/.ssh/authorized_keys- Incolliamo la chiave pubblica
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/
Impostazione di base:
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;
}
}Solo configurazione HTTP per 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;
}
}Configurazione HTTPS per 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: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 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
Creiamo un droplet su DigitalOcean e registriamo una nuova chiave SSH
Credo sinceramente che riuscirai a registrarti su DigitalOcean. Non è facile, con molte verifiche e altre complicazioni. Se hai sempre un errore di rete durante la verifica con documenti, prova a fare tutto tramite VPN, dovrebbe aiutare.
Nel menu in alto, clicchiamo Crea->Droplets. Selezioniamo Ubuntu.
Non appena ci siamo registrati, riceverai 100$ sul tuo conto. Ma non illuderti. Hai solo 60 giorni per spenderli. E sono davvero pochi. Potresti, come me, voler utilizzare un piano più costoso, per poi, quando inizieranno ad arrivare soldi veri, passare a uno più economico. Ti dico subito, non sarà possibile. Puoi solo aumentare, non ridurre. Ecco come stanno le cose. Io scelgo Standard->$5.
La regione che scelgo è la più vicina a noi Francoforte. Rete VPC->default-fra1
Effettuiamo subito l'autenticazione tramite SSH. Clicchiamo su Nuova chiave SSH. Se non hai SSH, a destra c'è un'istruzione molto semplice. Apri il terminale bash, incolla
ssh-keygen. Poi accedi al file con la chiave pubblica/Users/<Ваше имя пользователя>/.ssh/id_rsa.pub(o semplicementecat ~/.ssh/id_rsa.pub), copia il contenuto e incollalo nella finestra a sinistra. Il nome può essere qualsiasi.Inventiamo un hostname per il droplet.
Clicchiamo su Crea Droplet
Creiamo un nuovo utente
ssh root@[IP-del-tuo-droplet]- Sei sicuro di voler continuare a connetterti (sì/no/[fingerprint])?
sì - Inserisci la tua password SSH
- Creiamo un utente laravel:
adduser laravel - Inserisci la password e altre informazioni (io inserisco solo il nome completo)
- Aggiungiamo l'utente al gruppo sudo:
usermod -aG sudo laravel
SSH per il nuovo utente
- Passa al nuovo utente:
su laravel
Tutte le operazioni successive, fino alla fine dell'articolo, verranno eseguite a nome dell'utente laravel. Quindi, se vi siete interrotti, riconnettetevi e inserite su laravel
mkdir ~/.sshchmod 700 ~/.sshvim ~/.ssh/authorized_keys
Abbiamo aperto il file in Vim. Se non lo conoscete affatto, potete lavorare in Nano, è una vostra scelta.
I comandi di base di Vim
Per poter utilizzare l'editor Vim durante l'articolo, è sufficiente conoscere quanto segue.
- In Vim ci sono diversi modalità: la modalità normale (Normal mode), in cui si immettono comandi e si selezionano modalità e altre.
- Per uscire da qualsiasi modalità e tornare alla modalità normale, è sufficiente premere
Esc - Per muoversi: si possono usare semplicemente le frecce
- Uscire senza salvare
<Normal mode>::q! - Uscire e salvare
<Normal mode>::wq - Passare alla modalità di inserimento testo
<Normal mode>:i(da inglese. insert)
- Inseriamo la nostra chiave pubblica (che abbiamo creato sopra)
- Proteggere da modifiche:
chmod 600 ~/.ssh/authorized_keys
Impostiamo il firewall
- Visualizziamo tutte le impostazioni disponibili:
sudo ufw app list - Consentiamo OpenSSH (altrimenti verremo bloccati):
sudo ufw allow OpenSSH - Avviamo il firewall:
sudo ufw enable,y - Controllando:
sudo ufw status
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)Tutto a posto.
Installiamo Nginx
Durante l'installazione a volte verrà chiesto "Sei sicuro?". Rispondete y (beh, solo se siete sicuri).
sudo apt updatesudo apt install nginx
Aggiungiamo Nginx alle impostazioni del firewall
sudo ufw app listsudo ufw allow 'Nginx HTTP'sudo ufw status
Stato: attivo
Azione Da
-- ------ ----
OpenSSH CONSENTI Ovunque
Nginx HTTP CONSENTI Ovunque
OpenSSH (v6) CONSENTI Ovunque (v6)
Nginx HTTP (v6) CONSENTI Ovunque (v6)Accedi al tuo IP. Se tutto va bene, dovresti vedere quanto segue.

Installiamo MySQL
sudo apt install mysql-server- Eseguiamo lo script automatico per la protezione
sudo mysql_secure_installation
Rispondi alle domande poste. Se non sai cosa rispondere, ecco alcune opzioni consigliate:
Valida il plugin della password —
NRimuovere gli utenti anonimi? —
YDisallow root login remotely? —
NRimuovi il database di prova e l'accesso ad esso? —
NRicarica ora le tabelle dei privilegi? —
YAccedi a MySQL:
sudo mysqlControlliamo i metodi di accesso:
SELECT user,authentication_string,plugin,host FROM mysql.user;Impostiamo la password per root:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '';Controlliamo di nuovo i metodi di accesso:
SELECT user,authentication_string,plugin,host FROM mysql.user;Applichiamo le modifiche e usciamo da MySQL:
FLUSH PRIVILEGES;eexitOra, per accedere a MySQL, è necessario utilizzare
mysql -u root -pe inserire la password
Installiamo PHP
Utilizzeremo un repository di terze parti di
sudo apt updatesudo apt install -y curl wget gnupg2 ca-certificates lsb-release apt-transport-httpssudo apt-add-repository ppa:ondrej/phpsudo apt update
Ora scegliamo. Per Laravel 7 possiamo scegliere PHP 7.3 o 7.4. La differenza sarà solo nei numeri 3 e 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) gestisce le richieste PHP. mysql, ovviamente, serve per lavorare con MySQL.
D'ora in poi farò tutto su 7.4.
Configuriamo Nginx
sudo vim /etc/nginx/sites-available/
Invece di "", scrivi il dominio (ad esempio, mysite.ru), che desideri utilizzare in futuro. Se non ne hai ancora uno, scrivi qualsiasi cosa, poi ripeti semplicemente le azioni in questo capitolo per il tuo dominio quando lo scegli.
Inserisci quanto segue:
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;
}
}Se hai scelto la versione 7.3 invece di php7.4-fpm.sock inserisci php7.4-fpm.sock.
Ascoltiamo la porta 80 su server_name, quando riceviamo una richiesta alla radice /var/www/html prendiamo il file index. Se dopo server_name c'è qualcosa, cerchiamo quel file. Se non lo troviamo, restituiamo un 404. Se termina con .php, lo passiamo attraverso fpm. Se ci sono .ht, vietiamo (403).
- Creiamo un link da
sites-availableinsites-enabled:sudo ln -s /etc/nginx/sites-available/ /etc/nginx/sites-enabled/ - Rimuoviamo il link a
default:sudo unlink /etc/nginx/sites-enabled/default - Controlliamo gli errori:
sudo nginx -t - Riavviamo:
sudo systemctl reload nginx
Controlliamo il funzionamento:
sudo vim /var/www/html/info.php- Scriviamo:
<?php phpinfo(); - Andiamo a
/info.php
Dovresti vedere qualcosa di simile:

Ora questo file può essere eliminato: sudo rm /var/www/html/info.php
Installiamo 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 unzipAccedi a MySQL:
mysql -u root -pCreiamo un database con il nome laravel:
CREATE DATABASE laravel DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;Forniamo accesso root a laravel:
GRANT ALL ON laravel.* TO 'root'@'localhost' IDENTIFIED BY '';FLUSH PRIVILEGES;exitcd /var/www/htmlCreiamo una cartella per il progetto:
sudo mkdir -pForniamo all'utente laravel diritti sul progetto:
sudo chown laravel:laravel
Poi dobbiamo trasferire il progetto. Ad esempio, clonando da Github.
cd ./git clone .
Vale la pena considerare che, se non hai salvato i file statici (ad esempio, da /public) su Github, quindi non li avrai. Io, ad esempio, ho creato un ramo separato per risolvere questo problema. deploy, da cui ho già clonato: git clone -b --single-branch ..
- Installa le dipendenze:
composer install - Crea .env:
vim .env
La versione base appare così:
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=Se stai copiando il tuo .env, sostituisci APP_ENV con production, APP_DEBUG con false e inserisci le impostazioni corrette per MySQL.
- Migriamo il database:
php artisan migrate - Generiamo il codice:
php artisan key:generate
Modifichiamo i permessi:
sudo chown -R $USER:www-data storagesudo chown -R $USER:www-data bootstrap/cachechmod -R 775 storagechmod -R 775 bootstrap/cache
L'ultima cosa che resta è riconfigurare Nginx per 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;
}
}Come l'ultima volta, se hai scelto la versione 7.3 invece di php7.4-fpm.sock inserisci php7.4-fpm.sock.
Configurazione del dominio su DigitalOcean
In realtà, è tutto molto semplice. Acquisti un dominio (dove vuoi), poi vai su DigitalOcean in Crea->Domains/DNS. Nel campo Aggiungi un dominio inserisci questo dominio e premi aggiungi. Poi vai nelle impostazioni del dominio e nel campo HOSTNAME inserisci @. Scegli il progetto e premi Crea record.
Ora vai sul sito dove hai acquistato il dominio, trova "DNS Servers" (o qualcosa di simile) e inserisci i server di DigitalOcean (ovverons1.digitalocean.com,ns2.digitalocean.com,ns3.digitalocean.com). Ora devi aspettare un po' (o molto) affinché queste impostazioni vengano propagate. Fatto!
L'unico problema è che il tuo sito si aprirà solo come HTTP. Per avere HTTPS, passiamo alla prossima parte.
Configuriamo HTTPS
Installiamo certbot e gli passiamo il nome di dominio (formato mysite.ru) e il nome di dominio con 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.
Ora bisogna riconfigurare Nginx (non dimenticare di inserire i tuoi valori):
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: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 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;
}
}Credo che ormai tu abbia capito cosa cambiare per PHP 7.3.
In realtà, qui è tutto molto semplice. Basta reindirizzare tutte le richieste da HTTP (porta 80) a HTTPS (porta 443). E qui facciamo tutto come prima, ma già con cifratura.
Resta da impostare le autorizzazioni nel firewall:
sudo nginx -tsudo ufw app listsudo ufw allow 'Nginx HTTPS'sudo ufw statussudo systemctl reload nginx
Ora tutto dovrebbe funzionare come si deve.
[Дополнительно] Установка Node.js
Se mai avessi bisogno di eseguire comandi npm direttamente sul server, è necessario installare Node.js.
sudo apt updatesudo apt install -y nodejs npmnodejs -v
Ecco, mi fermo a questo punto. In linea di massima, il risultato mi soddisfa. Forse passerò a un servizio più vicino alla Russia e più economico rispetto a DigitalOcean. Ma dato che ho già completato tutti i passaggi di verifica sul sito e ho fatto tutto lì, ho usato il loro esempio. Inoltre, i loro 100 dollari di partenza rappresentano un ottimo punto di partenza per allenamenti.
P.S. Un ringraziamento speciale all'autore , che ha servito da base per tutte le azioni sopra menzionate. In alcuni punti non funziona per Laravel 7, l'ho corretto.
P.P.S. Se sei un ingegnere esperto che pensa in comandi bash, ti prego di non essere troppo severo. Potrebbe sembrarti che il livello di questo articolo sia un po' basso, ma sarei felice di trovarne uno così quando ne avevo bisogno. Se hai suggerimenti per migliorarne il contenuto, sono tutto orecchi.
Fonte: habr.com
