Déploiement d'une application sur Laravel 7 sur Ubuntu & Nginx.

Déploiement d'une application sur Laravel 7 sous Ubuntu & Nginx

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 un lien de parrainage pour 100$.

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 laravel
  • usermod -aG sudo laravel
  • su laravel

Ajoutons une clé SSH

  • mkdir ~/.ssh
  • chmod 700 ~/.ssh
  • vim ~/.ssh/authorized_keys
  • Insérons 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 '';
  • 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 ;

        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/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

  • CREER BASE DE DONNEES laravel DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

  • ACCORDER TOUS SUR laravel.* À 'root'@'localhost' IDENTIFIÉ PAR '' ;

  • 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=

  • 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é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 simplement cat ~\/ .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 ~/.ssh
  • chmod 700 ~/.ssh
  • vim ~/.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 update
  • sudo apt install nginx

Ajoutons Nginx aux paramètres du pare-feu

  • sudo ufw app list
  • sudo 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.

Déploiement d'une application sur Laravel 7 sous Ubuntu & Nginx

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 — N

  • Supprimer les utilisateurs anonymes ? — Y

  • Interdire la connexion root à distance ? — N

  • Supprimer la base de test et l'accès à celle-ci ? — N

  • Recharger les tables de privilèges maintenant ? — Y

  • Connectons-nous à MySQL : sudo mysql

  • Vé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; et exit

  • Maintenant, pour entrer dans MySQL, il faut utiliser mysql -u root -p et entrer le mot de passe

Installons PHP

Utilisons un dépôt tiers de Ondřej Surý

  • 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

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-available dans sites-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 :

Déploiement d'une application sur Laravel 7 sous Ubuntu & Nginx

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 unzip

  • 7.4: sudo apt install php7.4-mbstring php7.4-xml composer unzip

  • Connectons-nous à MySQL : mysql -u root -p

  • Cré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;

  • exit

  • cd /var/www/html

  • Créons un dossier pour le projet : sudo mkdir -p

  • Accordons à 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 storage
  • sudo chown -R $USER:www-data bootstrap/cache
  • chmod -R 775 storage
  • chmod -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-à-dire ns1.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/certbot
  • sudo apt install python-certbot-nginx
  • sudo 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 -t
  • sudo ufw app list
  • sudo ufw allow 'Nginx HTTPS'
  • sudo ufw status
  • sudo 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 update
  • sudo apt install -y nodejs npm
  • nodejs -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 de ce gist, 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

Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS 🔥 Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster