
J'ai décidé de créer mon portfolio sur Laravel 7. La page d'accueil doit être une landing page, et toutes les informations peuvent être modifiées via l'interface d'administration. Bref. Nous en sommes arrivés au déploiement. J'ai trouvé quelques bons tutoriels sur comment procéder sur un serveur complet avec toutes les complications. Je suis pas très fort en déploiement, je suis plutôt front-end qu'expert full-stack. Et, bien que je puisse encore coder et tester en PHP, je n'ai pas encore franchi le cap de la gestion serveur, etc. Mais il a fallu que je m'y mette.
Nous allons passer en revue toutes les étapes, du démarrage via SSH jusqu'à un site opérationnel. Nous allons essayer d'éviter tous les pièges.
Vous pourrez peut-être trouver des instructions similaires sur Internet. Après tout, moi aussi je les ai trouvées. Bien que ce ne soit pas dans un seul endroit, pas sans l'aide de StackOverflow et probablement pas en russe. J'ai eu du mal. C'est pourquoi j'ai décidé de vous simplifier la vie.
Nous allons tout faire avec un droplet de DigitalOcean. Ce n'est pas obligatoire, choisissez n'importe quel hébergement. Une fois que vous aurez un serveur fonctionnel sous Ubuntu, revenez ici. Pour ceux qui souhaitent utiliser DigitalOcean, il y aura également des conseils sur la configuration de domaine. Ainsi que .
Tous les étapes spécifiques à DigitalOcean seront données dans des notes similaires.
Commençons.
TL;DR (juste les commandes principales)
Créons un utilisateur
ssh root@[IP de votre droplet]adduser laravelusermod -aG sudo laravelsu laravel
Ajoutons une clé SSH
mkdir ~/.sshchmod 700 ~/.sshvim ~/.ssh/authorized_keys- Insérons la clé publique
chmod 600 ~/.ssh/authorized_keys
Pare-feu
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/
Configuration de 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;
}
}Configuration HTTP uniquement pour Laravel :
serveur {
écouter 80;
écouter [::]:80;
racine /var/www/html//public;
index index.php index.html index.htm index.nginx-debian.html;
nom_de_serveur ;
emplacement / {
essayer_fichiers $uri $uri/ /index.php?$query_string;
}
emplacement ~ .php$ {
inclure snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
}
emplacement ~ /.ht {
refuser tout;
}
}Configuration HTTPS pour Laravel :
serveur {
écouter 80;
écouter [::]:80;
nom_de_serveur www.;
retour 301 https://$server_name$request_uri;
}
serveur {
écouter 443 ssl http2;
écouter [::]:443 ssl http2;
nom_de_serveur www.;
racine /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;
ajouter_en-tête X-Frame-Options "SAMEORIGIN";
ajouter_en-tête X-XSS-Protection "1; mode=block";
ajouter_en-tête X-Content-Type-Options "nosniff";
index index.php index.html index.htm index.nginx-debian.html;
charset utf-8;
emplacement / {
essayer_fichiers $uri $uri/ /index.php?$query_string;
}
emplacement ~ .php$ {
inclure snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
}
emplacement ~ /.ht {
refuser tout;
}
emplacement ~ /.well-known {
permettre tout;
}
}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 -pCREER BASE DE DONNEES laravel DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;ACCORDER TOUS SUR laravel.* À 'root'@'localhost' IDENTIFIÉ PAR '' ;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
Créer un droplet sur DigitalOcean et enregistrer une nouvelle clé SSH
Je crois sincèrement que vous pourrez gérer l'inscription sur DigitalOcean par vous-même. Ce n'est pas facile, avec beaucoup de vérifications et autres complications. Si vous rencontrez une erreur réseau lors de la vérification avec des documents, essayez de tout faire via un VPN, cela devrait aider.
Dans le menu en haut, cliquez sur Créer->Droplets. Sélectionnez Ubuntu.
Une fois que vous êtes inscrit, vous recevrez 100 $ sur votre compte. Mais ne vous laissez pas emporter. Vous avez seulement 60 jours pour les dépenser. Et c'est très peu. Vous pourriez, comme moi, vouloir utiliser un plan plus cher, puis, quand l'argent réel commencera à arriver, passer à un plan moins cher. Je vous dis tout de suite, cela ne fonctionnera pas. Vous pouvez augmenter, mais pas diminuer. Voilà. Standard->$5.
Je choisis la région la plus proche de nous Francfort. Réseau VPC->default-fra1
Nous allons faire l'authentification via SSH immédiatement. Appuyez sur Nouvelle clé SSH. Si vous n'avez pas SSH, il y a une très simple instruction à droite. Ouvrez le terminal bash, collez
ssh-keygen. Ensuite, allez dans le fichier contenant la clé publique/Users/<Ваше имя пользователя>/.ssh/id_rsa.pub(ou simplementcat ~\/ .ssh\/ id_rsa.pub), copiez le contenu et collez-le dans la fenêtre de gauche. Le nom peut être n'importe lequel.Inventons un nom d'hôte pour le droplet.
Cliquez Créer un Droplet
Créons un nouvel utilisateur
ssh root@[IP de votre droplet]- Êtes-vous sûr de vouloir continuer à vous connecter (oui/non/[empreinte])?
yes - Entrez votre mot de passe SSH
- Créons un utilisateur laravel:
adduser laravel - Entrez le mot de passe et d'autres informations (j'entre uniquement le nom complet)
- Ajoutons l'utilisateur au groupe sudo :
usermod -aG sudo laravel
SSH pour le nouvel utilisateur
- Passons à l'utilisateur nouvellement créé :
su laravel
Nous effectuerons toutes les actions suivantes, jusqu'à la fin de l'article, au nom de l'utilisateur laravel. Donc, si vous êtes interrompu, reconnectez-vous et entrez su laravel
mkdir ~/.sshchmod 700 ~/.sshvim ~/.ssh/authorized_keys
Nous avons ouvert le fichier dans Vim. Si vous n'êtes pas familier avec lui, vous pouvez travailler dans Nano, c'est votre choix..
Les commandes de base de Vim
Pour utiliser l'éditeur Vim tout au long de l'article, vous devez simplement connaître ce qui suit.
- Vim a plusieurs modes : le mode normal, où vous saisissez des commandes et choisissez d'autres modes.
- Pour sortir de n'importe quel mode et passer au mode normal, il suffit d'appuyer sur
Esc - Navigation : vous pouvez simplement utiliser les flèches
- Sortir sans enregistrer
<Normal mode>::q! - Sortir et enregistrer
<Normal mode>::wq - Passer en mode insertion de texte
<Normal mode>:i(de l'anglais. insert)
- Insérons notre clé publique (que nous avons créée ci-dessus)
- Protégeons des modifications :
chmod 600 ~/.ssh/authorized_keys
Installons le pare-feu
- Voyons tous les paramètres disponibles :
sudo ufw app list - Permettre OpenSSH (sinon, vous serez bloqué) :
sudo ufw allow OpenSSH - Lançons le pare-feu :
sudo ufw enable,y - Vérifions :
sudo ufw status
État : actif
Pour Action De
-- ------ ----
OpenSSH AUTORISER Partout
OpenSSH (v6) AUTORISER Partout (v6)Tout va bien.
Installons Nginx
Lors de l'installation, il vous sera parfois demandé "Êtes-vous sûr ?". Répondez y (mais seulement si vous êtes sûr).
sudo apt updatesudo apt install nginx
Ajoutons Nginx aux paramètres du pare-feu
sudo ufw app listsudo ufw allow 'Nginx HTTP'sudo ufw status
Statut : actif
Pour Action De
-- ------ ----
OpenSSH AUTORISER Partout
Nginx HTTP AUTORISER Partout
OpenSSH (v6) AUTORISER Partout (v6)
Nginx HTTP (v6) AUTORISER Partout (v6)Accédez à votre IP. Si tout se passe bien, vous devriez voir ce qui suit.

Installation de MySQL
sudo apt install mysql-server- Lançons le script automatisé de sécurité
sudo mysql_secure_installation
Répondez aux questions posées. Si vous ne savez pas quoi répondre, voici des options recommandées :
Plugin de validation de mot de passe —
NSupprimer les utilisateurs anonymes ? —
YInterdire la connexion root à distance ? —
NSupprimer la base de test et l'accès à celle-ci ? —
NRecharger les tables de privilèges maintenant ? —
YConnectons-nous à MySQL :
sudo mysqlVérifions les méthodes d'accès :
SELECT user,authentication_string,plugin,host FROM mysql.user;Définissons un mot de passe pour root :
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '';Vérifions les méthodes d'accès à nouveau :
SELECT user,authentication_string,plugin,host FROM mysql.user;Appliquons les modifications et sortons de MySQL :
FLUSH PRIVILEGES;etexitMaintenant, pour entrer dans MySQL, il faut utiliser
mysql -u root -pet entrer le mot de passe
Installons PHP
Utilisons un dépôt tiers 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
Choisissons maintenant. Pour Laravel 7, on peut choisir PHP 7.3 ou 7.4. La différence se situe uniquement dans les chiffres 3 et 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) gère les requêtes PHP. mysql, bien sûr, pour travailler avec MySQL.
Je ferai tout sur 7.4.
Configurons Nginx
sudo vim /etc/nginx/sites-available/
Au lieu de "<Votre domaine>" indiquez le domaine (par exemple, mysite.ru), que vous souhaitez utiliser dans le futur. Si vous n'en avez pas encore, écrivez n'importe quoi, puis répétez simplement les étapes de ce chapitre pour votre domaine lorsque vous le choisirez.
Indiquons ce qui suit :
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;
}
}Si vous avez choisi la version 7.3 au lieu de php7.4-fpm.sock indiquez php7.4-fpm.sock.
Écoutons le port 80 sur server_name, lorsque nous recevons une requête à la racine /var/www/html nous prenons le fichier index. Si après server_name il y a quelque chose, nous recherchons ce fichier. Ne le trouvons pas, nous renvoyons 404. Si ça se termine par .php, nous le faisons passer par fpm. S'il y a .ht, nous interdisons (403).
- Créons un lien depuis
sites-availabledanssites-enabled:sudo ln -s /etc/nginx/sites-available/ /etc/nginx/sites-enabled/ - Supprimons le lien vers
default:sudo unlink /etc/nginx/sites-enabled/default - Vérifions les erreurs :
sudo nginx -t - Redémarrons :
sudo systemctl reload nginx
Vérifions le fonctionnement :
sudo vim /var/www/html/info.php- Nous écrivons :
<?php phpinfo(); - Allons sur
<Votre IP>/info.php
Vous devriez voir quelque chose comme :

Maintenant, ce fichier peut être supprimé : sudo rm /var/www/html/info.php
Installons 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 unzipConnectons-nous à MySQL :
mysql -u root -pCréons une base de données nommée laravel:
CREER BASE DE DONNEES laravel DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;Accordons un accès root à laravel:
ACCORDER TOUS SUR laravel.* À 'root'@'localhost' IDENTIFIÉ PAR '' ;FLUSH PRIVILEGES;exitcd /var/www/htmlCréons un dossier pour le projet :
sudo mkdir -pAccordons à l'utilisateur laravel les droits sur le projet :
sudo chown laravel:laravel
Ensuite, il faut transférer le projet. Par exemple, en le clonant depuis Github.
cd ./git clone .
Il convient de noter que si vous n'avez pas sauvegardé de fichiers statiques (par exemple, provenant de /public) sur Github, vous ne les aurez naturellement pas. Par exemple, pour résoudre cela, j'ai créé une branche distincte deploy, depuis laquelle j'ai cloné : git clone -b --single-branch ..
- Installons les dépendances :
composer install - Créons un .env :
vim .env
La version de base ressemble à cela :
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=Si vous copiez votre .env, remplacez APP_ENV par production, APP_DEBUG par false et entrez les bonnes configurations pour MySQL.
- Migrons la BDD :
php artisan migrate - Générons le code :
php artisan key:generate
Changeons les permissions :
sudo chown -R $USER:www-data storagesudo chown -R $USER:www-data bootstrap/cachechmod -R 775 storagechmod -R 775 bootstrap/cache
La dernière étape consiste à reconfigurer Nginx pour Laravel :
sudo vim /etc/nginx/sites-available/
serveur {
écouter 80;
écouter [::]:80;
racine /var/www/html//public;
index index.php index.html index.htm index.nginx-debian.html;
nom_de_serveur ;
emplacement / {
essayer_fichiers $uri $uri/ /index.php?$query_string;
}
emplacement ~ .php$ {
inclure snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
}
emplacement ~ /.ht {
refuser tout;
}
}Comme la dernière fois, si vous avez choisi la version 7.3 au lieu de php7.4-fpm.sock indiquez php7.4-fpm.sock.
Configuration du domaine sur DigitalOcean
C'est en fait très simple. Vous achetez un domaine (où que ce soit), allez sur DigitalOcean dans Créer->Domains/DNS. Dans le champ Ajouter un domaine vous entrez ce domaine, cliquez sur ajouter. Ensuite, allez dans les paramètres du domaine et dans le champ NOM D'HÔTE vous entrez @. Sélectionnez le projet et cliquez sur Créer un enregistrement.
Maintenant, allez sur le site où vous avez acheté le domaine, trouvez "Serveurs DNS" (ou quelque chose de similaire) et entrez les serveurs de DigitalOcean (c'est-à-direns1.digitalocean.com,ns2.digitalocean.com,ns3.digitalocean.com). Maintenant, il faut attendre un peu (ou beaucoup) que ces réglages soient acceptés. C'est fait !
Le seul problème est que votre site s'ouvrira uniquement en HTTP. Pour avoir HTTPS, passons à la partie suivante.
Configurons HTTPS
Installons certbot et indiquons-y le nom de domaine (format mysite.ru) et le nom de domaine avec 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.
Il faut maintenant reconfigurer Nginx (n'oubliez pas de remplacer par vos propres valeurs) :
serveur {
écouter 80;
écouter [::]:80;
nom_de_serveur www.;
retour 301 https://$server_name$request_uri;
}
serveur {
écouter 443 ssl http2;
écouter [::]:443 ssl http2;
nom_de_serveur www.;
racine /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;
ajouter_en-tête X-Frame-Options "SAMEORIGIN";
ajouter_en-tête X-XSS-Protection "1; mode=block";
ajouter_en-tête X-Content-Type-Options "nosniff";
index index.php index.html index.htm index.nginx-debian.html;
charset utf-8;
emplacement / {
essayer_fichiers $uri $uri/ /index.php?$query_string;
}
emplacement ~ .php$ {
inclure snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
}
emplacement ~ /.ht {
refuser tout;
}
emplacement ~ /.well-known {
permettre tout;
}
}Je pense que vous avez déjà compris ce qu'il faut changer pour PHP 7.3.
Ici, en fait, c'est très simple. Nous redirigeons simplement toutes les requêtes de HTTP (port 80) vers HTTPS (port 443). Et là, nous faisons la même chose qu'avant, mais avec le chiffrement.
Il reste à définir les permissions dans le pare-feu :
sudo nginx -tsudo ufw app listsudo ufw allow 'Nginx HTTPS'sudo ufw statussudo systemctl reload nginx
Maintenant, tout devrait fonctionner comme prévu.
[Дополнительно] Установка Node.js
Si jamais vous avez besoin d'exécuter des commandes npm directement sur le serveur, vous devez installer Node.js.
sudo apt updatesudo apt install -y nodejs npmnodejs -v
Voilà, je me suis arrêté à cette étape. En principe, le résultat me convient. Peut-être que je vais passer de DigitalOcean à quelque chose de plus proche de la Russie et moins cher. Mais comme j'ai déjà traversé tous les cycles de vérification sur leur site et que j'ai fait tout cela là-bas, j'ai montré à titre d'exemple. De plus, leurs premiers 100 dollars constituent une excellente base pour l'entraînement.
P.S. Un grand merci à l'auteur , qui a servi de base pour toutes les actions mentionnées ci-dessus. Il ne fonctionne pas dans certains cas pour Laravel 7, j'ai corrigé cela.
P.P.S. Si jamais vous êtes un ingénieur de haut niveau qui pense en commandes bash, je vous prie de ne pas être trop sévère. Peut-être que le niveau de cet article vous semblera un peu bas, mais j'aurais été ravi de le trouver quand j'en avais besoin. Si vous avez des suggestions d'amélioration, je suis tout ouïe.
Source : habr.com
