Strapi v4 : Infrastructure pour déployer strapi dans un serveur Ubuntu avec Docker Compose

Introduction

Pour simplifier le déploiement de Strapi 4, nous prévoyons de mettre en œuvre une infrastructure de déploiement en utilisant Docker Compose. Cette approche est idéale pour les environnements de test, assurant une gestion efficace des conteneurs et simplifiant le processus de configuration. Pour les déploiements en production, nous privilégierons des outils tels que Kubernetes.

Prérequis

Afin de rendre la lecture de l’article plus accessible et compréhensible, partons du principe que nous disposons d’un projet nommé strapi-project hébergé sur notre GitLab privé à l’adresse gitlab.kata.ovh. De plus, notre instance GitLab est équipée d’un registre permettant de stocker nos images Docker, accessible via l’URL registry.kata.ovh.

Étape 1 : Préparation du projet

Créez un fichier Dockerfile.prod à la racine de votre projet avec le contenu suivant.

FROM node:18-alpine
# Installing libvips-dev for sharp Compatibility
RUN apk update && apk add --no-cache build-base gcc autoconf automake zlib-dev libpng-dev nasm bash vips-dev git
ARG NODE_ENV=development
ENV NODE_ENV=${NODE_ENV}

WORKDIR /opt/
COPY package.json yarn.lock ./
RUN yarn global add node-gyp
RUN yarn config set network-timeout 600000 -g && yarn install
ENV PATH /opt/node_modules/.bin:$PATH

WORKDIR /opt/app
COPY . .
RUN chown -R node:node /opt/app
USER node
RUN ["yarn", "build"]
EXPOSE 1337
CMD ["yarn", "develop"]

Ce fichier Dockerfile.prod est utilisé pour construire une image légère de notre projet spécialement conçue pour les environnements de production et de préproduction.

Étape 2 : Création de l’image Docker

Dans cette section, nous allons générer l’image de notre projet Strapi v4 et la téléverser vers le registre de notre GitLab privé. Cela permettra de la rendre accessible depuis notre serveur Ubuntu.

Assurez-vous d’être connecté à GitLab Container Registry. Vous pouvez vous connecter en utilisant la commande suivante dans votre terminal :

docker login registry.kata.ovh

La commande vous demandera de saisir votre username gitlab

Puis votre mot de passe

Password: ********

Exécutez la commande suivante pour générer l’image Docker en utilisant le fichier Dockerfile.prod précédemment créé.

docker build -f Dockerfile.prod -t registry.kata.ovh/strapi-project/api:v1.0.2 .

Ensuite, poussez l’image générée vers le registre GitLab registry.kata.ovh en utilisant la commande suivante

docker push registry.kata.ovh/strapi-project/api:v1.0.2

Étape 3 : Mise en place de l’Infrastructure de Déploiement

Créer le dépôt git

Pour la configuration de notre infrastructure de déploiement Strapi v4, nous allons créer un groupe “deploy” dans GitLab, ainsi qu’un dépôt au sein de ce groupe, que nous nommerons “strapi4-dc”. L’acronyme “dc” est utilisé ici pour Docker Compose, parce que d’autres technologies comme Helm auraient également pu être employées pour le déploiement. Cette approche vise à isoler notre infrastructure de déploiement de notre projet, favorisant ainsi une meilleure réutilisation.

Pour créer le dossier strapi4-dc sur votre ordinateur, utilisez les commandes suivantes dans votre terminal :

# Création du dossier
mkdir strapi4-dc

# Déplacement dans le dossier
cd strapi4-dc
Créer le fichier docker-compose.yml

Ensuite, créez le fichier docker-compose.yml et ajoutez le contenu suivant :

version: "3.7"

services:
  strapi:
    image: $APP_IMAGE
    restart: unless-stopped
    env_file: .env
    environment:
      DATABASE_CLIENT: ${DATABASE_CLIENT}
      DATABASE_HOST: postgres
      DATABASE_PORT: ${DATABASE_PORT}
      DATABASE_NAME: ${DATABASE_NAME}
      DATABASE_USERNAME: ${DATABASE_USERNAME}
      DATABASE_PASSWORD: ${DATABASE_PASSWORD}
      JWT_SECRET: ${JWT_SECRET}
      ADMIN_JWT_SECRET: ${ADMIN_JWT_SECRET}
      APP_KEYS: ${APP_KEYS}
      NODE_ENV: ${NODE_ENV}
    ports:
      - "${STRAPI_HOST_PORT}:1337"
    volumes:
      - ./uploads:/opt/app/public/uploads
      - ./.env:/opt/app/.env:ro
    networks:
      - strapi

  postgres:
    image: postgres:12.0-alpine
    env_file: .env
    environment:
      POSTGRES_DB: ${DATABASE_NAME}
      POSTGRES_USER: ${DATABASE_USERNAME}
      POSTGRES_PASSWORD: ${DATABASE_PASSWORD}
    volumes:
      - ./postgres:/var/lib/postgresql/data
    networks:
      - strapi

  pgadmin:
    image: dpage/pgadmin4:8.0
    environment:
      PGADMIN_DEFAULT_EMAIL: ${POSTGRES_EMAIL}
      PGADMIN_DEFAULT_PASSWORD: ${POSTGRES_PASSWORD}
      PGADMIN_CONFIG_WTF_CSRF_CHECK_DEFAULT: 'False'
      PGADMIN_CONFIG_WTF_CSRF_ENABLED: 'False'
    ports:
      - "${PGADMIN_HOST_PORT}:80"
    depends_on:
      - postgres
    networks:
      - strapi

networks:
  strapi:

Notre fichier docker-compose.yml configure trois services (Strapi, PostgreSQL, et PgAdmin) dans un réseau nommé “strapi”. Il utilise des variables d’environnement provenant d’un fichier .env pour configurer les services.

Service Strapi (strapi)

  • Utilise l’image définie par la variable $APP_IMAGE.
  • Redémarre automatiquement en cas de crash sauf s’il est explicitement arrêté.
  • Charge les variables d’environnement à partir du fichier .env.
  • Expose le port défini par la variable ${STRAPI_PORT}.
  • Monte les volumes pour stocker les téléchargements et le fichier .env.
  • Connecté au réseau “strapi”.

Service PostgreSQL (postgres)

  • Utilise l’image PostgreSQL version 12.0 sur Alpine Linux.
  • Charge les variables d’environnement à partir du fichier .env.
  • Crée la base de données et l’utilisateur avec les informations fournies.
  • Monte un volume pour stocker les données PostgreSQL.
  • Connecté au réseau “strapi”.

Service PgAdmin (pgadmin)

  • Utilise l’image PgAdmin (Outils de gestion et d’administration de bases de données PostgreSQL)
  • Configure PgAdmin avec les informations d’identification spécifiées dans le fichier .env.
  • Expose le port défini par la variable ${PGADMIN_PORT}.
  • Dépend du service PostgreSQL.
  • Connecté au réseau “strapi”.
Créer le fichier .env

Créer le fichier .env et ajoutez le contenu suivant :

# STRAPI Configuration
PORT=1337
APP_KEYS=JpYqnzFjgj75EeyDrxA==,gja6Uamtx6TqtvyW5RgMKA==,PyP+zTK7gVbhstSpMOuSmQ==,iU88W5ElOt5LdhhRjZfiBw==
API_TOKEN_SALT=m1Lz5r48wYr83910MXOe3Q==
ADMIN_JWT_SECRET=AYCUcsY76554Ev5yP5w==
TRANSFER_TOKEN_SALT=zPUEUfD67HjFAQ4Dv0Q==
DATABASE_CLIENT=postgres
DATABASE_HOST=postgres
DATABASE_PORT=5432
DATABASE_NAME=kata
DATABASE_USERNAME=kata
DATABASE_PASSWORD=3Mvg64c62hB567EVVe
DATABASE_SSL=false
JWT_SECRET=kLRX4354GAhQI578nLSH4ZQ==
NODE_ENV=development
STRAPI_HOST_PORT=80
APP_IMAGE_FALLBACK=registry.kata.ovh/strapi-project/api:v1.0.2

# PGADMIN Configuration
[email protected]
POSTGRES_PASSWORD=3Mvg64c62hB567EVVe
PGADMIN_HOST_PORT=1378

# GITLAB REGISTRY Configuration
[email protected]
REGISTRY_PASSWORD=glpat-R9k3iYciZGG2QbWQLg7F
REGISTRY=registry.kata.ovh

Il contient les informations nécessaires pour configurer notre environnement Docker Compose pour Strapi et PgAdmin. N’oubliez pas de personnaliser les valeurs en fonction de la configuration souhaitée.

Gestion de l’état de notre infrastructure

Notre service Strapi au niveau de notre fichier docker-compose utilise un volume pour assurer la persistance des téléchargements de fichier. Il faut alors créer le volume ./uploads monté dans le répertoire /opt/app/public/uploads, garantissant que les téléchargements de l’application Strapi sont stockés de manière persistante.

mkdir uploads

Idem pour notre service PostgreSQL, pour assurer la persistance de notre base de données il faut créer le volume ./postgres qui est lié au chemin /var/lib/postgresql/data à l’intérieur du conteneur PostgreSQL.

mkdir postgres

Créer également un fichier .gitignore pour ignorer le contenu de nos volumes ainsi que notre fichier de configuration .env lors de la gestion de version avec Git.

uploads/*
postgres/*
.env
Créer le fichier deploy.sh

Pour finir nous allons créer le fichier deploy.sh qui permet de lancer notre déploiement :

#!/bin/bash

# Chargement des variables d'environnement depuis le fichier .env
if [ -f .env ]; then
  source .env
else
  echo "Erreur : Le fichier .env n'est pas trouvé."
  exit 1
fi

# Si aucun paramètre n'est fourni, utilise la valeur de APP_IMAGE_FALLBACK du fichier .env
if [ $# -eq 0 ]; then
  export APP_IMAGE="$APP_IMAGE_FALLBACK"
else
  # Si un paramètre est fourni, utilise la valeur fournie
  export APP_IMAGE="$1"
fi

# connexion au registre
docker login -u $REGISTRY_USER -p $REGISTRY_PASSWORD $REGISTRY

# Ajouter /snap/bin au PATH si necessaire
# export PATH=$PATH:/snap/bin

docker-compose down
docker-compose pull
docker-compose up -d

Le script deploy.sh permet le déploiement de notre application Strapi. Ce script prend en paramètre le tag d’image de notre projet qui a été envoyé au registre. Si aucun tag d’image n’est spécifié en tant que paramètre, il utilise le tag par défaut défini dans la variable APP_IMAGE_FALLBACK.

En adoptant cette approche, le script deploy.sh peut être utilisé dans des processus d’intégration continue (CI) ou de déploiement continu (CD) sans nécessiter de changements dans le script lui-même. Ainsi, en modifiant simplement le tag d’image lors de l’exécution du script, on peut déployer différentes versions de l’application dynamiquement.

Envoyer les fichiers dans le dépôt distant

Pour pousser votre infrastructure dans le dépôt distant à l’adresse https://gitlab.kata.ovh/deploy/strapi4-dc.git, executez les commandes ci dessous :

#Initialisation du dépôt local
git init

#Ajout des fichiers au suivi de Git
git add .

#Validation des modifications locales
git commit -m "Initial commit - Ajout de l'infrastructure Docker Compose"

#Ajout du dépôt distant (origin)
git remote add origin https://gitlab.kata.ovh/deploy/strapi4-dc.git

# Pousser vers le dépôt distant (branche principale main)
git push origin main

Étape 4 : Déploiement

Dans cette étape nous allons déployer l’application au niveau de notre serveur Ubuntu

Création d’un utilisateur de déploiement

Connectez-vous à votre serveur Ubuntu en tant que root à l’aide de la commande.

# Saisissez la commande puis suivez les instructions
ssh [email protected]

# connexion avec clé RSA
ssh -i id_rsa_kata [email protected]

Créer un utilisateur spécifique dédié au déploiement de l’application pour des raisons de sécurité. Utilisons le nom d’utilisateur deploy comme suit :

sudo adduser deploy

Suivez les instructions pour définir le mot de passe et les informations supplémentaires de l’utilisateur.

Ajoutez l’utilisateur au groupe sudo pour lui donner les privilèges nécessaires :

sudo usermod -aG sudo deploy
Déploiement
# Connexion avec l'utilisateur de deploiement
ssh [email protected]

# Créer le dossier dans le répertoire personnel de l'utilisateur de déploiement
mkdir ~/strapi-project

# Se deplacer dans le dossier
cd ~/strapi-project

# cloner notre infrastructure au niveau de notre serveur Ubuntu
git clone https://gitlab.kata.ovh/deploy/strapi4-dc.git .

# Créer le fichier .env et renseigner les informations 
# Pour sauvegarder, Ctrl + O puis appuyer sur "Enter"
# Pour quitter, Ctrl + X
nano .env

# rendre deploy.sh exécutable
chmod +x deploy.sh

# Executer la version par defaut de notre projet Strapi
# deploy.sh deploiera le tag APP_IMAGE_FALLBACK dans .env
./deploy.sh

Pour déployer une nouvelle version (v1.0.3) de l’application à partir d’une pipeline, par exemple, sans avoir à modifier les fichiers de notre infrastructure, vous pouvez utiliser la commande suivante :

# Executer une nouvelle version de notre projet Strapi
./deploy.sh "registry.kata.ovh/strapi-project/api:v1.0.3"

Conclusion

Notre exploration a permis de construire une infrastructure robuste et adaptable pour le déploiement de Strapi 4, soulignant l’efficacité et la simplicité offertes par Docker Compose dans la gestion des applications conteneurisées. Ces connaissances peuvent servir de guide pour d’autres projets similaires et faciliter la compréhension des principes fondamentaux de déploiement avec Docker sur un serveur Linux.

Mamadou Diagne
Mamadou Diagne
Architecte logiciel & CTO

Diplômé d'ETNA, la filière d'alternance d'Epitech, j'ai acquis une expertise solide dans le développement d'applications, travaillant sur des projets complexes et techniquement diversifiés. Mon expérience englobe l'utilisation de divers frameworks et langages, notamment Symfony, Api Platform, Drupal, Zend, React Native, Angular, Vue.js, Shell, Pro*C...

0 0 votes
Évaluation de l'article
guest
0 Commentaires
Commentaires en ligne
Afficher tous les commentaires

Ingénierie informatique (SSII)

Applize crée des logiciels métiers pour accompagner les entreprises dans la transition vers le zéro papier.


Avez-vous un projet en tête ? Discutons-en.