
Ho deciso di creare il mio portfolio su Laravel 7. La homepage sarà un landing page, e tutte le informazioni su di essa potranno essere modificate tramite il pannello di amministrazione. Ma non è questo il punto. Siamo arrivati al deployment. Ho trovato un paio di buone guide su come farlo su un server completo con tutti i suoi problemi. Non sono molto esperto in deployment, in realtà sono più un front-end che un full-stack. E, se riesco ancora a scrivere e testare su PHP, non sono ancora pronto per gestire server e simili. Ma ho dovuto approfondire.
Adesso passeremo attraverso tutti i passaggi, partendo dall'avvio tramite SSH e finendo con il sito web funzionante. Cercheremo di evitare tutte le insidie nascoste.
Potresti trovare istruzioni simili su internet. Alla fine, io le ho trovate. Anche se non in un solo posto, non senza l'aiuto di StackOverflow e probabilmente non in russo. Ho faticato. Ecco perché ho deciso di semplificarti la vita.
Faremo tutto con un droplet su DigitalOcean. Questo, naturalmente, non è obbligatorio, puoi scegliere qualsiasi hosting. Una volta raggiunto il server funzionante su Ubuntu, torna da noi. Per coloro che hanno deciso di usare DigitalOcean, ci saranno anche consigli su come impostare il dominio. Inoltre, .
Tutti i passaggi specifici per DigitalOcean saranno forniti in note a piè di pagina simili.
Iniziamo.
TL;DR (solo i comandi principali)
Creiamo un utente
ssh root@[IP-del-tuo-droplet]adduser laravelusermod -aG sudo laravelsu laravel
Aggiungiamo 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 la 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 ci siate riusciti da soli a registrarvi su DigitalOcean. Non è semplice, con un sacco di verifiche e altre incombenze. Se riscontrate errori di rete durante la verifica con i documenti, provate a farlo tramite VPN, dovrebbe aiutare.
Nel menu in alto clicchiamo Crea->Droplets. Selezioniamo Ubuntu.
Non appena ci si registra, si riceveranno 100$ sul conto. Ma non illudetevi. Avete solo 60 giorni per spenderli. E sono davvero pochi. Potreste, come me, voler utilizzare un piano più costoso, per poi, quando inizieranno ad arrivare soldi veri, passare a uno più economico. Vi avviso subito, non sarà possibile. È possibile aumentare, ma non ridurre. Queste sono le regole. Io scelgo Standard->$5.
Sceglierò la regione più vicina a noi Francoforte. Rete VPC->default-fra1
Procediamo subito con l'autenticazione tramite SSH. Clicchiamo su Nuova chiave SSH. Se non avete SSH, a destra c'è una guida molto semplice. Aprite il terminale bash e incollate
ssh-keygen. Poi accediamo al file con la chiave pubblica/Users/<Ваше имя пользователя>/.ssh/id_rsa.pub(o semplicementecat ~\/s/.ssh/id_rsa.pub), copiamo il contenuto e lo incolliamo nella finestra a sinistra. Qualsiasi nome va bene.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 collegarti (sì/no/[fingerprint])?
sì - Inserisci la tua password SSH
- Creiamo un utente laravel:
adduser laravel - Inserisci la password e le altre informazioni (io inserisco solo il Nome Completo)
- Aggiungiamo l'utente al gruppo sudo:
usermod -aG sudo laravel
SSH per il nuovo utente
- Passiamo al nuovo utente:
su laravel
Tutte le azioni successive, fino alla fine dell'articolo, verranno eseguite con il nome utente laravel. Quindi, se vi siete interrotti, rientrate 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, a vostra discrezione..
Comandi base di Vim
Per utilizzare l'editor Vim durante l'articolo, è sufficiente conoscere quanto segue.
- In Vim ci sono diversi modi: il modo normale (Normal mode), in cui immettete comandi e scegliete modalità e altro.
- Per uscire da qualsiasi modalità e tornare alla modalità normale, basta premere
Esc - Spostarsi: si può semplicemente usare le frecce
- Uscire senza salvare
<Normal mode>::q! - Uscire e salvare
<Normal mode>::wq - Passare alla modalità di inserimento testo
<Normal mode>:i(da "insert" in inglese) Inseriamo la nostra chiave pubblica (quella che abbiamo creato sopra))
- Proteggere dalle modifiche:
- Impostiamo il firewall
chmod 600 ~/.ssh/authorized_keys
Controlliamo tutte le impostazioni disponibili:
- sudo ufw app list
Consenti OpenSSH (altrimenti ci bloccherà): - Avviamo il firewall:
sudo ufw allow OpenSSH - Stato: attivoA Azione Da -- ------ ---- OpenSSH CONSENTI Ovunque OpenSSH (v6) CONSENTI Ovunque (v6)
sudo ufw enable,y - Controlliamo:
sudo ufw status
Tutto va bene.Impostiamo Nginx
Durante l'installazione a volte vi verrà chiesto "Sei sicuro?" Rispondete
(solo se siete sicuri). y sudo apt install nginx
sudo apt updateAggiungiamo Nginx alle impostazioni del firewall
Aggiungiamo Nginx nelle impostazioni del firewall
Consenti OpenSSH (altrimenti ci bloccherà):sudo 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)Visita il tuo IP. Se tutto va bene, dovresti vedere quanto segue.

Installiamo MySQL
sudo apt install mysql-server- Avviamo lo script automatico di protezione
sudo mysql_secure_installation
Rispondi alle domande poste. Se non sai cosa rispondere, ecco le opzioni consigliate:
Plugin per la convalida della password —
NRimuovere gli utenti anonimi? —
YNegare l'accesso remoto all'utente root? —
NRimuovere il database di test e l'accesso ad esso? —
NRicaricare le tabelle di autorizzazione ora? —
YAccediamo a MySQL:
sudo mysqlControlliamo i metodi di accesso:
SELECT user,authentication_string,plugin,host FROM mysql.user;Impostiamo una password per root:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '';Controlliamo i metodi di accesso di nuovo:
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
Utilizziamo un repository esterno 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 è possibile 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
Il PHP FastCGI Process Manager (fpm) gestisce le richieste PHP. mysql, ovviamente, per lavorare con MySQL.
D'ora in avanti farò tutto su 7.4.
Configurazione di Nginx
sudo vim /etc/nginx/sites-available/
Al posto di "" inserisci il dominio (ad esempio, mysite.ru), che desideri utilizzare in futuro. Se non ne hai ancora uno, inserisci qualsiasi dominio, poi semplicemente ripeti le azioni in questo capitolo per il tuo dominio, quando lo avrai scelto.
Inseriamo 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 nella root /var/www/html prendiamo il file index. Se dopo server_name c'è qualcosa, cerchiamo tale file. Se non lo troviamo, lanciamo 404. Se termina con .php, lo passiamo attraverso fpm. Se ci sono .ht, neghiamo (403).
- Facciamo 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 su
/info.php
Dovresti vedere qualcosa di simile:

Ora puoi eliminare questo file: 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 unzipAccediamo a MySQL:
mysql -u root -pCreiamo un database con il nome laravel:
CREATE DATABASE laravel DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;Concediamo l'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 -pConcediamo all'utente laravel diritti sul progetto:
sudo chown laravel:laravel
In seguito è necessario trasferire il progetto. Ad esempio, clonandolo da Github.
cd ./git clone .
Vale la pena notare che, se non hai salvato file statici (ad esempio, da /public) su Github, non li avrai, ovviamente. Io, ad esempio, per risolvere questo problema ho creato un ramo separato deploy, da cui ho già clonato: git clone -b --single-branch ..
- Installiamo le dipendenze:
composer install - Creiamo .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 copi il tuo .env, sostituisci APP_ENV con production, APP_DEBUG con false e inserisci le impostazioni corrette per MySQL.
- Migra 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 da fare è 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 la volta scorsa, se hai scelto la versione 7.3 invece di php7.4-fpm.sock inserisci php7.4-fpm.sock.
Configurazione del dominio su DigitalOcean
Tutto è, in realtà, molto semplice. Acquisti un dominio (ovunque), vai su DigitalOcean in Crea->Domains/DNS. Nel campo Aggiungi un dominio scrivi questo dominio e premi aggiungi. Poi vai alle 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 "Server DNS" (o qualcosa di simile) e inserisci i server DigitalOcean (ossians1.digitalocean.com,ns2.digitalocean.com,ns3.digitalocean.com). Ora devi aspettare un po' (o molto) affinché queste impostazioni vengano accettate. Fatto!
L'unico problema è che il tuo sito si aprirà solo come HTTP. Per avere HTTPS, passiamo alla parte successiva.
Configurazione di HTTPS
Installa certbot e passagli il nome del dominio (formato mysite.ru) e il nome del 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 è necessario 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;
}
}Penso che tu abbia già capito cosa cambiare per PHP 7.3.
Qui, in realtà, è tutto semplice. Stiamo semplicemente reindirizzando tutte le richieste da HTTP (porta 80) a HTTPS (porta 443). E lì facciamo tutto quello che facevamo prima, ma con la crittografia.
Resta solo da impostare i permessi nel firewall:
sudo nginx -tConsenti OpenSSH (altrimenti ci bloccherà):sudo ufw allow 'Nginx HTTPS'sudo ufw statussudo systemctl reload nginx
Ora tutto dovrebbe funzionare come dovrebbe.
[Дополнительно] Установка Node.js
Se ti serve eseguire comandi npm direttamente sul server, devi installare Node.js.
sudo apt updatesudo apt install -y nodejs npmnodejs -v
Tutto qui, mi sono fermato a questo punto. In linea di massima, il risultato mi soddisfa. Potrei spostarmi da DigitalOcean da qualche parte più vicino alla Russia e più economico. Ma poiché ho già passato tutti i livelli di verifica sul sito e ho fatto tutto lì, ho mostrato il loro esempio. Inoltre, i loro 100 dollari iniziali sono un ottimo punto di partenza per esercitazioni.
P.S. Un ringraziamento speciale all'autore , che è servito da base per tutte le azioni sopra elencate. In alcuni punti non funziona per Laravel 7, lo ho corretto.
P.P.S. Se sei un ingegnere di alto livello che pensa in comandi bash, per favore, non giudicare troppo severamente. Potresti trovare il livello di questo articolo un po' basso, ma sarei felice di aver trovato qualcosa del genere quando ne avevo bisogno. Se hai suggerimenti per migliorare, sono completamente "a favore".
Fonte: habr.com
