Skip to content

Annexe E - Déploiement

Déployer une application Spring MVC avec pages JSP

Il faudra faire quelques étapes pour s'assurer que l'application soit empaquetée de façon convenable pour le déploiement.

Préparer l'application

Pour permettre d'avoir une version de développement et un version de déploiement de l'application, on utilisera différents fichiers de propriétés.

  • Créer un fichier application-prod­.properties.
  • Transférer le contenu du fichier application.properties dans celui-ci.
  • Modifiez toutes les propriétés pour correspondre à l'environnement de production. Par exemple, les informations de connexion à la base de données.

  • Si dans votre applicaiton, vous faites références directe à l'adresse http://localhost:8080, il faudra s'assurer de faire les modifications pour qu'il n'y ait pas de problème une fois l'application déployée.

    • Dans les fichiers .properties ajouter une variable app.baseurl et donnez lui la valeur de l'URL de base de votre application. En déploiement ce sera http://localhost:8080. En production ce sera lié au nom de domaine de l'application.
    • Pour récupérer cette adresse dans un service par exemple, on utilisera la propriété @Value de Spring. On pourra ensuite utiliser cette variable dans les méthodes du service.

    public class EmailService {
        private JavaMailSender emailSender;
    
        @Value("${app.baseurl}")
        String baseUrl;
    }
    
    - Dans le fichier pom.xml, ajouter la dépendance suivante.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <scope>provided</scope>
</dependency>
  • Ajouter également le mode d'empaquetage avec la balise <packaging>. Cette balise doit se retrouver à l'intérieur de la balse <project> seulement. On indiquera qu'on veut empaqueter en format war.
<packaging>war</packaging>

Empaqueter l'application

  • Dans IntelliJ, ouvrir l'onglet Maven. Éclater le dossier Lifecycle et exécuter clean, puis package.

Onglet Maven

  • Une fois le tout complété, un dossier target sera créé dans lequel vous trouverez un fichier nommé NomApplication-0.0.1-SNAPSHOT.war. C'est l'archive que vous déploierez sur le serveur.

Préparer la base de données.

  • Au besoin, exporter la base de données de votre environnement de développement et l'importer vers le serveur de déploiement.
  • Assurez-vous que l'utilisateur de la base de données ait les permissions requises seulement.

Préparer le serveur

  • S'assurer que Java est disponible sur le serveur. Par défaut ce n'est pas installé sur Ubuntu. On peut l'installer avec
sudo apt install openjdk-17-jdk
  • Créer un utilisateur pour exécuter l'application. Il est préférable de créer un utilisateur dédié, qui n'a pas l'accès root et pas de moyen de se connecter pour exécuter les applications.
sudo useradd -r -s /bin/false springuser
  • Créer un dossier pour votre application. Généralement on le créera dans le dossier /opt.

Effectuer le déploiement de l'application.

  • Déplacer l'archive de votre environnement local vers votre serveur via SSH avec la commande scp
scp chemin/fichier-local user@{ip.serveur}:chemin/distant

Chemin de destination

Il est fortement probalbe qu'il soit impossible de transférer directement dans le dossier /opt/nomApplication car ce doit être fait par un administrateur.

Vous pouvez donc simplement le déplacer vers votre dossier home et le déplacer ensuite une fois connecté au serveur.

Si c'est nécessaire, sudo mv {chemin-initial} {chemin-final}

  • Assurez-vous que le fichier soit exécutable. S'il ne l'est pas vous pouvez le rendre exécutable avec sudo chmod +x {nom-fichier}

  • Ensuite on s'assure que l'utilisateur créé précédemment est le propriétaire du dossier contenant l'application.

sudo chown -R springuser:springuser /opt/{nom-dossier} 

Puisqu' Ubuntu utilise systemd, nous allors créer un service qui s'assurera d'exécuter l'application déployée et de la garder en vie.

  • Déplacez vous vers le dossier /etc/systemd/system et créez y un fichier pour décrire le service. Généralement le fichier se nommera nomApplication.service.

sudo nano nomApplication.service

  • Dans le fichier ajoutez la configuration suivante:
[Unit]
Description=Description de l'application
After=syslog.target

[Service]
User=springuser
ExecStart=java -jar {chemin vers le fichier .war} --spring.profiles.active=prod
SuccessExitStatus=143
Restart=always

[Install]
WantedBy=multi-user.target

En utilisant --spring.profiles.active=prod on indique à l'application d'utiliser le fichier application-prod.properties.

  • Chargez le nouveau service

sudo systemctl daemon-reload

  • Ensuite on active et démarre le service
sudo systemctl enable {nomService}
sudo systemctl start {nomService}
  • On peut ensuite voir le statut avec

sudo systemctl status {nomService}

Tester

L'application devrait maintenant être disponible si vous tentez de vous connecter à http://adresseIp:8080/

Déploiement complet

Si on veut exposer l'application à internet avec un nom de domaine, il faudrait alors configurer un proxy inverse avec un service comme nginx par exemple.