J'ai écrit mes premiers sites à la fin des années 90. Ensuite, les mettre en condition de travail était très simple. Il y avait un serveur Apache sur certains hébergements partagés, vous pouvez vous connecter à ce serveur via FTP, en écrivant quelque chose comme ça dans la ligne du navigateur ftp://ftp.example.com
. Il a ensuite fallu saisir un nom et un mot de passe et télécharger des fichiers sur le serveur. Il y a eu d'autres moments, tout était plus facile à l'époque que maintenant. Au cours des deux dernières décennies, tout a beaucoup changé. Les sites sont devenus plus complexes, ils doivent être assemblés avant d'être mis en production. Un seul serveur est devenu une pluralité de serveurs travaillant derrière des équilibreurs de charge; l'utilisation de systèmes de contrôle de version est devenue courante.
Pour mon projet personnel, j'avais une configuration spéciale. Et je savais que j'avais besoin de pouvoir déployer un site en production, en n'effectuant qu'une seule action: écrire du code dans une branche master
sur GitHub. De plus, je savais que pour assurer le fonctionnement de ma petite application Web, je ne voulais pas gérer un énorme cluster Kubernetes, ni utiliser la technologie Docker Swarm, ni maintenir un parc de serveurs avec des pods, des agents et toutes sortes d'autres difficultés. Afin d'atteindre l'objectif de simplifier le travail autant que possible, je devais me familiariser avec CI / CD.Si vous avez un petit projet (dans notre cas, nous parlons d'un projet Node.js) et que vous souhaitez savoir comment automatiser le déploiement de ce projet, tout en vous assurant que ce qui est stocké dans le référentiel correspond exactement ce qui fonctionne en production, je pense que cet article pourrait vous intéresser.Conditions préalables
Le lecteur de cet article devrait avoir une connaissance de base de la zone de ligne de commande et écrire des scripts Bash. De plus, il aura besoin de comptes Travis CI et Docker Hub .Buts
Je ne dirai pas que cet article peut être appelé sans condition un "manuel de formation". C'est plutôt un document dans lequel je parle de ce que j'ai appris et décris le processus de test et de déploiement de code en production qui me convient, réalisé en un seul passage automatisé.C'est ainsi que mon workflow s'est terminé.À l'exception du code envoyé à n'importe quelle branche du référentiel, les master
actions suivantes sont effectuées:- Générez le projet sur Travis CI.
- Tous les tests unitaires, d'intégration et de bout en bout sont effectués.
Uniquement pour le code qui entre dans master
les cales suivantes:- Tout ce qui est dit plus haut, plus ...
- Créez l'image Docker en fonction du code, des paramètres et de l'environnement actuels.
- Placement d'une image sur le Docker Hub.
- Connexion au serveur de production.
- Téléchargement de l'image du Docker Hub vers le serveur.
- Arrêtez le conteneur actuel et démarrez-en un nouveau en fonction de la nouvelle image.
Si vous ne savez absolument rien de Docker, des images et des conteneurs - ne vous inquiétez pas. Je vais tout vous dire à ce sujet.Qu'est-ce qu'un CI / CD?
L'abréviation CI / CD signifie "intégration continue / déploiement continu" - "intégration continue / déploiement continu".▍ Intégration continue
L'intégration continue est un processus au cours duquel les développeurs effectuent des validations dans le référentiel principal du code source du projet (généralement dans une branche master
). Dans le même temps, la qualité du code est assurée par la réalisation de tests automatisés.▍ Déploiement continu
Le déploiement continu est le déploiement automatisé fréquent de code en production. La deuxième partie de l'abréviation CI / CD est parfois décrite comme "livraison continue" ("livraison continue"). Ceci, en général, est identique au «déploiement continu», mais la «livraison continue» implique la nécessité d'une confirmation manuelle des modifications avant de démarrer le processus de déploiement du projet.Début des travaux
L'application sur laquelle je maîtrise tout s'appelle TakeNote . Il s'agit du projet Web sur lequel je travaille, conçu pour prendre des notes. Au début, j'ai essayé de créer un projet JAMStack , ou simplement une application frontale sans serveur, afin de profiter des capacités d' hébergement et de déploiement standard offertes par Netlify . Au fur et à mesure que la complexité de l'application augmentait, je devais créer sa partie serveur, ce qui signifiait que je devrais élaborer ma propre stratégie d'intégration automatisée et de déploiement automatisé du projet.Dans mon cas, l'application est un serveur Express fonctionnant dans l'environnement Node.js, servant une application React d'une seule page et prenant en charge une API de serveur sécurisée. Cette architecture suit la stratégie trouvée dans ce guide d'authentification de pile complète.J'ai consulté un ami qui est un expert en automatisation et lui ai demandé ce que je devais faire pour que cela fonctionne comme je le souhaitais. Il m'a donné une idée de ce à quoi devrait ressembler un flux de travail automatisé, décrit dans la section Objectifs de cet article. Le fait que je me sois fixé de tels objectifs signifiait que je devais comprendre comment utiliser Docker.Docker
Docker est un outil qui, grâce à la technologie de conteneurisation, facilite la distribution des applications, ainsi que leur déploiement et leur lancement dans le même environnement, même si la plateforme Docker elle-même fonctionne dans des environnements différents. Pour commencer, j'avais besoin d'avoir des outils de ligne de commande (CLI) Docker à ma disposition. Les instructions d'installation de Docker ne peuvent pas être qualifiées de très claires et compréhensibles, mais vous pouvez en apprendre que pour effectuer la première étape de l'installation, vous devez télécharger Docker Desktop (pour Mac ou Windows).Docker Hub est à peu près le même que GitHub pour les référentiels git ou le registre npmpour les packages JavaScript. Il s'agit d'un référentiel en ligne pour les images Docker. Il s'y connecte Docker Desktop.Donc, pour commencer avec Docker, vous devez faire deux choses:Après cela, vous pouvez vérifier que la CLI Docker fonctionne en exécutant la commande suivante pour vérifier la version de Docker:docker -v
Ensuite, connectez-vous au Docker Hub en entrant, Ă la demande, votre nom d'utilisateur et votre mot de passe:docker login
Pour utiliser Docker, vous devez comprendre les concepts d'images et de conteneurs.â–Ť Images
Une image est quelque chose comme un plan contenant des instructions pour la construction d'un conteneur. Il s'agit d'un instantané immuable du système de fichiers et des paramètres d'application. Les développeurs peuvent facilement partager des images.#
docker images
Cette commande affichera un tableau avec l'en-tĂŞte suivant:REPOSITORY TAG IMAGE ID CREATED SIZE
---
Ensuite, nous allons considérer quelques exemples de commandes dans le même format - vient d'abord une commande avec un commentaire, puis un exemple de ce qu'elle peut produire.▍Conteneurs
Un conteneur est un package exécutable qui contient tout ce dont vous avez besoin pour exécuter une application. Une application avec cette approche fonctionnera toujours de la même manière, quelle que soit l'infrastructure: dans un environnement isolé et dans le même environnement. Le fait est que dans des environnements différents, des instances de la même image sont lancées.#
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
---
▍Étiquettes
Une balise est une indication d'une version spécifique d'une image.▍ Résumé de la commande Docker
Voici un aperçu de certaines commandes Docker couramment utilisées.▍ Dockerfile
Je sais comment exécuter une application de production localement. J'ai une configuration Webpack conçue pour créer une application React prête à l'emploi. Ensuite, j'ai une commande qui démarre un serveur basé sur Node.js sur le port 5000
. Cela ressemble Ă ceci:npm i #
npm run build # React-
npm run start # Node-
Il convient de noter que je n'ai pas d'exemple d'application pour ce matériel. Mais ici, pour les expériences, toute application Node simple convient.Pour utiliser le conteneur, vous devez donner des instructions à Docker. Cela se fait via un fichier appelé Dockerfile
situé dans le répertoire racine du projet. Ce fichier, au premier abord, semble assez obscur.Mais ce qu'il contient décrit uniquement, avec des commandes spéciales, quelque chose de similaire à la configuration d'un environnement de travail. Voici certaines de ces commandes:- FROM - Cette commande démarre le fichier. Il indique l'image de base sur la base de laquelle le conteneur est construit.
- COPY - Copiez des fichiers d'une source locale vers un conteneur.
- WORKDIR - Définition du répertoire de travail pour les commandes suivantes.
- RUN - Exécute les commandes.
- EXPOSE - Paramètres du port.
- ENTRYPOINT - Spécifie la commande à exécuter.
Dockerfile
pourrait ressembler Ă ceci:#
FROM node:12-alpine
# app/
COPY . app/
# app/
WORKDIR app/
# ( npm ci npm i, )
RUN npm ci --only-production
# React-
RUN npm run build
#
EXPOSE 5000
# Node-
ENTRYPOINT npm run start
Selon l'image de base sélectionnée, vous devrez peut-être installer des dépendances supplémentaires. Le fait est que certaines images de base (comme Node Alpine Linux) sont conçues pour les rendre aussi compactes que possible. Par conséquent, ils peuvent ne pas avoir certains des programmes sur lesquels vous comptez.▍ Construire, étiqueter et lancer un conteneur
L'assemblage local et le lancement du conteneur sont, après nous Dockerfile
, les tâches sont assez simples. Avant d'envoyer une image au Docker Hub, vous devez la tester localement.▍ Assemblage
Vous devez d'abord collecter l' image en spécifiant un nom et, éventuellement, une balise (si la balise n'est pas spécifiée, le système attribuera automatiquement une balise à l'image latest
).#
docker build -t <image>:<tag> .
Après avoir exécuté cette commande, vous pouvez observer comment Docker crée l'image.Sending build context to Docker daemon 2.88MB
Step 1/9 : FROM node:12-alpine
---> ... ...
Successfully built 123456789123
Successfully tagged <image>:<tag>
L'assemblage peut prendre quelques minutes - tout dépend du nombre de dépendances dont vous disposez. Une fois l'assemblage terminé, vous pouvez exécuter la commande docker images
et consulter la description de votre nouvelle image.REPOSITORY TAG IMAGE ID CREATED SIZE
<image> latest 123456789123 About a minute ago x.xxGB
▍Démarrer
L'image est créée. Et cela signifie que sur sa base, il est possible de lancer un conteneur. Étant donné que je veux pouvoir accéder à l'application en cours d'exécution dans le conteneur à l'adresse que localhost:5000
j'ai 5000:5000
installée sur le côté gauche de la paire dans la commande suivante 5000
. Sur le côté droit se trouve le port à conteneurs.# 5000 5000
docker run -p 5000:5000 <image>:<tag>
Maintenant que le conteneur est créé et lancé, vous pouvez utiliser la commande docker ps
pour consulter les informations sur ce conteneur (ou vous pouvez utiliser la commande docker ps -a
qui affiche des informations sur tous les conteneurs, pas seulement ceux qui fonctionnent).CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
987654321234 <image> "/bin/sh -c 'npm run…" 6 seconds ago Up 6 seconds 0.0.0.0:5000->5000/tcp stoic_darwin
Si vous allez Ă l'adresse maintenant localhost:5000
, vous pouvez voir la page de l'application de travail, qui ressemble exactement Ă la page de l'application fonctionnant dans l'environnement de production.â–Ť Affectation et publication des balises
Afin d'utiliser l'une des images créées sur le serveur de production, nous devons être en mesure de télécharger cette image à partir du Docker Hub. Cela signifie que vous devez d'abord créer un référentiel pour le projet sur le Docker Hub. Après cela, nous aurons à notre disposition un endroit où vous pourrez fixer l'image. L'image doit être renommée pour que son nom commence par notre nom d'utilisateur sur le Docker Hub. Après cela devrait être le nom du référentiel. À la fin du nom peut être n'importe quelle balise. Voici un exemple de dénomination d'images à l'aide de ce schéma.Vous pouvez maintenant collecter l'image avec un nouveau nom et exécuter la commande docker push
pour l'envoyer au référentiel Docker Hub.docker build -t <username>/<repository>:<tag> .
docker tag <username>/<repository>:<tag> <username>/<repository>:latest
docker push <username>/<repository>:<tag>
# , , :
docker build -t user/app:v1.0.0 .
docker tag user/app:v1.0.0 user/app:latest
docker push user/app:v1.0.0
Si tout se passe bien, l'image sera disponible sur le Docker Hub et pourra être facilement téléchargée sur le serveur ou transférée à d'autres développeurs.Prochaines étapes
À ce jour, nous nous sommes assurés que l'application, sous la forme d'un conteneur Docker, fonctionne localement. Nous avons téléchargé le conteneur sur le Docker Hub. Tout cela signifie que nous avons déjà fait de très bons progrès vers l'objectif. Maintenant, nous devons résoudre deux autres questions:- Configuration d'un outil CI pour tester et déployer du code.
- Configuration du serveur de production pour qu'il puisse charger et exécuter notre code.
Dans notre cas, Travis CI est utilisé comme solution CI / CD . En tant que serveur - DitigalOcean .Il convient de noter qu'ici, vous pouvez utiliser une autre combinaison de services. Par exemple, au lieu de Travis CI, vous pouvez utiliser des actions CircleCI ou Github. Et au lieu de DigitalOcean - AWS ou Linode.Nous avons décidé de travailler avec Travis CI, et dans ce service, j'ai déjà quelque chose de configuré. Par conséquent, je vais maintenant parler brièvement de la façon de le préparer au travail.Travis ci
Travis CI est un outil de test et de déploiement de code. Je ne voudrais pas entrer dans les subtilités de la mise en place de Travis CI, car chaque projet est unique, et cela n'apportera pas beaucoup d'avantages. Mais je vais vous parler des bases qui vous permettront de commencer si vous décidez d'utiliser Travis CI. Quoi que vous choisissiez - Travis CI, CircleCI, Jenkins ou autre chose, des méthodes de configuration similaires seront utilisées partout.Pour commencer à travailler avec Travis CI, rendez-vous sur le site du projetet créez un compte. Intégrez ensuite Travis CI à votre compte GitHub. Pendant la configuration du système, vous devrez spécifier le référentiel avec lequel vous souhaitez automatiser et autoriser l'accès à celui-ci. (J'utilise GitHub, mais je suis sûr que Travis CI peut s'intégrer avec BitBucket, GitLab et d'autres services similaires).Chaque fois que Travis CI est mis au travail, un serveur est lancé qui exécute les commandes spécifiées dans le fichier de configuration, y compris le déploiement des branches de référentiel correspondantes.▍ Cycle de vie des tâches
Le fichier de configuration Travis CI, appelé .travis.yml
et stocké dans le répertoire racine du projet, prend en charge le concept d' événements de cycle de vie de travail. Ces événements sont répertoriés dans l'ordre dans lequel ils se produisent:apt addons
cache components
before_install
install
before_script
script
before_cache
after_success after_failure
before_deploy
deploy
after_deploy
after_script
â–ŤTesting
Dans le fichier de configuration, je vais configurer le serveur local Travis CI. Comme langue, j'ai choisi Node 12 et j'ai dit au système d'installer les dépendances nécessaires pour utiliser Docker.Tout ce qui est répertorié dans .travis.yml
sera exécuté lorsque toutes les demandes d'extraction vers toutes les branches du référentiel seront exécutées, sauf indication contraire. Il s'agit d'une fonctionnalité utile, car elle signifie que nous pouvons tester tout le code entrant dans le référentiel. Cela vous permet de savoir si le code est prêt à être écrit dans la branche master
et s'il va perturber le processus de construction du projet. Dans cette configuration globale, j'installe tout localement, démarre le serveur de développement Webpack en arrière-plan (c'est une caractéristique de mon flux de travail) et exécute les tests.Si vous souhaitez afficher les icônes sur votre référentiel avec des informations sur la couverture du code par les tests, ici vous trouverez de brèves instructions sur l' utilisation Jest, Travis CI et salopettes pour recueillir et afficher ces informations.Voici donc le contenu du fichier .travis.yml
:#
language: node_js
# Node.js
node_js:
- '12'
services:
# Docker
- docker
install:
#
- npm ci
before_script:
#
- npm run dev &
script:
#
- npm run test
Ici se terminent les actions effectuées pour toutes les branches du référentiel et pour les demandes d'extraction.▍ Déploiement
En supposant que tous les tests automatisés se sont déroulés avec succès, nous pouvons éventuellement déployer le code sur le serveur de production. Puisque nous voulons le faire uniquement pour le code d'une branche master
, nous donnons au système des instructions appropriées dans les paramètres de déploiement. Avant d'essayer d'utiliser le code dans votre projet, que nous examinerons plus tard, je voudrais vous avertir que vous devez avoir un vrai script appelé pour le déploiement.deploy:
# Docker- Docker Hub
provider: script
script: bash deploy.sh
on:
branch: master
Le script de déploiement résout deux problèmes:- Créez, étiquetez et envoyez l'image au Docker Hub à l'aide de l'outil CI (dans notre cas, c'est Travis CI).
- Chargement de l'image sur le serveur, arrêt de l'ancien conteneur et démarrage du nouveau (dans notre cas, le serveur s'exécute sur la plateforme DigitalOcean).
Vous devez d'abord configurer le processus automatique d'assemblage, de marquage et d'envoi de l'image au Docker Hub. Tout cela est très similaire à ce que nous avons déjà fait manuellement, sauf qu'ici nous avons besoin d'une stratégie pour attribuer des balises uniques aux images et automatiser la connexion. J'ai eu des difficultés avec certains détails du script de déploiement, tels qu'une stratégie de balisage, la connexion, le codage des clés SSH, l'établissement d'une connexion SSH. Mais, heureusement, mon petit ami gère très bien bash, ainsi que bien d'autres choses. Il m'a aidé à écrire ce script.Ainsi, la première partie du script envoie l'image au Docker Hub. C'est assez simple. Le schéma de marquage que j'ai utilisé implique la combinaison d'un hachage git et d'un tag git, s'il en existe un. Cela permet la création d'une balise unique et simplifie l'identification de l'assemblage sur lequel elle est basée. DOCKER_USERNAME
et DOCKER_PASSWORD
sont des variables d'environnement utilisateur qui peuvent être définies à l'aide de l'interface Travis CI. Travis CI traite automatiquement les données sensibles afin qu'elles ne tombent pas entre de mauvaises mains.Voici la première partie du script deploy.sh
.#!/bin/sh
set -e #
IMAGE="<username>/<repository>" # Docker
GIT_VERSION=$(git describe --always --abbrev --tags --long) # Git-
#
docker build -t ${IMAGE}:${GIT_VERSION} .
docker tag ${IMAGE}:${GIT_VERSION} ${IMAGE}:latest
# Docker Hub
echo "${DOCKER_PASSWORD}" | docker login -u "${DOCKER_USERNAME}" --password-stdin
docker push ${IMAGE}:${GIT_VERSION}
La nature de la deuxième partie du script dépend de l'hôte que vous utilisez et de l'organisation de la connexion. Dans mon cas, depuis que j'utilise Digital Ocean, les commandes doctl sont utilisées pour se connecter au serveur . Lorsque vous travaillez avec Aws, un utilitaire sera utilisé aws
, etc.La configuration du serveur n'a pas été particulièrement difficile. J'ai donc mis en place une gouttelette basée sur l'image de base. Il convient de noter que le système que j'ai sélectionné nécessite une installation manuelle unique de Docker et un lancement manuel unique de Docker. J'ai utilisé Ubuntu 18.04 pour installer Docker, donc si vous utilisez Ubuntu pour faire de même, vous pouvez simplement suivre ce guide simple.Je ne parle pas ici de commandes spécifiques pour le service, car cet aspect peut varier considérablement dans différents cas. Je ne donnerai qu'un plan d'action général qui sera réalisé après connexion via SSH au serveur sur lequel le projet sera déployé:- Vous devez trouver le conteneur en cours d'exécution et l'arrêter.
- Ensuite, en arrière-plan, vous devez lancer un nouveau conteneur.
- Vous devrez définir le port du serveur local sur une valeur
80
- cela vous permettra d'entrer le site Ă l'adresse du formulaire example.com
, sans spécifier le port, et de ne pas utiliser l'adresse comme example.com:5000
. - Et enfin, vous devez supprimer tous les anciens conteneurs et images.
Voici la suite du script.# ID
CONTAINER_ID=$(docker ps | grep takenote | cut -d" " -f1)
# , ,
docker stop ${CONTAINER_ID}
docker run --restart unless-stopped -d -p 80:5000 ${IMAGE}:${GIT_VERSION}
docker system prune -a -f
Quelques points à considérer
Peut-être que lorsque vous vous connectez au serveur via SSH à partir de Travis CI, vous verrez un avertissement qui ne permettra pas à l'installation de continuer, car le système attendra que l'utilisateur réponde.The authenticity of host '<hostname> (<IP address>)' can't be established.
RSA key fingerprint is <key fingerprint>.
Are you sure you want to continue connecting (yes/no)?
J'ai appris que la clé de chaîne peut être encodée en base64 afin de l'enregistrer sous une forme dans laquelle il sera pratique et fiable de travailler avec elle. Au stade de l'installation, vous pouvez décoder la clé publique et l'écrire dans un fichier known_hosts
afin de supprimer l'erreur ci-dessus.echo <public key> | base64 # < , base64>
En pratique, cette commande peut ressembler Ă ceci:echo "123.45.67.89 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAklOUpkDHrfHY17SbrmTIpNLTGK9Tjom/BWDSU
GPl+nafzlHDTYW7hdI4yZ5ew18JH4JW9jbhUFrviQzM7xlELEVf4h9lFX5QVkbPppSwg0cda3
Pbv7kOdJ/MTyBlWXFCR+HAo3FXRitBqxiX1nKhXpHAZsMciLq8V6RjsNAQwdsdMFvSlVK/7XA
t3FaoJoAsncM1Q9x5+3V0Ww68/eIFmb1zuUFljQJKprrX88XypNDvjYNby6vw/Pb0rwert/En
mZ+AW4OZPnTPI89ZPmVMLuayrD2cE86Z/il8b+gw3r3+1nKatmIkjn2so1d01QraTlMqVSsbx
NrRFi9wrf+M7Q== you@example.com" | base64
Et voici ce qu'elle donne - une chaîne encodée en base64:MTIzLjQ1LjY3Ljg5IHNzaC1yc2EgQUFBQUIzTnphQzF5YzJFQUFBQUJJd0FBQVFFQWtsT1Vwa0RIcmZIWTE3U2JybVRJcE5MVEdLOVRqb20vQldEU1UKR1BsK25hZnpsSERUWVc3aGRJNHlaNWV3MThKSDRKVzlqYmhVRnJ2aVF6TTd4bEVMRVZmNGg5bEZYNVFWa2JQcHBTd2cwY2RhMwpQYnY3a09kSi9NVHlCbFdYRkNSK0hBbzNGWFJpdEJxeGlYMW5LaFhwSEFac01jaUxxOFY2UmpzTkFRd2RzZE1GdlNsVksvN1hBCnQzRmFvSm9Bc25jTTFROXg1KzNWMFd3NjgvZUlGbWIxenVVRmxqUUpLcHJyWDg4WHlwTkR2allOYnk2dncvUGIwcndlcnQvRW4KbVorQVc0T1pQblRQSTg5WlBtVk1MdWF5ckQyY0U4NlovaWw4YitndzNyMysxbkthdG1Ja2puMnNvMWQwMVFyYVRsTXFWU3NieApOclJGaTl3cmYrTTdRPT0geW91QGV4YW1wbGUuY29tCg==
Voici l'équipe mentionnée ci-dessusinstall:
- echo < , base64> | base64 -d >> $HOME/.ssh/known_hosts
La même approche peut être utilisée avec une clé privée lors de l'établissement d'une connexion, car vous pouvez avoir besoin d'une clé privée pour accéder au serveur. Lorsque vous travaillez avec une clé, il vous suffit de garantir son stockage sécurisé dans la variable d'environnement Travis CI, et de sorte qu'elle ne soit affichée nulle part.Une autre chose à laquelle vous devez faire attention est que vous devrez peut-être exécuter l'intégralité du script de déploiement, présenté sur une seule ligne, par exemple, à l'aide de doctl
. Cela peut nécessiter un effort supplémentaire.doctl compute ssh <droplet> --ssh-command " && "
TLS / SSL et équilibrage de charge
Après avoir fait tout ce qui a été discuté ci-dessus, le dernier problème qui s'est posé devant moi était que le serveur n'avait pas SSL. Depuis que j'utilise le serveur Node.js, afin de rendre l' Nginx et Chiffrer proxys inverses Let travail , je dois bricoler beaucoup.Je n'avais vraiment pas envie de faire tous ces paramètres SSL manuellement, alors je viens de créer un équilibreur de charge et d'enregistrer des informations à ce sujet dans DNS. Dans le cas de DigitalOcean, par exemple, la création d'un certificat auto-renouvelé auto-renouvelé sur un équilibreur de charge est une procédure simple, gratuite et rapide. Cette approche présente un avantage supplémentaire qui, si nécessaire, facilite la configuration de SSL sur une variété de serveurs exécutant un équilibreur de charge. Cela permet aux serveurs eux-mêmes de ne pas «penser» du tout à SSL, mais d'utiliser le port comme d'habitude 80
. La configuration de SSL sur un équilibreur de charge est donc beaucoup plus simple et plus pratique que les autres méthodes de configuration SSL.Vous pouvez maintenant fermer sur le serveur tous les ports qui acceptent les connexions entrantes - à l'exception du port 80
utilisé pour la communication avec l'équilibreur de charge et du port 22
pour SSH. Par conséquent, une tentative d'accès direct au serveur sur n'importe quel port, à l'exception de ces deux, échouera.Sommaire
Après avoir fait tout ce qui était décrit dans ce document, je n'avais plus peur ni de la plateforme Docker ni du concept de chaînes CI / CD automatisées. J'ai pu mettre en place une chaîne d'intégration continue au cours de laquelle le code est testé avant sa mise en production et le code est automatiquement déployé sur le serveur. Tout cela pour moi est encore relativement nouveau, et je suis sûr qu'il existe des moyens d'améliorer mon flux de travail automatisé et de le rendre plus efficace. Par conséquent, si vous avez des idées à ce sujet, faites-le moi savoir. J'espère que cet article vous a aidé dans vos affaires. Je veux croire qu'après l'avoir lu, vous avez appris autant que moi, alors que j'ai compris tout ce que j'en ai dit.PS Il y a une image sur notre marchéDocker , qui s'installe en un clic. Vous pouvez vérifier le fonctionnement des conteneurs sur VPS . Tous les nouveaux clients bénéficient de 3 jours gratuits pour les tests.Chers lecteurs! Utilisez-vous les technologies CI / CD dans vos projets?