[{"data":1,"prerenderedAt":182},["ShallowReactive",2],{"seo-verification":3,"blog-heberger-gotenberg-vps-ma-fr":6,"promo-bar-likely":181},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-heberger-gotenberg-vps-ma-fr",{"id":9,"slug":10,"slugs":11,"title":15,"excerpt":16,"readTime":17,"views":18,"isPinned":19,"noindex":19,"publishedAt":20,"updatedAt":21,"category":22,"categories":28,"featuredImage":30,"bgImage":31,"posterImage":32,"relatedSolution":33,"intro":35,"sections":36,"ctaTitle":128,"ctaBody":129,"ctaButton":130,"ctaUrl":131,"relatedPosts":132},275,"heberger-gotenberg-vps",{"fr":10,"en":12,"ar":13,"es":14},"self-host-gotenberg-on-a-vps-pdf-generation-api-for-developers","استضافة-gotenberg-على-vps-واجهة-توليد-pdf-للمطورين","alojar-gotenberg-en-un-vps","Héberger Gotenberg sur un VPS : API PDF pour développeurs","Déployez Gotenberg 8.x sur votre VPS : API REST self-hosted pour générer des PDF depuis HTML, URL, DOCX et Markdown. Guide complet avec nginx, Laravel, Python, Node.",8,1,false,"2026-01-16T00:00:00+00:00","2026-11-04T16:30:27+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},4,"Développement","developpement","bg-warning\u002F10 text-warning","dev",[29],{"id":23,"name":24,"slug":25,"color":26,"icon":27},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fheberger-gotenberg-vps-poster.svg",{"categorySlug":25,"appSlug":34},"gotenberg","Chaque service PDF SaaS facture à la page ou au document. Gotenberg, non. C'est un microservice HTTP open source sous licence MIT qui génère des PDF depuis HTML, URLs, Markdown et documents LibreOffice, avec Chromium et LibreOffice intégrés dans un seul conteneur Docker. Ce guide couvre le déploiement complet sur un VPS — routes d'API, reverse proxy nginx, exemples d'intégration PHP\u002FPython\u002FNode.js, configuration avancée et dépannage des erreurs courantes.",[37,41,75,85,88,107,110,113,116,119,122,125],{"type":38,"title":39,"body":40},"h2","Pourquoi auto-héberger une API de génération PDF ?","Les services PDF SaaS (Puppeteer Cloud, PDFShift, DocRaptor) facturent par document, par page ou par volume d'appels API. Dès que votre application génère des factures, rapports ou contrats à l'échelle, le coût augmente linéairement avec votre usage. Gotenberg les remplace par un coût VPS mensuel fixe, quel que soit le nombre de PDF générés. Il préserve également la confidentialité de vos documents : rien ne quitte votre infrastructure pendant la conversion.",{"type":42,"title":43,"headers":44,"rows":50},"comparison","Gotenberg, WeasyPrint, Stirling-PDF ou Puppeteer ?",[45,46,47,48,49],"Outil","Formats sources","RAM min","API REST","Licence",[51,57,63,69],[52,53,54,55,56],"Gotenberg 8.x","HTML, URL, DOCX\u002FODT\u002FXLSX, Markdown, images","2 Go (Chromium)","Oui — multipart\u002Fform-data","MIT",[58,59,60,61,62],"WeasyPrint","HTML + CSS (pas JS)","256 Mo","Non — lib Python\u002FCLI","BSD",[64,65,66,67,68],"Stirling-PDF","PDF (édition, OCR, fusion)","512 Mo","Oui — JSON\u002Fmultipart","MIT (AGPLv3 pour Pro)",[70,71,72,73,74],"Puppeteer seul","HTML + URL via headless Chrome","1,5 Go","Non — lib Node.js","Apache 2.0",{"type":76,"title":77,"items":78},"ul","Ce que Gotenberg peut convertir",[79,80,81,82,83,84],"HTML vers PDF via une instance Chromium complète — CSS, polices web, JavaScript et media queries d'impression sont tous honorés.","N'importe quelle URL vers PDF — archivez des vues de tableau de bord, générez des rapports hebdomadaires ou capturez des reçus de paiement.","Documents LibreOffice (DOCX, XLSX, PPTX, ODT, ODS, ODP et 20+ formats) vers PDF sans Microsoft Office.","Markdown vers PDF via la route Chromium avec CSS configurable.","Plusieurs PDF fusionnés en un seul fichier en un appel API.","Images (PNG, JPEG, WebP, TIFF) converties en PDF.",{"type":38,"title":86,"body":87},"Prérequis","Un VPS avec au moins **1 vCPU** et **2 Go de RAM** (Chromium seul consomme 1,2 à 1,5 Go au rendu ; 1 Go de RAM est insuffisant dès qu'une conversion est en cours). Ubuntu 22.04 ou 24.04 avec Docker et Docker Compose v2 installés. Gotenberg écoute sur le **port 3000** par défaut. Aucun domaine n'est nécessaire si vous appelez l'API depuis le même serveur — `http:\u002F\u002F127.0.0.1:3000` suffit. Pour l'exposer à d'autres services, un reverse proxy nginx est recommandé (voir plus bas).",{"type":89,"title":90,"steps":91},"steps","Déployer Gotenberg étape par étape",[92,95,98,101,104],{"title":93,"body":94},"Créer le fichier compose","Connectez-vous en SSH à votre VPS et créez un répertoire :\n```\nmkdir gotenberg && cd gotenberg\n```\nCréez `docker-compose.yml` :\n```yaml\nservices:\n  gotenberg:\n    image: gotenberg\u002Fgotenberg:8\n    restart: unless-stopped\n    ports:\n      - \"127.0.0.1:3000:3000\"\n    command:\n      - gotenberg\n      - --chromium-disable-javascript=false\n      - --api-timeout=30s\n      - --chromium-max-queue-size=10\n```\nLa liaison à `127.0.0.1` empêche l'accès direct depuis Internet. Au 2026, la version stable est **8.x** (8.9.1 et supérieures) — l'image `:8` suit la dernière 8.x.",{"title":96,"body":97},"Démarrer le conteneur","Exécutez `docker compose up -d`. Gotenberg tire l'image (~1,5 Go, inclut Chromium et LibreOffice) et démarre le serveur HTTP. Vérifiez l'endpoint de santé :\n```\ncurl http:\u002F\u002F127.0.0.1:3000\u002Fhealth\n```\nUne réponse `{\"status\":\"up\"}` confirme que le service est prêt.",{"title":99,"body":100},"Générer votre premier PDF depuis HTML","Créez un fichier HTML minimal (`facture.html`) et convertissez-le :\n```\ncurl -s --request POST http:\u002F\u002F127.0.0.1:3000\u002Fforms\u002Fchromium\u002Fconvert\u002Fhtml \\\n  --form 'index.html=@facture.html' \\\n  -o facture.pdf\n```\nLa réponse est le PDF en flux binaire — redirigez-le vers un fichier, un objet réponse ou un upload S3.",{"title":102,"body":103},"Convertir un document Word en PDF","Téléversez un fichier DOCX vers la route LibreOffice :\n```\ncurl -s --request POST http:\u002F\u002F127.0.0.1:3000\u002Fforms\u002Flibreoffice\u002Fconvert \\\n  --form 'files=@contrat.docx' \\\n  -o contrat.pdf\n```\nGotenberg utilise le moteur LibreOffice intégré pour la conversion — aucune licence Microsoft Office requise.",{"title":105,"body":106},"Ajouter une authentification (recommandé)","Gotenberg n'a pas d'authentification intégrée. L'approche recommandée : installez nginx, créez un reverse proxy de `https:\u002F\u002Fgotenberg.votre-domaine.com` vers `http:\u002F\u002F127.0.0.1:3000`, et ajoutez une authentification HTTP basic. Seul le backend de votre application devrait appeler cet endpoint — ne l'exposez jamais sans authentification à Internet public, car il peut être utilisé pour rendre des URLs arbitraires.",{"type":38,"title":108,"body":109},"Routes et formats de l'API","Gotenberg expose deux familles de routes REST, toutes en `POST multipart\u002Fform-data`.\n\n**Routes Chromium** — rendu via un navigateur headless :\n- `POST \u002Fforms\u002Fchromium\u002Fconvert\u002Fhtml` — conversion depuis un fichier HTML local (champ `index.html`) ; les assets CSS\u002FJS\u002Fimages peuvent être joints en champs supplémentaires.\n- `POST \u002Fforms\u002Fchromium\u002Fconvert\u002Furl` — conversion depuis une URL publique (champ `url`) ; Chromium charge la page entière, JavaScript compris.\n- `POST \u002Fforms\u002Fchromium\u002Fconvert\u002Fmarkdown` — conversion Markdown avec feuille de style optionnelle.\n\n**Routes LibreOffice** — conversion de documents bureautiques :\n- `POST \u002Fforms\u002Flibreoffice\u002Fconvert` — accepte DOCX, XLSX, PPTX, ODT, ODS, ODP et 20+ formats ; plusieurs fichiers convertis en un seul PDF si vous envoyez `merge=true`.\n\n**Route PDF** — manipulation de PDF existants :\n- `POST \u002Fforms\u002Fpdfengines\u002Fmerge` — fusionne plusieurs fichiers PDF en un seul.\n- `POST \u002Fforms\u002Fpdfengines\u002Fconvert` — conversion vers PDF\u002FA (archivage long terme).\n\n**Webhook** : au lieu de recevoir le PDF en réponse synchrone, vous pouvez passer un header `Gotenberg-Webhook-Url` — Gotenberg envoie alors le PDF en `POST` vers votre URL dès la conversion terminée, libérant la connexion cliente immédiatement. Utile pour les conversions longues ou les architectures asynchrones.",{"type":38,"title":111,"body":112},"Reverse proxy nginx","Pour exposer Gotenberg à d'autres services ou l'appeler depuis un domaine dédié, ajoutez un bloc `location` dans votre configuration nginx :\n\n```nginx\nserver {\n    listen 443 ssl;\n    server_name gotenberg.votre-domaine.com;\n\n    # TLS via certbot ou votre CA\n    ssl_certificate     \u002Fetc\u002Fletsencrypt\u002Flive\u002Fgotenberg.votre-domaine.com\u002Ffullchain.pem;\n    ssl_certificate_key \u002Fetc\u002Fletsencrypt\u002Flive\u002Fgotenberg.votre-domaine.com\u002Fprivkey.pem;\n\n    location \u002F {\n        proxy_pass         http:\u002F\u002F127.0.0.1:3000;\n        proxy_set_header   Host $host;\n        proxy_set_header   X-Real-IP $remote_addr;\n        proxy_read_timeout 60s;   # laisser le temps à Chromium de rendre\n        client_max_body_size 50M; # pour les gros DOCX\u002FXLSX\n\n        # Authentification HTTP basic\n        auth_basic           \"Gotenberg API\";\n        auth_basic_user_file \u002Fetc\u002Fnginx\u002F.htpasswd;\n    }\n}\n```\n\nSi Gotenberg tourne sur le même serveur que votre application backend, préférez l'appel direct sur `http:\u002F\u002F127.0.0.1:3000` sans passer par nginx — moins de latence et pas besoin d'exposer le service sur un domaine.",{"type":38,"title":114,"body":115},"Intégration avancée : PHP, Python, Node.js","Gotenberg est indépendant du langage — tout client HTTP capable d'envoyer du `multipart\u002Fform-data` fonctionne.\n\n**PHP \u002F Laravel** — utilisez le package officiel `gotenberg-php` :\n```php\nuse Gotenberg\\Gotenberg;\nuse Gotenberg\\Stream;\n\n$request = Gotenberg::chromium('http:\u002F\u002F127.0.0.1:3000')\n    ->pdf()\n    ->html(Stream::path('\u002Fchemin\u002Fvers\u002Ffacture.html'));\n\n$response = $client->sendRequest($request);\nfile_put_contents('facture.pdf', $response->getBody());\n```\n\n**Python** — avec la bibliothèque `gotenberg-client` :\n```python\nfrom gotenberg_client import GotenbergClient\n\nwith GotenbergClient('http:\u002F\u002F127.0.0.1:3000') as client:\n    with client.chromium.html_to_pdf() as route:\n        route.index(Path('facture.html'))\n        response = route.run()\n        Path('facture.pdf').write_bytes(response.content)\n```\n\n**Node.js** — avec `fetch` natif (Node 18+) :\n```js\nconst form = new FormData();\nform.append('index.html', new Blob([htmlContent], { type: 'text\u002Fhtml' }), 'index.html');\n\nconst res = await fetch('http:\u002F\u002F127.0.0.1:3000\u002Fforms\u002Fchromium\u002Fconvert\u002Fhtml', {\n  method: 'POST',\n  body: form,\n});\nconst pdf = Buffer.from(await res.arrayBuffer());\nfs.writeFileSync('facture.pdf', pdf);\n```\n\nPour Node.js, le package `chromiumly` encapsule l'API complète si vous préférez éviter le `FormData` manuel.",{"type":38,"title":117,"body":118},"Configuration avancée","Les paramètres se passent en arguments de la commande `gotenberg` dans votre `docker-compose.yml` (ou via variables d'environnement préfixées `GOTENBERG_`).\n\n**Timeout** : `--api-timeout=30s` — durée maximale d'une conversion. Augmentez-le (ex. `60s`) si vous convertissez de longs documents DOCX ou des pages avec beaucoup de JavaScript.\n\n**Concurrence** : `--chromium-max-queue-size=10` — nombre maximum de conversions Chromium en file. Au-delà, Gotenberg répond `503` plutôt que d'accumuler en mémoire. Ajustez selon votre RAM disponible (chaque conversion Chromium ouvre une instance éphémère).\n\n**Rate limit** : `--api-port-from-env` combiné à un reverse proxy nginx (`limit_req_zone`) constitue la solution recommandée pour limiter les appels entrants.\n\n**Logs** : Gotenberg logue en JSON sur stdout — `docker compose logs gotenberg` vous donne le détail de chaque conversion (durée, route, statut). Pour un log plus verbeux :\n```yaml\ncommand:\n  - gotenberg\n  - --log-level=debug\n```\n\n**Désactiver LibreOffice** (si vous n'avez besoin que de Chromium, économie de RAM) :\n```yaml\ncommand:\n  - gotenberg\n  - --libreoffice-disable-listener=true\n```",{"type":120,"body":121},"tip","Pour les architectures à fort volume, lancez plusieurs répliques Gotenberg derrière un équilibreur de charge nginx (`upstream`) : chaque instance tient ses propres workers Chromium, et vous scalez horizontalement sans partager d'état.",{"type":38,"title":123,"body":124},"Dépannage des erreurs courantes","**Timeout Chromium — `context deadline exceeded`** : la conversion HTML dépasse le timeout configuré. Causes fréquentes : page avec JavaScript lent, ressources externes (CDN, polices Google Fonts) inaccessibles depuis le serveur, ou DOM trop volumineux. Solution : augmentez `--api-timeout`, hébergez vos assets localement et joignez-les en champs du formulaire multipart plutôt que de les charger par URL.\n\n**Port 3000 déjà occupé** : une autre application écoute sur 3000. Modifiez le mapping dans `docker-compose.yml` : `\"127.0.0.1:3001:3000\"` et mettez à jour l'URL dans vos appels.\n\n**Fichier trop grand — `413 Request Entity Too Large`** : nginx coupe la requête avant Gotenberg. Augmentez `client_max_body_size` dans le bloc nginx (ex. `100M` pour les gros XLSX).\n\n**Mémoire insuffisante — `OOMKilled`** : Docker tue le conteneur quand Chromium dépasse la RAM disponible. Vérifiez `docker inspect gotenberg | grep OOMKilled`. Remèdes : ajouter de la RAM au VPS, limiter la concurrence (`--chromium-max-queue-size=3`), ou désactiver JavaScript si votre HTML ne le requiert pas (`--chromium-disable-javascript=true`).\n\n**Erreur LibreOffice — fichier corrompu ou format non reconnu** : certains DOCX générés par des outils tiers ne sont pas conformes au standard OOXML. Vérifiez d'abord que le fichier s'ouvre sans erreur dans LibreOffice Desktop. L'en-tête de log Gotenberg indique le message LibreOffice exact (`docker compose logs gotenberg --tail 50`).",{"type":38,"title":126,"body":127},"Intégrer avec votre application","Gotenberg est indépendant du langage — tout client HTTP fonctionne. Des bibliothèques existent pour PHP (`gotenberg-php`), Node.js (`chromiumly`), Python (`gotenberg-client`), Go et d'autres. Pour Laravel, un package officiel encapsule l'API. En Node.js, vous pouvez l'appeler avec `axios` ou l'API `fetch` native en envoyant un objet `FormData` avec le contenu HTML ou le fichier. Consultez la section « Intégration avancée » ci-dessus pour des exemples de code prêts à l'emploi dans chaque langage.","Déployez Gotenberg en quelques minutes sur un VPS Cloud ServOrbit","Avec un VPS Cloud ServOrbit doté de Docker préconfiguré et de ressources évolutives, vous installez Gotenberg et obtenez une API de génération PDF privée pour tous vos backends sans facturation à la requête.","Lancer mon VPS Cloud","\u002Fapplications\u002Fdeveloppement\u002Fgotenberg",[133,158],{"id":134,"slug":135,"slugs":136,"title":140,"excerpt":141,"readTime":142,"views":143,"isPinned":19,"noindex":19,"publishedAt":144,"updatedAt":145,"category":146,"categories":152,"featuredImage":30,"bgImage":31,"posterImage":154,"relatedSolution":155},178,"self-host-stirling-pdf-vps",{"fr":135,"en":137,"ar":138,"es":139},"self-host-stirling-pdf-on-a-vps-50-pdf-operations-no-cloud","استضافة-stirling-pdf-على-vps-أكثر-من-50-عملية-بلا-سحابة","alojar-stirling-pdf-en-un-vps","Héberger Stirling PDF sur un VPS : 50+ opérations, sans cloud","Auto-hébergez Stirling PDF sur un VPS — l’app PDF n°1 sur GitHub (87 k étoiles, MIT) : fusion, découpe, compression, conversion, OCR et 50+ opérations, sans cloud.",5,0,"2026-07-13T00:00:00+00:00","2026-11-04T16:30:26+00:00",{"id":147,"name":148,"slug":149,"color":150,"icon":151},7,"Self-hosting","self-hosting","bg-indigo-500\u002F10 text-indigo-400","cloud",[153],{"id":147,"name":148,"slug":149,"color":150,"icon":151},"\u002Fblog\u002Fcovers\u002Fself-host-stirling-pdf-vps-poster.svg",{"categorySlug":156,"appSlug":157},"collaboration","stirling-pdf",{"id":159,"slug":160,"slugs":161,"title":165,"excerpt":166,"readTime":167,"views":18,"isPinned":19,"noindex":19,"publishedAt":168,"updatedAt":169,"category":170,"categories":176,"featuredImage":30,"bgImage":31,"posterImage":178,"relatedSolution":179},61,"heberger-appwrite-vps",{"fr":160,"en":162,"ar":163,"es":164},"hosting-appwrite-on-a-vps","استضافة-appwrite-على-خادم-vps","alojar-appwrite-en-un-vps","Héberger Appwrite sur un VPS : guide complet self-hosted","Déployez Appwrite sur votre VPS avec Docker : stack complète, Traefik SSL, sauvegardes, durcissement et comparatif Supabase.",10,"2026-04-20T00:00:00+00:00","2026-09-19T02:00:43+00:00",{"id":171,"name":172,"slug":173,"color":174,"icon":175},6,"Bases de données","bases-de-donnees","bg-teal-500\u002F10 text-teal-400","database",[177],{"id":171,"name":172,"slug":173,"color":174,"icon":175},"\u002Fblog\u002Fcovers\u002Fheberger-appwrite-vps-poster.svg",{"categorySlug":173,"appSlug":180},"appwrite",true,1794270719837]