Skip to content

Instantly share code, notes, and snippets.

@DWS-paris
Created April 16, 2020 10:42
Show Gist options
  • Save DWS-paris/dbde0651d2846607fdc3ad4c92d4de77 to your computer and use it in GitHub Desktop.
Save DWS-paris/dbde0651d2846607fdc3ad4c92d4de77 to your computer and use it in GitHub Desktop.
title tags robots author
Configurer un VPS
tuto, vps, server
noindex, nofollow
Julien Noyer

Héberger une application MEAN sur un VPS

Introduction

Une application développée sur la stack dite "MEAN" présente l'avantage d'être basé sur un seul langagee, à savoir la Javascrip, et cette avantage reste intéressant en terme de déploiement. Le technologie Javascrip étant supportée chez tous les hébergeurs et les solutions qu'ils proposent, le déploiemeent est alors simplifié dans la mesure ou le choix de telle ou telle solution ne sont pas contraintes par le langage utilisé pour déveloperr l'application.

Les instructions qui vont suivre sont basées sur différrents tutoriels et peuvent être suives pour n'importe quel hébergeur proposant une offre qui donne accès à une connexion SSH vers un serveur (privé ou mutualisé), il est primordial que la commande sudo soit autorisée sur le serveur. L'hébergeur qui est présentée dans ce tutoriel est Digital Ocean car il présente plusieurs avantages, notament celui d'être intégré dans le pack GitHub Education.








Configuration du Droplet (VPS) Digital Ocean

Build Faster, Scale Easier. DigitalOcean's Optimized Droplets Saves Your Team Time

Sélection de l'offre Digital Ocean

L'outil proposé par Digital Ocean s'appel un Droplet, il faut se rendre dans la section Create > Droplet du site qui permet de les configurer et de suivre les étapes. Pour ce tutorel la configuration suivante est utilsée :

  • Distribution : Ubuntu 18.04.3 (LTS)x64
  • Plan : 5 dollars/mo Standrad
  • Datacenter : Amsterdam
  • Authentication : One time passord

Il est possible d'associer une clef SSH à votre VPS, nous conseillons de ne pas le faire pour pouvoir l'ajouter en ligne de commande pendant la configuration du serveur.

Une fois les étapes de configurations passées, un mail est envoyé par Digital Ocean contenant les information pour ce connecter au Droplet créé. Nous allons à présent utiliser ces identifiants pour nous connecter et configurer le Droplet.


Première connexion au Droplet (VPS)

Comme dit précédemment peu importe l'hébergeur selectionner, les différentes commandes que nous allons utiliser sont utilissable sur n'importe quel serveur Linux.

La connexion au serveur est faite en Secure Shell (SSH) en invite de commande via la commande suivante :

ssh root@ip.du.droplet

Un messagee s'affice alors dans le terminal vous demandant d'accepter la connexion au serveur :

The authenticity of host 'ip.du.droplet (ip.du.droplet)' can't be established.
ECDSA key fingerprint is SHA256:ucLbhJljBojqwF2c/py/GABOdltQo7c6N53B+VFL3ZU.
Are you sure you want to continue connecting (yes/no)?

Il faut accepter la connexion pour ensuite indiquer le mot de passe reçu par mail :

Warning: Permanently added '64.227.74.105' (ECDSA) to the list of known hosts.
root@ip.du.droplet's password:

A la première connexion sur le serveur avec l'identifiant root, il est demandé de changer le mote de passe. C'est une prremière étape de sécurité qui impose de ne pas garder le mot de passee généré par Digital Ocean.

Changing password for root.
(current) UNIX password:
Enter new UNIX password:
Retype new UNIX password:

Les mots de passe ne s'affichent pas, il faut veiller à bien les renseigner.

Une fois la connexion établie sur le serveur il faut avant toute chose s'assurer qu'il est à jour en tapant les commandes suivantes :

apt-get update
apt-get install

Création du compte "admin"

Il va de soit que l'utilisation d'un compte nommé root est une faille de sécurité dans la mesure ou il sera le premier à être testé dans le cadre d'une attaque. C'est pourquoi la première étape qu'il faut suivre dans la configuration d'un server distant et l'ajout d'un compte sudo et la suppression du compte root.

Pour créer un nouvel utilisateur il faut taper les commandes suivantes :

adduser adminserveur
usermod -aG sudo adminserveur
su - adminserveur

C'est 3 commandes permettent de créer un utilisatuer, de l'ajouter au groupe sudo et de et de changer de compte utilisateur.

La dernière commande permettant de se connecter avec l'utilisateur créé, il est à présent possible d'associer une clef SSH pour plus de sécurité. Dans un premeier temps il faut créer le dossier et le fichier pour enregister la clef sur le serveur :

mkdir ~/.ssh
chmod 700 ~/.ssh
nano ~/.ssh/authorized_keys

La dernière commande ouvre l'éditeur Nano dans lequel nous allons coller la clef SSH de notre compte. Dans un autre invite de commande nous allons tous d'abord créer une nouvelle clef si aucune n'est présente sur la machine :

ssh-keygen -t rsa

Un message s'affiche demandant d'indiquer le chemin vers la clef .../.ssh/id_rsa, attention car si une clef existe déjà elle sera remplacée.

Nous n'ajoutons pas de passphrase pour simplifier l'utilisation de la clef.

nous pouvons maintenant copier la clef que nous venons de créer avec la commande suivante :

pbcopy < ~/.ssh/id_rsa.pub

une fois la clef copier i suffi de la coller dans la fenêtre Nano overte précédemment pour l'associer au compte créé sur le serveur. Il faut à présent changer les permissions sur le dossier .ssh avec la commande suivante :

chmod 600  ~/.ssh/authorized_keys

NB : les commandes présentées pour gérer les clefs SSH correspondent à l'OS Machintosh, pour Windows il faut utiliser Putty.


Supprimer le compte root

Nous allons à présent supprimer le compte root, pour commencerr nous devons bloquer la possibilité de s'identifiant avec cet utilisateur. Le fichier de configuration sshd_config nous permet dee gérer les méthode de connexion :

sudo nano /etc/ssh/sshd_config

Dans ce fichier il faut changer les valeur de PermitRootLogin et PasswordAuthentication puis sauvegarder le fichier :

PermitRootLogin no
PasswordAuthentication no

Une fois la configuration modifier il faut redémarrer le service SSH :

sudo service ssh restart

Il est à présent possible de ce connecter à notre serveur avec notre nouveau compte. Il faut d'abord nous deconnecter du compte en tapant deux fois la commande exit pour ensuite relancer la connexion SSH avec le nouveau compte :

ssh adminserveur@ip.du.droplet







Préparation du VPS pour le déploiement

Une fois la problématique de connexion sur le VPS passsée, nous pouvons à présent nus occuperr d'installer les modules et invites de commande pour déploiyer nodee application Javascript. Les dernières versions des Droplets Digital Ocean intégrent la commande Git, si ce n'est pas le cas, il faut l'installer aveec la commande :

sudo apt-get install git-all

Cette commande vous permet également de meettre tous les ouutils Git à jour.


Installation des modules serveurs

Pour commencer nous allons installer les modules nous permettant d'utiliser un environement - Javascrip sur notre serveur, à savoir NodeJS avec les commandes suivantes :

curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash -
sudo apt-get install nodejs

Il faut vérifier avant de taper la commande le numéro de version de NodeJS.

La commande NPM est à présent disponible sur notre serveur, nouss allons en profiterr pour installer PM2, un module qui nous permettra de génrer nos commande npm start et LetsEncrypt qui nous permettra de géré nos certificat SSL:

sudo npm i -g pm2
sudo git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt

Nous allons à présent installer MongoDB qui nous permettra dee gérer les données de notre application :

sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv EA312927
echo "deb http://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.2 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.2.list
sudo apt-get install -y mongodb

Pour finir nous allons installer NGINX qui nous permettra de gérer les URLS de notre VPS :

sudo apt-get install nginx

Activation du service NGINX

Pour terminer la préparation du VPS nous allons activer NGINX et définir son comportement par defaut pour indiquer que nous redirigeons toutes les requêtes HTTP en HTTPS que nouos configurerons plus tard avec LetsEncrypt.

Pour commencer nous ajoutons ouvrir le fichierdefault dans la configuration de NGINX et l'ouvrons dans Nano :

sudo nano /etc/nginx/sites-enabled/default

Une fois Nano ouvert, nous remplaçons le code affiché par le suivant avant de fermer et d'enregistrer le fichier :

# HTTP — redirect all traffic to HTTPS
server {
    listen 80;
    listen [::]:80 default_server ipv6only=on;
    return 301 https://$host$request_uri;
}

Nous allons à présent crypter les requêtes grâce à la commande dhparam afin de gérer les reqêtes HTTPS :

sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

Nous devons maintenant créer un fichier de configuration SSL, afin de rendre les requêtes HTTPS valides. Pour cela nouus ouuvons le fichier :

sudo nano /etc/nginx/snippets/ssl-params.conf

Et nous ajoutons le code suivant avant d'enregister le fichier :

# See https://cipherli.st/ for details on this configuration
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
ssl_ecdh_curve secp384r1; # Requires nginx >= 1.1.0
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off; # Requires nginx >= 1.5.9
ssl_stapling on; # Requires nginx >= 1.3.7
ssl_stapling_verify on; # Requires nginx => 1.3.7
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;

# Add our strong Diffie-Hellman group
ssl_dhparam /etc/ssl/certs/dhparam.pem;

Pour finir la configuration de NGINX nous devons autoriser certains typee de connexion avec les commandes suivantes :

sudo ufw allow OpenSSH
sudo ufw allow http
sudo ufw allow https
sudo ufw enable

Nous pouvons à présent démarrer le service NGINX pour finir notre configuration, dans un premier temps nous devons redémarrer notre VPS :

sudo reboot

Il faut ensuite nous reconnecter pour lancer le service NGINX :

sudo systemctl start nginx

Activation du service MongoDB

Pour configurer MongoDB en tant que service nous allons créer un fichier qui nous permettra de le configurer :

sudo nano /etc/systemd/system/mongodb.service

Nous allons coller le code suivant avant d'enrigistrer le fichier :

[Unit]
Description=High-performance, schema-free document-oriented database
After=network.target

[Service]
User=mongodb
ExecStart=/usr/bin/mongod --quiet --config /etc/mongod.conf

[Install]
WantedBy=multi-user.target

Nous poouvons à présent lancer le service MongoDB avec la commande suivante :

sudo systemctl start mongodb

Pour vérifier le statut du service il faut taper la commande sudo systemctl status mongodb.


Activation du service PM2

Nous allons à présent configurer PM2 pour qu’il puisse redémarrer si le serveur redémarre en tapant la commande suivante :

pm2 startup systemd

Cette dernière commande permet d’afficher un code à taper pour valider la configuration qui ressemble au code suivant :

sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u dws --hp /home/adminuser







Déployer l'application sur le VPS

L'application que nous allons installer sur le VPS est basée sur la stack "MEAN" et nous l'avons versionnée sur GitHub. Pour l'installer sur notre VPS nous allons simplement créer un dossier à la racine de notre dossier utilisateur de notre VPS.

Une fois le dossier crée il suffi de la connecter au répertoire GitHub pour récuperer les fichier sources du projet, installer les dépendances et créer les fichiers nécessaires au démarrage du projet (comme les fichiers d'environnement par exemple). Ce tutoriel ne prend pas en compte ces notions qui sont spécifiques à chaque projet.


Gestion des certificats SSL

Les certificats SSL nous permettent de configurer l'accés HTTPS à nos noms de domaines. Avant de commencer cette configuration sur le VPS nous avons dans un premier temps acheté un nom dee domaine que nous avons fait pointé sur l'adresse IP de notre Droplet.

Une fois le nom de domaine correctement configuré, nous devons dans un premier temps stoper NGINX et lancer la commande LetsEncrypt pour générer les clef SSL :

sudo systemctl stop nginx.service
sudo /opt/letsencrypt/letsencrypt-auto certonly --standalone

Nous suivons les instruction de LetsEncrypt pour nous identifier puis nous définissions à la fin du processus notre nom de domaine (sans https://). Une fois le nom de domaine enregistré un message de validation affiche l'endroit ou sont stockées les clef SSL :

Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/<nom.de.domaine>/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/<nom.de.domaine>/privkey.pem

Les clef que nous venons de créer vont nous permettre à présent d'ajouter un fichier de configuration dans NGINX afin d'associer correctement les cleefs SSL à notre nom de domaine. Nous ouvons donc un nouuveau fichier dans Nano :

sudo nano /etc/nginx/sites-enabled/<nom.de.domaine>

Il est recommander de nommer le fichier par le nom de domaine

Dans le fichier qui vient de s'ouvir nous collons le code suivant pour gérer les clef SSL pour ce nom de domaine :

# HTTPS — proxy all requests to the Node app
server {
    # Enable HTTP/2
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name <nom.de.domaine>;

    # Use the Let’s Encrypt certificates
    ssl_certificate /etc/letsencrypt/live/<nom.de.domaine>/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/<nom.de.domaine>/privkey.pem;

    # Include the SSL configuration from cipherli.st
    include snippets/ssl-params.conf;

    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-NginX-Proxy true;
        proxy_pass http://localhost:<port>/;
        proxy_ssl_session_reuse off;
        proxy_set_header Host $http_host;
        proxy_cache_bypass $http_upgrade;
        proxy_redirect off;
    }
}

Nous prenons soins de bien modifier les informations pour qu'elles correspondent à notre configuration :

  • nom.de.domaine : le domaine que nous avons fait poointer sur le serveur
  • port : le port qui corrrespond à notre application

Pour vérifier notre configuration NGINX nous tapons la commande sudo nginx -t qui noous affiche en résultat :

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Notre configuration est à présent terminé, nous pouvons pour la finaliser et activer le nom dde domaine ssur notre VPS, redemmarer le service NGINX avec la commande suivante :

sudo systemctl start nginx.service

Lancer l'application Javascript

Tout est prêt sur notre VPS pour configurer un nom de domaine en HTTPS qui pointee sur un port spécifique. Nous allons donc à présent utiliser PM2 pour lancer notre application en tapant la commander suivante dans le dossier racine dee notre application :

pm2 start server.js --name APPname







Ressources

Liens utiles

La liste ci-dessous contient les liens utiles cité dans ce document.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment