BLOG 1
by Vincent Audette, Software Developer
Service PDF avec Puppeteer, Docker, Nginx et AWS EC2
by Vincent Audette, Software Developer
Configurer un Service de Génération de PDF Sécurisé avec Puppeteer, Docker, et Nginx sur AWS
Pourquoi utiliser Puppeteer pour générer des PDF ? Puppeteer est une bibliothèque Node.js qui permet de contrôler Chrome ou Chromium via une API de haut niveau. Nous l'utiliserons pour générer des PDF à partir de pages Web.
Dans l'infrastructure défini sur la photo ci-haut nous avons utilisé Docker pour containeriser l'application Node.js qui s'appuie sur Puppeteer pour générer des PDF. Nginx sera utilisé comme proxy inverse pour gérer le chiffrement SSL/TLS et acheminer les requêtes vers le conteneur Docker.
La section identifié par Netlify correspond à l'hébergement de l'application Next.js qui contient la page web dont nous allons générer des PDF. Cette page web utilise la bibliothèque tailwindcss pour stylé la page. Note que cet article n'est pas un tutoriel sur la mise en place d'un site web Next.js, mais plutôt une présentation de la configuration de l'infrastructure pour générer des PDF à partir de pages Web.
1. Configuration de l'Instance EC2
La première étape consiste à lancer une instance EC2 sur AWS pour héberger le service.
- Lancer une instance EC2 : Lors de la configuration des groupes de sécurité, assurez-vous de permettre le trafic sur les ports 22 (SSH), 80 (HTTP), et 443 (HTTPS).
- Se connecter à l'instance EC2 :
ssh -i "votre-clé.pem" ec2-user@votre-ip-publique
2. Installation de Docker
Docker est l’outil utilisé pour containeriser l'application Node.js qui s'appuie sur Puppeteer pour générer des PDF.
-
Installer Docker sur Amazon Linux 2 :
sudo yum update -y sudo amazon-linux-extras install docker sudo service docker start sudo usermod -a -G docker ec2-user
-
Vérifier l'installation de Docker :
docker --version
3. Configuration de l'Application Node.js avec Puppeteer
Puppeteer est une bibliothèque Node.js qui permet de contrôler Chrome ou Chromium via une API de haut niveau. Nous l'utiliserons pour générer des PDF à partir de pages Web.
-
Créer l'application Node.js :
mkdir service-pdf cd service-pdf npm init -y npm install express puppeteer
-
Exemple de code Node.js (
index.js
) :const express = require('express'); const puppeteer = require('puppeteer'); const app = express(); const PORT = 3000; app.get('/generate-pdf', async (req, res) => { const browser = await puppeteer.launch({ args: ['--no-sandbox', '--disable-setuid-sandbox'], }); const page = await browser.newPage(); await page.goto('https://example.com', { waitUntil: 'networkidle2' }); const pdfBuffer = await page.pdf({ format: 'Letter', printBackground: true }); await browser.close(); res.set({ 'Content-Type': 'application/pdf', 'Content-Disposition': `attachment; filename="output.pdf"`, }); res.send(pdfBuffer); }); app.listen(PORT, '0.0.0.0', () => { console.log(`Serveur en cours d'exécution sur http://0.0.0.0:${PORT}`); });
4. Création du Conteneur Docker
Docker permet de containeriser l'application Node.js, facilitant ainsi son déploiement et sa gestion.
-
Créer un Dockerfile :
FROM ghcr.io/puppeteer/puppeteer:23.0.2 WORKDIR /usr/src/app COPY package*.json ./ RUN npm install COPY . . EXPOSE 3000 CMD ["node", "index.js"]
-
Construire et exécuter le conteneur Docker :
docker build -t service-pdf . docker run -d -p 3000:3000 --name service-pdf service-pdf
5. Configuration de Nginx pour SSL/TLS avec Let's Encrypt
Nginx sera utilisé comme proxy inverse pour gérer le chiffrement SSL/TLS et acheminer les requêtes vers le conteneur Docker.
-
Installer Nginx :
sudo amazon-linux-extras install nginx1 sudo systemctl start nginx
-
Installer Certbot pour SSL/TLS :
sudo yum install certbot python3-certbot-nginx
-
Générer des certificats SSL avec Let's Encrypt :
sudo certbot --nginx -d service-pdf.votre-domaine.ca
-
Configurer Nginx pour Proxy les Requêtes : Modifiez
/etc/nginx/nginx.conf
ou créez un nouveau fichier de configuration dans/etc/nginx/conf.d/
:server { listen 443 ssl; server_name service-pdf.votre-domaine.ca; ssl_certificate /etc/letsencrypt/live/service-pdf.votre-domaine.ca/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/service-pdf.votre-domaine.ca/privkey.pem; location / { proxy_pass http://localhost:3000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } server { listen 80; server_name service-pdf.votre-domaine.ca; return 301 https://$host$request_uri; }
-
Redémarrer Nginx :
sudo systemctl restart nginx
6. Exécution du Service en Production
Maintenant que votre application est containerisée et que Nginx est configuré comme proxy inverse, vous pouvez accéder à votre service en toute sécurité via https://service-pdf.votre-domaine.ca
.
- Accéder au service :
curl https://service-pdf.votre-domaine.ca/generate-pdf -o output.pdf
Conclusion
En suivant les étapes ci-dessus, vous avez réussi à configurer un service sécurisé de génération de PDF en utilisant Puppeteer, Docker, Nginx et AWS EC2. Cette configuration permet une mise à l'échelle facile, une sécurité renforcée et une maintenance simplifiée, offrant ainsi une solution robuste pour générer des PDF à partir de pages Web.