Configuration de l'API
Configuration de base sans docker
Nous allons prendre l'exemple d'une api NestJS
Copie du projet sur le serveur
git clone lienDuProjet
Installation des dépendances
cd nomDuProjet
npm install -g @nestjs/cli
npm install
Build de l'application et lancement
nest build
cd dist
node main.js
Votre API est en ligne !
Et voilà, votre API est en ligne ! Rien de plus simple, finalement c'est comme quannd vous êtes en local sur votre machine.
Configuration avec docker
Nous allons créer deux conteneurs Docker, un pour l'API et un pour la base de données.
Tip
Il faut savoir que deux conteneur docker qui n'ont pas la même image ne peuvent pas communiquer entre eux, pour cela nous allons utiliser un réseau docker.
Création d'un réseau docker
docker network create mynetwork
Cela va créer un réseau docker nommé mynetwork
, vous pouvez le nommer comme vous le souhaitez.
Création du Dockerfile
A la racine de votre projet, créez un fichier Dockerfile
(vous pouvez le mettre sur git)
FROM node:20
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "dist/main.js"]
Ce fichier permet de créer une image Docker pour votre application.
Info
Pour rappel, une image Docker est un environnement de travail complet, qui contient tout ce dont votre application a besoin pour fonctionner. Elle permet de déployer et d'exécuter votre application dans n'importe quel environnement garantissant que votre application fonctionnera de la même manière partout.
Création du docker-compose.yml
Créez un fichier docker-compose.yml
à la racine de votre projet.
Il permet de lancer votre application en utilisant l'image Docker que vous avez créée, il ira la prendre à la racine directement.
version: "3"
services:
app:
build: .. # le point indique que le Dockerfile est à la racine
ports:
- "3000:3000"
environment: # variables d'envrionnement à disposition dans le conteneur
- POSTGRES_HOST=postgres
- POSTGRES_PORT=5432
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=mysecretpassword
- POSTGRES_DB=postgres
networks:
- mynetwork:
networks:
- mynetwork:
external: true # permet de dire que le réseau est déjà créé (sinon il le crée)
Ici, nous avons créé un service nommé app
qui utilise le Dockerfile pour créer l'image Docker, il expose le port 3000 et utilise le réseau docker mynetwork
.
Lancement du conteneur
docker compose up
Félicitations !
Et voilà, votre API est en ligne !
Voici comment le faire sans docker-compose.yml
, uniquement avec docker run
et docker build
Il est tout à fait possible de lancer le conteneur directement avec une commande docker run
,
Warning
Attention cette comande ne pourra pas build l'image directement, il faudra le faire manuellement avec docker build
. A l'inverse, le fichier docker-compose.yml
créé l'image automatiquement.
docker build -t nomDeVotreImage .
Ici vous choisissez le nom de votre image et elle sera contruite à partir du Dockerfile. Il faut bien penser à mettre le point à la fin de la commande et exécuter cette commande à la racine du projet pour utiliser le bon Dockerfile.
l'équivalent en ligne de commande pour créer le conteneur serait:
docker run --name app --network mynetwork -d -p 3000:3000 -e POSTGRES_HOST=postgres -e POSTGRES_PORT=5432 -e POSTGRES_USER=postgres -e POSTGRES_PASSWORD=mysecretpassword -e POSTGRES_DB=postgres nomDeVotreImage
Warning
Le nom d'HOST de la base de données doit être le même que celui que vous avez donné à votre conteneur de base de données. On voit ça juste après.
Cependant une api ne fonctionne pas sans base de données, voici comment la configurer.
Base de données PostgreSQL
Ici aussi vous avez le choix, soit vous installez PostgreSQL directement sur votre serveur, soit vous utilisez un conteneur Docker.
Info
Il faut savoir qu'en production, il n'est pas conseillé d'utiliser un conteneur Docker pour la base de données (point de vue performance), mais pour des raisons de simplicité, nous allons le faire ici.
Création d'un conteneur Docker pour la base de données PostgreSQL (Si vous utilisez une autre base de données, adaptez les commandes)
Ici nous allons générer un conteneur pour la base de données avec un fichier docker-compose.yml
.
services:
postgres:
image: "postgres:latest"
ports:
- 5432:5432
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: mysecretpassword
POSTGRES_DB: postgres
volumes:
- ./postgresql:/var/lib/postgresql
- ./postgresql_data:/var/lib/postgresql/data
networks:
- mynetwork:
networks:
mynetwork:
external: true
Voici l'équivalent avec la commande docker run
:
Tip
Ici pas besoin de créer un fichier Dockerfile
, l'image est déjà disponible sur le docker hub. postgres:latest est l'image publique de la dernière version de PostgreSQL.
docker run --name postgres --network mynetwork -d -p 5432:5432 -e POSTGRES_USER=postgres -e POSTGRES_PASSWORD=mysecretpassword -e POSTGRES_DB=postgres -v "$(pwd)/postgresql:/var/lib/postgresql" -v "$(pwd)/postgresql_data:/var/lib/postgresql/data" postgres:latest
Je ne vous explique pas comment configurer la base de données étant donné qu'il y a plusieurs types de base de données et que cela dépend de votre projet. (Pour mongo pas besoin de créer de base de données, elle se crée automatiquement, créer le docker suffit)
Pour cet exemple, lorsque votre api se connectera à vôtre base de données, elle ne pourra pas créer de bdd, vous devrez le faire manuellement (en vous connectant via un client comme pgAdmin par exemple, ou bien directement via le terminal).
Il est tout à fait possible de créer les deux conteneurs dans le même fichier docker-compose.yml
, voici comment :
services:
app:
build: .
ports:
- "3000:3000"
environment:
- POSTGRES_HOST=postgres
- POSTGRES_PORT=5432
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=mysecretpassword
- POSTGRES_DB=postgres
networks:
- mynetwork
postgres:
image: "postgres:latest"
ports:
- 5432:5432
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: mysecretpassword
POSTGRES_DB: postgres
volumes:
- ./postgresql:/var/lib/postgresql
- ./postgresql_data:/var/lib/postgresql/data
networks:
- mynetwork
networks:
- mynetwork:
external: true
Vous pouvez maintenant lancer les deux conteneurs avec la commande docker compose up
à la racine de votre projet, où se trouvent les fichiers docker-compose.yml
et Dockerfile
.
Félicitations !
Votre API et votre environnement de base de données sont en ligne et actifs !