J'ai décidé de créer mon portfolio en utilisant Laravel 7. Pour que la page principale soit une page de destination et que toutes les informations qu'elle contient puissent être modifiées à l'aide du panneau d'administration. Ce n’est pas la question. Il s’agissait du déploiement. J'ai trouvé quelques bons tutoriels sur la façon de procéder sur un serveur à part entière avec tous les problèmes. Je ne suis pas très fort en déploiement, je suis généralement plus front que full stack. Et, si je peux encore écrire et tester en PHP, alors avant de gérer le serveur, etc. Je n'ai pas encore grandi. Mais je devais le comprendre.
Nous allons maintenant parcourir toutes les étapes, en commençant par le lancement via SSH et en terminant par le site de travail. Nous essaierons d’éviter tous les pièges.
Vous pourrez peut-être trouver des instructions similaires en ligne. Après tout, je l'ai enfin trouvé. C'est vrai, pas au même endroit, pas sans l'aide de StackOverflow, et à peine en russe. J'ai souffert. C'est pourquoi j'ai décidé de vous simplifier la vie.
Nous ferons tout avec un droplet sur DigitalOcean. Ceci n’est bien sûr pas nécessaire ; choisissez n’importe quel hébergement. Lorsque vous atteignez un serveur fonctionnel sur Ubuntu, revenez. Pour ceux qui décident encore de le faire sur DigitalOcean, il y aura plus de conseils sur la création d'un domaine. Et
Toutes les étapes spécifiques à DigitalOcean seront indiquées dans des notes de bas de page comme celles-ci.
Commençons.
TL;DR (commandes de base uniquement)
Créer un utilisateur
ssh root@[IP-адрес вашего дроплета]
adduser laravel
usermod -aG sudo laravel
su laravel
Ajoutez-y SSH
mkdir ~/.ssh
chmod 700 ~/.ssh
vim ~/.ssh/authorized_keys
- Insérez la clé publique
chmod 600 ~/.ssh/authorized_keys
Pare-feu
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/<Ваш домен>
Configuration de base:
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;
}
}
Uniquement configuration HTTP pour 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;
}
}
Paramètre HTTPS pour 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
Créez un droplet sur DigitalOcean et enregistrez une nouvelle clé SSH
Je crois sincèrement que vous découvrirez vous-même comment vous inscrire sur DigitalOcean. Ce n'est pas facile, avec beaucoup de vérifications et autres choses. Si vous obtenez constamment une erreur réseau lors de la vérification à l’aide de documents, essayez de tout faire via un VPN, cela devrait vous aider.
Dans le menu en haut, cliquez sur Création->Gouttelettes... Nous choisissons Ubuntu.
Dès votre inscription, vous recevrez 100 $ sur votre compte. Mais ne vous y trompez pas. Vous n'avez que 60 jours pour le dépenser. Et c'est très peu. Vous souhaiterez peut-être, comme moi, utiliser un forfait plus cher, de sorte que plus tard, lorsque l'argent réel commencera à affluer, vous pourrez passer à un forfait moins cher. Je vous le dis tout de suite, ça ne marchera pas. Vous pouvez l’augmenter, mais vous ne pouvez pas le diminuer. Ainsi va. je choisis Standard->$5.
Je choisis la région la plus proche de chez nous Francfort. Réseau VPC->par défaut-fra1
Nous effectuerons immédiatement l'authentification via SSH. Cliquez sur Nouvelle clé SSH. Si vous n'avez pas SSH, il y a des instructions très simples sur la droite. Ouvrez un terminal bash et collez
ssh-keygen
. Ensuite on va au fichier avec 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. N'importe quel nom.Nous trouvons un nom d'hôte pour le droplet.
Cliquez ici Créer une gouttelette
Créer un nouvel utilisateur
ssh root@[IP-адрес вашего дроплета]
- Êtes-vous sûr de vouloir continuer à vous connecter (oui/non/[empreinte digitale]) ?
yes
- Entrez votre mot de passe SSH
- Créer un utilisateur Laravel:
adduser laravel
- Entrez votre mot de passe et d'autres informations (je ne saisis que le nom complet)
- Ajoutez l'utilisateur au groupe sudo :
usermod -aG sudo laravel
SSH pour le nouvel utilisateur
- Basculez vers le nouvel utilisateur :
su laravel
Nous effectuons toutes les actions ultérieures, jusqu'à la fin de l'article, au nom de l'utilisateur de Laravel. Par conséquent, si vous êtes soudainement interrompu, reconnectez-vous et entrez su laravel
mkdir ~/.ssh
chmod 700 ~/.ssh
vim ~/.ssh/authorized_keys
Nous avons ouvert le fichier dans Vim. Si vous ne le connaissez pas du tout, vous pouvez travailler dans Nano, votre droit.
Les commandes Vim les plus basiques
Afin d'utiliser l'éditeur Vim tout au long de l'article, il vous suffit de connaître les éléments suivants.
- Vim a différents modes : Le mode Normal, dans lequel vous entrez des commandes et sélectionnez des modes et autres.
- Pour quitter n'importe quel mode et revenir au mode normal, appuyez simplement sur
Esc
- Déplacez-vous : vous pouvez simplement utiliser les flèches
- Quitter sans sauvegarder
<Normal mode>
::q!
- Quitter et sauvegarder
<Normal mode>
::wq
- Passer en mode de saisie de texte
<Normal mode>
:i
(de l'anglais. insérer)
- Nous insérons notre clé publique (ce que nous avons fait ci-dessus)
- Nous protégeons contre les changements :
chmod 600 ~/.ssh/authorized_keys
Installer un pare-feu
- Examinons tous les paramètres disponibles :
sudo ufw app list
- Autoriser OpenSSH (sinon cela nous verrouillera) :
sudo ufw allow OpenSSH
- Lançons le pare-feu :
sudo ufw enable
,y
- vérifier:
sudo ufw status
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Tout va bien.
Installation de Nginx
Lors de l'installation, il vous sera parfois demandé « Êtes-vous sûr ? » Répondre y
(enfin, seulement si vous en êtes sûr).
sudo apt update
sudo apt install nginx
Ajout de Nginx aux paramètres du pare-feu
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)
Accédez à votre IP. Si tout se passe bien, vous devriez voir ce qui suit.
Installation de MySQL
sudo apt install mysql-server
- Lancer un script de protection automatique
sudo mysql_secure_installation
Répondez aux questions posées. Si vous ne savez pas quoi répondre, voici quelques options suggérées :
-
Valider le plugin de mot de passe -
N
-
Supprimer les utilisateurs anonymes ? —
Y
-
Interdire la connexion root à distance ? —
N
-
Supprimer la base de données de test et y accéder ? —
N
-
Recharger les tables de privilèges maintenant ? —
Y
-
Passons à MySQL :
sudo mysql
-
Regardons les méthodes d'accès :
SELECT user,authentication_string,plugin,host FROM mysql.user;
-
Définissez un mot de passe pour root :
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '<Ваш пароль для MySQL>';
-
Regardons à nouveau les méthodes d'accès :
SELECT user,authentication_string,plugin,host FROM mysql.user;
-
Appliquez les modifications et quittez MySQL :
FLUSH PRIVILEGES;
иexit
-
Maintenant, pour vous connecter à MySQL, vous devez utiliser
mysql -u root -p
et entrez le mot de passe
Installation de PHP
Utilisons un référentiel tiers de
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
Maintenant, choisissons. Pour Laravel 7, vous pouvez choisir PHP 7.3 ou 7.4. La seule différence résidera 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) fonctionne avec les requêtes PHP. mysql, bien sûr, pour travailler avec MySQL.
A partir de maintenant, je ferai tout sur 7.4.
Configuration de Nginx
sudo vim /etc/nginx/sites-available/<Ваш домен>
Au lieu de "<Votre domaine>", saisissez le domaine (par exemple, mysite.ru
) que vous souhaitez utiliser à l'avenir. Si vous n'en avez pas encore, écrivez-en un, puis répétez simplement les étapes de ce chapitre pour votre domaine lorsque vous le sélectionnez.
Entrez ce qui suit :
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;
}
}
Si vous avez plutôt choisi la version 7.3 php7.4-fpm.sock
inscrire php7.4-fpm.sock
.
Écoutez le port 80 sur server_name
quand on arrive à la requête racine /var/www/html
prenez le fichier d'index. Si après server_name
Il y a quelque chose, nous recherchons un tel fichier. Si nous ne le trouvons pas, nous jetons 404. S'il se termine par .php
, parcourir fpm
. S'il y a .ht
, interdire (403).
- Faire un lien depuis
sites-available
вsites-enabled
:sudo ln -s /etc/nginx/sites-available/<Ваш домен> /etc/nginx/sites-enabled/
- Supprimer le lien vers
default
:sudo unlink /etc/nginx/sites-enabled/default
- Vérification des erreurs :
sudo nginx -t
- Redémarrer :
sudo systemctl reload nginx
Vérification du travail :
sudo vim /var/www/html/info.php
- Nous écrivons:
<?php phpinfo();
- Aller à
<Ваш IP>/info.php
Vous devriez voir quelque chose comme ceci :
Maintenant, ce fichier peut être supprimé : sudo rm /var/www/html/info.php
Installer 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
-
Passons à MySQL :
mysql -u root -p
-
Créez une base de données avec le nom Laravel:
CREATE DATABASE laravel DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
-
Nous fournissons un accès root à Laravel:
GRANT ALL ON laravel.* TO 'root'@'localhost' IDENTIFIED BY '<Ваш пароль от MySQL>';
-
FLUSH PRIVILEGES;
-
exit
-
cd /var/www/html
-
Créez un dossier pour le projet :
sudo mkdir -p <Имя проекта>
-
Nous fournissons à l'utilisateur Laravel droits sur le projet :
sudo chown laravel:laravel <Имя проекта>
Ensuite, vous devez transférer le projet. Par exemple, le clonage depuis Github.
cd ./<Имя проекта>
git clone <ссылка на проект> .
Il convient de noter que si vous n'avez pas enregistré de fichiers statiques (par exemple, à partir de /public
) sur Github, alors naturellement vous ne les aurez pas. Par exemple, j'ai créé un fil de discussion séparé pour résoudre ce problème deploy
, à partir duquel j'ai déjà cloné : git clone -b <имя ветки> --single-branch <ссылка на проект> .
.
- Installation des dépendances :
composer install
- Créez .env :
vim .env
La version de base ressemble à ceci :
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>
Si vous copiez votre .env, remplacez APP_ENV par production, APP_DEBUG par false et entrez les paramètres corrects pour MySQL.
- Migration de la base de données :
php artisan migrate
- Génération du code :
php artisan key:generate
Modification des autorisations :
sudo chown -R $USER:www-data storage
sudo chown -R $USER:www-data bootstrap/cache
chmod -R 775 storage
chmod -R 775 bootstrap/cache
Il ne reste plus qu'à reconfigurer Nginx pour 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;
}
}
Comme la dernière fois, si vous avez plutôt choisi la version 7.3 php7.4-fpm.sock
inscrire php7.4-fpm.sock
.
Créer un domaine sur DigitalOcean
Tout est en fait très simple. Vous achetez un domaine (n'importe où), passez à DigitalOcean à Création->Domaines/DNS. оле Ajouter un domaine vous entrez ce domaine et cliquez sur ajouter. Allez ensuite dans les paramètres du domaine et sur le terrain HOSTNAME entrer @. Sélectionnez un projet et cliquez sur Créer un enregistrement.
Allez maintenant sur le site où vous avez acheté le domaine, recherchez-y « Serveurs DNS » (ou quelque chose de similaire) et entrez les serveurs DigitalOcean (à savoirns1.digitalocean.com
,ns2.digitalocean.com
,ns3.digitalocean.com
). Vous devez maintenant attendre un peu (ou beaucoup) jusqu'à ce que ces paramètres soient acceptés. Prêt!
Le seul problème est que votre site s'ouvrira uniquement en HTTP. Pour avoir HTTPS, passez à la partie suivante.
Configuration de HTTPS
Installez certbot et transmettez-lui le nom de domaine (format mysite.ru
) et nom de domaine avec 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.<Ваш домен>
Vous devez maintenant reconfigurer Nginx (n'oubliez pas de remplacer vos valeurs) :
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;
}
}
Je pense que vous comprenez déjà ce qui doit être modifié pour PHP 7.3.
Ici en fait, tout est simple. Nous redirigeons simplement toutes les requêtes de HTTP (port 80) vers HTTPS (port 443). Et là, on fait tout comme avant, mais avec cryptage.
Il ne reste plus qu'à définir les autorisations dans le pare-feu :
sudo nginx -t
sudo ufw app list
sudo ufw allow 'Nginx HTTPS'
sudo ufw status
sudo systemctl reload nginx
Maintenant, tout devrait fonctionner comme il se doit.
[Avancé] Installation de Node.js
Si vous devez soudainement exécuter des commandes npm directement sur le serveur, vous devez installer Node.js.
sudo apt update
sudo apt install -y nodejs npm
nodejs -v
Ça y est, je me suis arrêté à ce stade. En principe, je suis satisfait du résultat. Peut-être que je passerai de DigitalOcean à un endroit plus proche de la Russie et moins cher. Mais comme j'avais déjà effectué tous les tours de vérification sur le site et que j'y avais tout fait, je leur ai montré l'exemple. De plus, leur 100 $ de départ constitue un excellent tremplin pour la formation.
PS Un merci spécial à l'auteur
PPS Si vous êtes un ingénieur de haut niveau qui pense en commandes bash, ne jugez pas durement. Vous trouverez peut-être cet article de bas niveau, mais j'aurais été heureux d'en trouver un lorsque j'en avais besoin. S'il y a des suggestions d'amélioration, je suis tout à fait d'accord.
Source: habr.com