BLOG 1

Cover Image for Puppeteer PDF Service including Docker,Processes, Generating a PDF document, Interactions between technologies, API, Programming, TypeScript, JavaScript, Nextjs, Tailwindcss - Blog 1

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.

Parlez-nous de votre projet

Nos bureaux

  • Montréal
    St-Henri