diff --git a/404.html b/404.html index 0a2991e..86dd205 100644 --- a/404.html +++ b/404.html @@ -10,7 +10,7 @@ - + diff --git a/assets/js/cbb899e4.868eb590.js b/assets/js/cbb899e4.8d12d08f.js similarity index 86% rename from assets/js/cbb899e4.868eb590.js rename to assets/js/cbb899e4.8d12d08f.js index 7b28632..b9a90b4 100644 --- a/assets/js/cbb899e4.868eb590.js +++ b/assets/js/cbb899e4.8d12d08f.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgotenberg_dev=self.webpackChunkgotenberg_dev||[]).push([[196],{9267:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>a,contentTitle:()=>d,default:()=>h,frontMatter:()=>i,metadata:()=>l,toc:()=>c});var r=n(5893),t=n(1151);const i={id:"configuration",title:"Configuration"},d=void 0,l={id:"configuration",title:"Configuration",description:"The Docker image internally employs a binary that offers flags to configure its multiple modules. This guide contains a",source:"@site/docs/configuration.mdx",sourceDirName:".",slug:"/configuration",permalink:"/docs/configuration",draft:!1,unlisted:!1,editUrl:"https://github.com/gotenberg/gotenberg.dev/edit/main/docs/configuration.mdx",tags:[],version:"current",frontMatter:{id:"configuration",title:"Configuration"},sidebar:"version-8.x",previous:{title:"Webhook",permalink:"/docs/webhook"},next:{title:"Troubleshooting",permalink:"/docs/troubleshooting"}},a={},c=[{value:"API",id:"api",level:2},{value:"Chromium",id:"chromium",level:2},{value:"LibreOffice",id:"libreoffice",level:2},{value:"Switch Language",id:"switch-language",level:3},{value:"PDF Engines",id:"pdf-engines",level:2},{value:"Webhook",id:"webhook",level:2},{value:"Prometheus",id:"prometheus",level:2},{value:"Logging",id:"logging",level:2},{value:"Graceful Shutdown",id:"graceful-shutdown",level:2},{value:"Docker Image",id:"docker-image",level:2},{value:"Fonts",id:"fonts",level:3},{value:"Ownership",id:"ownership",level:3}];function o(e){const s={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",hr:"hr",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,t.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(s.p,{children:"The Docker image internally employs a binary that offers flags to configure its multiple modules. This guide contains a\ncomprehensive list of flags that you can use to fine-tune Gotenberg according to your specific requirements."}),"\n",(0,r.jsx)(s.h2,{id:"api",children:"API"}),"\n",(0,r.jsx)(s.p,{children:"The API module is an HTTP/1 and HTTP/2 (with H2C support) server."}),"\n",(0,r.jsx)(s.p,{children:"The following flags allow you to configure the API module:"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Flag"}),(0,r.jsx)(s.th,{children:"Description"}),(0,r.jsx)(s.th,{children:"Default"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--api-port"})}),(0,r.jsx)(s.td,{children:"Set the port on which the API should listen."}),(0,r.jsx)(s.td,{children:"3000"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--api-port-from-env"})}),(0,r.jsx)(s.td,{children:"Set the environment variable with the port on which the API should listen - override the default port."}),(0,r.jsx)(s.td,{children:"None"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--api-bind-ip"})}),(0,r.jsx)(s.td,{children:"Set the IP address the API should bind to for incoming connections."}),(0,r.jsx)(s.td,{children:"0.0.0.0"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--api-tls-cert-file"})}),(0,r.jsx)(s.td,{children:"Path to the TLS/SSL certificate file - for HTTPS support."}),(0,r.jsx)(s.td,{children:"None"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--api-tls-key-file"})}),(0,r.jsx)(s.td,{children:"Path to the TLS/SSL key file - for HTTPS support."}),(0,r.jsx)(s.td,{children:"None"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--api-start-timeout"})}),(0,r.jsx)(s.td,{children:"Set the time limit for the API to start."}),(0,r.jsx)(s.td,{children:"30s"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--api-timeout"})}),(0,r.jsx)(s.td,{children:"Set the time limit for requests."}),(0,r.jsx)(s.td,{children:"30s"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--api-body-limit"})}),(0,r.jsx)(s.td,{children:"Set the body limit for multipart/form-data requests - it accepts values like 5MB, 1GB, etc."}),(0,r.jsx)(s.td,{children:"None"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--api-trace-header"})}),(0,r.jsx)(s.td,{children:"Set the header name to use for identifying requests."}),(0,r.jsx)(s.td,{children:"Gotenberg-Trace"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--api-enable-basic-auth"})}),(0,r.jsx)(s.td,{children:"Enable basic authentication - will look for the GOTENBERG_API_BASIC_AUTH_USERNAME and GOTENBERG_API_BASIC_AUTH_PASSWORD environment variables."}),(0,r.jsx)(s.td,{children:"false"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--api-download-from-allow-list"})}),(0,r.jsx)(s.td,{children:"Set the allowed URLs for the download from feature using a regular expression."}),(0,r.jsx)(s.td,{children:"All"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--api-download-from-deny-list"})}),(0,r.jsx)(s.td,{children:"Set the denied URLs for the download from feature using a regular expression."}),(0,r.jsx)(s.td,{children:"None"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--api-download-from-max-retry"})}),(0,r.jsx)(s.td,{children:"Set the maximum number of retries for the download from feature."}),(0,r.jsx)(s.td,{children:"4"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--api-disable-download-from"})}),(0,r.jsx)(s.td,{children:"Disable the download from feature."}),(0,r.jsx)(s.td,{children:"false"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--api-disable-health-check-logging"})}),(0,r.jsx)(s.td,{children:"Disable health check logging."}),(0,r.jsx)(s.td,{children:"false"})]})]})]}),"\n",(0,r.jsx)(s.h2,{id:"chromium",children:"Chromium"}),"\n",(0,r.jsx)(s.p,{children:"The Chromium module interacts with the Chromium browser to convert HTML documents to PDF."}),"\n",(0,r.jsx)(s.p,{children:"A single Chromium browser manages the conversions in a stateful mode, enabling quicker single conversions.\nHowever, due to a lock mechanism, a Chromium browser cannot execute parallel operations."}),"\n",(0,r.jsx)(s.p,{children:"During periods of heavy load, incoming requests will accumulate in the queue until they are processed, time out, or the\nqueue reaches its maximum capacity. In the latter case, the request will be terminated prematurely."}),"\n",(0,r.jsx)(s.p,{children:"To maintain performance under heavy load, consider increasing the number of Gotenberg instances."}),"\n",(0,r.jsxs)(s.admonition,{type:"caution",children:[(0,r.jsxs)(s.p,{children:["The ",(0,r.jsx)(s.code,{children:"amd64"})," Docker image uses Google Chrome stable, while other architectures use Chromium."]}),(0,r.jsxs)(s.p,{children:["The ",(0,r.jsx)(s.code,{children:"armhf"})," Docker image uses an earlier version of Chromium. See ",(0,r.jsx)(s.a,{href:"https://github.com/gotenberg/gotenberg/issues/709",children:"#709"}),"\nfor more details."]})]}),"\n",(0,r.jsx)(s.p,{children:"The following flags allow you to configure the Chromium module:"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Flag"}),(0,r.jsx)(s.th,{children:"Description"}),(0,r.jsx)(s.th,{children:"Default"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--chromium-restart-after"})}),(0,r.jsx)(s.td,{children:"Number of conversions after which Chromium will automatically restart. Set to 0 to disable this feature."}),(0,r.jsxs)(s.td,{children:["0",(0,r.jsx)("span",{style:{color:"red"},children:"*"})]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--chromium-max-queue-size"})}),(0,r.jsx)(s.td,{children:"Maximum request queue size for Chromium. Set to 0 to disable this feature."}),(0,r.jsx)(s.td,{children:"0"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--chromium-auto-start"})}),(0,r.jsx)(s.td,{children:"Automatically launch Chromium upon initialization if set to true; otherwise, Chromium will start at the time of the first conversion."}),(0,r.jsx)(s.td,{children:"false"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--chromium-start-timeout"})}),(0,r.jsx)(s.td,{children:"Maximum duration to wait for Chromium to start or restart."}),(0,r.jsx)(s.td,{children:"20s"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--chromium-allow-file-access-from-files"})}),(0,r.jsx)(s.td,{children:"Allow file:// URIs to read other file:// URIs."}),(0,r.jsx)(s.td,{children:"false"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--chromium-allow-insecure-localhost"})}),(0,r.jsx)(s.td,{children:"Ignore TLS/SSL errors on localhost."}),(0,r.jsx)(s.td,{children:"false"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--chromium-allow-list"})}),(0,r.jsx)(s.td,{children:"Set the allowed URLs for Chromium using a regular expression."}),(0,r.jsx)(s.td,{children:"All"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--chromium-deny-list"})}),(0,r.jsx)(s.td,{children:"Set the denied URLs for Chromium using a regular expression."}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"^file:(?!//\\/tmp/).*"})})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--chromium-ignore-certificate-errors"})}),(0,r.jsx)(s.td,{children:"Ignore the certificate errors."}),(0,r.jsx)(s.td,{children:"false"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--chromium-disable-web-security"})}),(0,r.jsx)(s.td,{children:"Don't enforce the same-origin policy."}),(0,r.jsx)(s.td,{children:"false"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--chromium-incognito"})}),(0,r.jsx)(s.td,{children:"Start Chromium with incognito mode."}),(0,r.jsx)(s.td,{children:"false"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--chromium-host-resolver-rules"})}),(0,r.jsx)(s.td,{children:"Set custom mappings to the host resolver."}),(0,r.jsx)(s.td,{children:"None"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--chromium-proxy-server"})}),(0,r.jsx)(s.td,{children:"Set the outbound proxy server; this switch only affects HTTP and HTTPS requests."}),(0,r.jsx)(s.td,{children:"None"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--chromium-clear-cache"})}),(0,r.jsx)(s.td,{children:"Clear Chromium cache between each conversion."}),(0,r.jsx)(s.td,{children:"false"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--chromium-clear-cookies"})}),(0,r.jsx)(s.td,{children:"Clear Chromium cookies between each conversion."}),(0,r.jsx)(s.td,{children:"false"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--chromium-disable-javascript"})}),(0,r.jsx)(s.td,{children:"Disable JavaScript."}),(0,r.jsx)(s.td,{children:"false"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--chromium-disable-routes"})}),(0,r.jsx)(s.td,{children:"Disable the routes."}),(0,r.jsx)(s.td,{children:"false"})]})]})]}),"\n",(0,r.jsxs)(s.p,{children:[(0,r.jsx)("span",{style:{color:"red"},children:"*"}),"Restarting Chromium currently results in memory leaks."]}),"\n",(0,r.jsx)(s.h2,{id:"libreoffice",children:"LibreOffice"}),"\n",(0,r.jsxs)(s.p,{children:["The LibreOffice module interacts with ",(0,r.jsx)(s.a,{href:"https://www.libreoffice.org/",children:"LibreOffice"})," to convert numerous documents to PDF,\nthanks to ",(0,r.jsx)(s.a,{href:"https://github.com/unoconv/unoconv",children:"unoconv"}),"."]}),"\n",(0,r.jsx)(s.p,{children:"A single LibreOffice instance manages the conversions in a stateful mode, enabling quicker single conversions.\nHowever, due to a lock mechanism, a LibreOffice instance cannot execute parallel operations."}),"\n",(0,r.jsx)(s.p,{children:"During periods of heavy load, incoming requests will accumulate in the queue until they are processed, time out, or the\nqueue reaches its maximum capacity. In the latter case, the request will be terminated prematurely."}),"\n",(0,r.jsx)(s.p,{children:"To maintain performance under heavy load, consider increasing the number of Gotenberg instances."}),"\n",(0,r.jsx)(s.p,{children:"The following flags allow you to configure the LibreOffice module:"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Flag"}),(0,r.jsx)(s.th,{children:"Description"}),(0,r.jsx)(s.th,{children:"Default"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--libreoffice-restart-after"})}),(0,r.jsx)(s.td,{children:"Number of conversions after which LibreOffice will automatically restart. Set to 0 to disable this feature."}),(0,r.jsx)(s.td,{children:"10"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--libreoffice-max-queue-size"})}),(0,r.jsx)(s.td,{children:"Maximum request queue size for LibreOffice. Set to 0 to disable this feature."}),(0,r.jsx)(s.td,{children:"0"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--libreoffice-auto-start"})}),(0,r.jsx)(s.td,{children:"Automatically launch LibreOffice upon initialization if set to true; otherwise, LibreOffice will start at the time of the first conversion."}),(0,r.jsx)(s.td,{children:"false"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--libreoffice-start-timeout"})}),(0,r.jsx)(s.td,{children:"Maximum duration to wait for LibreOffice to start or restart."}),(0,r.jsx)(s.td,{children:"20s"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--libreoffice-disable-routes"})}),(0,r.jsx)(s.td,{children:"Disable the routes."}),(0,r.jsx)(s.td,{children:"false"})]})]})]}),"\n",(0,r.jsx)(s.h3,{id:"switch-language",children:"Switch Language"}),"\n",(0,r.jsx)(s.p,{children:"By default, LibreOffice uses the English language when it converts documents to PDF. You may override this behavior by\nbuilding your own Docker image."}),"\n",(0,r.jsx)(s.p,{children:"For instance, with the German language:"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-docker",children:"FROM gotenberg/gotenberg:8\n\nUSER root\n\nRUN apt-get update -qq &&\\\n DEBIAN_FRONTEND=noninteractive apt-get install -y -qq --no-install-recommends -t bookworm-backports libreoffice-l10n-de &&\\\n sed -i '/de_DE.UTF-8/s/^# //g' /etc/locale.gen &&\\\n locale-gen &&\\\n # Cleanup.\n # Note: the Debian image does automatically a clean after each install thanks to a hook.\n # Therefore, there is no need for apt-get clean.\n # See https://stackoverflow.com/a/24417119/3248473.\n rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*\n\nENV LANG de_DE.UTF-8\nENV LANGUAGE de_DE:de\nENV LC_ALL de_DE.UTF-8\n\nUSER gotenberg\n"})}),"\n",(0,r.jsx)(s.h2,{id:"pdf-engines",children:"PDF Engines"}),"\n",(0,r.jsx)(s.p,{children:"The PDF Engines module gathers all engines that can manipulate PDF files. It calls each engine until one successfully\nhandles a task. A PDF engine is an external tool that Gotenberg leverages to perform a specific task, such as merging\nPDF files."}),"\n",(0,r.jsx)(s.p,{children:"Currently, Gotenberg supports the following PDF engines:"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Engine"}),(0,r.jsx)(s.th,{children:"Merge"}),(0,r.jsx)(s.th,{children:"Convert into PDF/A & PDF/UA"}),(0,r.jsx)(s.th,{children:"Read/Write metadata"}),(0,r.jsx)(s.th,{children:"Name"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"https://exiftool.org/",children:"ExifTool"})}),(0,r.jsx)(s.td,{children:"\u274c"}),(0,r.jsx)(s.td,{children:"\u274c"}),(0,r.jsx)(s.td,{children:"\u2705"}),(0,r.jsx)(s.td,{children:"exiftool"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"https://gitlab.com/pdftk-java/pdftk",children:"PDFtk"})}),(0,r.jsx)(s.td,{children:"\u2705"}),(0,r.jsx)(s.td,{children:"\u274c"}),(0,r.jsx)(s.td,{children:"\u274c"}),(0,r.jsx)(s.td,{children:"pdtk"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"https://github.com/pdfcpu/pdfcpu",children:"pdfcpu"})}),(0,r.jsx)(s.td,{children:"\u2705"}),(0,r.jsx)(s.td,{children:"\u274c"}),(0,r.jsx)(s.td,{children:"\u274c"}),(0,r.jsx)(s.td,{children:"pdfcpu"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"https://github.com/qpdf/qpdf",children:"QPDF"})}),(0,r.jsx)(s.td,{children:"\u2705"}),(0,r.jsx)(s.td,{children:"\u274c"}),(0,r.jsx)(s.td,{children:"\u274c"}),(0,r.jsx)(s.td,{children:"qpdf"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"https://github.com/unoconv/unoconv",children:"UNO"})}),(0,r.jsx)(s.td,{children:"\u274c"}),(0,r.jsx)(s.td,{children:"\u2705"}),(0,r.jsx)(s.td,{children:"\u274c"}),(0,r.jsx)(s.td,{children:"libreoffice-pdfengine"})]})]})]}),"\n",(0,r.jsx)(s.p,{children:"The following flags allow you to configure the PDF Engines module:"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Flag"}),(0,r.jsx)(s.th,{children:"Description"}),(0,r.jsx)(s.th,{children:"Default"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--pdfengines-engines"})}),(0,r.jsx)(s.td,{children:"Set the PDF engines and their order."}),(0,r.jsx)(s.td,{children:"All"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--pdfengines-disable-routes"})}),(0,r.jsx)(s.td,{children:"Disable the routes."}),(0,r.jsx)(s.td,{children:"false"})]})]})]}),"\n",(0,r.jsx)(s.admonition,{type:"info",children:(0,r.jsxs)(s.p,{children:["For instance, the value ",(0,r.jsx)(s.em,{children:'"pdftk,libreoffice-pdfengine"'})," selects PDFtk as the first engine, and UNO as the second."]})}),"\n",(0,r.jsx)(s.h2,{id:"webhook",children:"Webhook"}),"\n",(0,r.jsxs)(s.p,{children:["The webhook feature enables Gotenberg to upload the output file originating from ",(0,r.jsx)(s.em,{children:"multipart/form-data"})," routes to a\nselected destination."]}),"\n",(0,r.jsx)(s.p,{children:"The following flags allow you to configure the Webhook module:"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Flag"}),(0,r.jsx)(s.th,{children:"Description"}),(0,r.jsx)(s.th,{children:"Default"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--webhook-allow-list"})}),(0,r.jsx)(s.td,{children:"Set the allowed URLs for the webhook feature using a regular expression."}),(0,r.jsx)(s.td,{children:"All"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--webhook-deny-list"})}),(0,r.jsx)(s.td,{children:"Set the denied URLs for the webhook feature using a regular expression."}),(0,r.jsx)(s.td,{children:"None"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--webhook-error-allow-list"})}),(0,r.jsx)(s.td,{children:"Set the allowed URLs in case of an error for the webhook feature using a regular expression."}),(0,r.jsx)(s.td,{children:"All"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--webhook-error-deny-list"})}),(0,r.jsx)(s.td,{children:"Set the denied URLs in case of an error for the webhook feature using a regular expression."}),(0,r.jsx)(s.td,{children:"None"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--webhook-max-retry"})}),(0,r.jsx)(s.td,{children:"Set the maximum number of retries for the webhook feature."}),(0,r.jsx)(s.td,{children:"4"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--webhook-retry-min-wait"})}),(0,r.jsx)(s.td,{children:"Set the minimum duration to wait before trying to call the webhook again."}),(0,r.jsx)(s.td,{children:"1s"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--webhook-retry-max-wait"})}),(0,r.jsx)(s.td,{children:"Set the maximum duration to wait before trying to call the webhook again."}),(0,r.jsx)(s.td,{children:"30s"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--webhook-client-timeout"})}),(0,r.jsx)(s.td,{children:"Set the time limit for requests to the webhook."}),(0,r.jsx)(s.td,{children:"30s"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--webhook-disable"})}),(0,r.jsx)(s.td,{children:"Disable the webhook feature."}),(0,r.jsx)(s.td,{children:"false"})]})]})]}),"\n",(0,r.jsx)(s.h2,{id:"prometheus",children:"Prometheus"}),"\n",(0,r.jsxs)(s.p,{children:["The Prometheus module collects metrics from other modules and exposes an HTTP endpoint that can be scraped by\n",(0,r.jsx)(s.a,{href:"https://prometheus.io/",children:"Prometheus"}),"."]}),"\n",(0,r.jsx)(s.p,{children:"The following flags allow you to configure the Prometheus module:"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Flag"}),(0,r.jsx)(s.th,{children:"Description"}),(0,r.jsx)(s.th,{children:"Default"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--prometheus-collect-interval"})}),(0,r.jsx)(s.td,{children:"Set the interval for collecting modules' metrics."}),(0,r.jsx)(s.td,{children:"1s"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--prometheus-namespace"})}),(0,r.jsx)(s.td,{children:"Set the namespace of modules' metrics."}),(0,r.jsx)(s.td,{children:"gotenberg"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--prometheus-disable-collect"})}),(0,r.jsx)(s.td,{children:"Disable the collect of metrics."}),(0,r.jsx)(s.td,{children:"false"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--prometheus-disable-route-logging"})}),(0,r.jsx)(s.td,{children:"Disable the route logging."}),(0,r.jsx)(s.td,{children:"false"})]})]})]}),"\n",(0,r.jsx)(s.h2,{id:"logging",children:"Logging"}),"\n",(0,r.jsx)(s.p,{children:"Gotenberg employs a logger that generates structured logs. Structured logs are formatted in a standardized,\nmachine-readable way, making them extremely beneficial for centralized log management."}),"\n",(0,r.jsx)(s.p,{children:"The following flags allow you to configure the logger:"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Flag"}),(0,r.jsx)(s.th,{children:"Description"}),(0,r.jsx)(s.th,{children:"Default"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--log-format"})}),(0,r.jsx)(s.td,{children:"Specify the format of logging. Options include auto, json, or text."}),(0,r.jsx)(s.td,{children:"auto"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--log-level"})}),(0,r.jsx)(s.td,{children:"Choose the level of logging detail. Options include error, warn, info, or debug."}),(0,r.jsx)(s.td,{children:"info"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--log-fields-prefix"})}),(0,r.jsx)(s.td,{children:"Prepend a specified prefix to each field in the logs."}),(0,r.jsx)(s.td,{children:"None"})]})]})]}),"\n",(0,r.jsx)(s.h2,{id:"graceful-shutdown",children:"Graceful Shutdown"}),"\n",(0,r.jsx)(s.p,{children:"To ensure running tasks have sufficient time to complete, Gotenberg waits for a specific duration before initiating the\nshutdown process. It may stop earlier if all tasks have completed."}),"\n",(0,r.jsx)(s.p,{children:"The following flag allows you to configure this duration:"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Flag"}),(0,r.jsx)(s.th,{children:"Description"}),(0,r.jsx)(s.th,{children:"Default"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--gotenberg-graceful-shutdown-duration"})}),(0,r.jsx)(s.td,{children:"Set the graceful shutdown duration."}),(0,r.jsx)(s.td,{children:"30s"})]})})]}),"\n",(0,r.jsx)(s.h2,{id:"docker-image",children:"Docker Image"}),"\n",(0,r.jsx)(s.h3,{id:"fonts",children:"Fonts"}),"\n",(0,r.jsx)(s.p,{children:"The default Docker image is pre-packaged with an extensive assortment of fonts, including Asian ones. If your application\nrequires additional or specific fonts not included in this collection, you'll need to construct a tailored Docker image\nto incorporate those fonts."}),"\n",(0,r.jsx)(s.p,{children:(0,r.jsx)(s.strong,{children:"Via .tff files"})}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-docker",children:"FROM gotenberg/gotenberg:8\n\nUSER root\n\nCOPY /local/path/to/{font}.ttf /usr/local/share/fonts/{font}.ttf\n\nUSER gotenberg\n"})}),"\n",(0,r.jsx)(s.p,{children:"Or, if you have many fonts:"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-docker",children:"FROM gotenberg/gotenberg:8\n\nUSER root\n\nCOPY /local/path/to/fonts/* /usr/local/share/fonts/\n\nUSER gotenberg\n"})}),"\n",(0,r.jsx)(s.hr,{}),"\n",(0,r.jsx)(s.p,{children:(0,r.jsx)(s.strong,{children:"Via .deb packages"})}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-docker",children:"FROM gotenberg/gotenberg:8\n\nUSER root\n\nRUN DEBIAN_FRONTEND=noninteractive apt-get install -y -qq --no-install-recommends my-fonts-package\n\nUSER gotenberg\n"})}),"\n",(0,r.jsx)(s.hr,{}),"\n",(0,r.jsx)(s.admonition,{type:"info",children:(0,r.jsxs)(s.p,{children:["You could also mount a volume containing your fonts to ",(0,r.jsx)(s.em,{children:"/usr/local/share/fonts/"})," as suggested in this\n",(0,r.jsx)(s.a,{href:"https://github.com/gotenberg/gotenberg/issues/602#issue-1580360200",children:"comment"}),"."]})}),"\n",(0,r.jsx)(s.h3,{id:"ownership",children:"Ownership"}),"\n",(0,r.jsxs)(s.p,{children:["The Docker image employs a specific non-root user, named ",(0,r.jsx)(s.em,{children:"gotenberg"}),", with a User ID (uid) and Group ID (gid) of ",(0,r.jsx)(s.strong,{children:"1001"}),".\nIf you want to change these identifiers, you will have to build a custom Docker image:"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-docker",children:"FROM gotenberg/gotenberg:8\n\nUSER root\n\nRUN usermod -u {uid} -g {gid} gotenberg\n\nUSER gotenberg\n"})})]})}function h(e={}){const{wrapper:s}={...(0,t.a)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(o,{...e})}):o(e)}},1151:(e,s,n)=>{n.d(s,{Z:()=>l,a:()=>d});var r=n(7294);const t={},i=r.createContext(t);function d(e){const s=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:d(e.components),r.createElement(i.Provider,{value:s},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkgotenberg_dev=self.webpackChunkgotenberg_dev||[]).push([[196],{9267:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>o,contentTitle:()=>d,default:()=>h,frontMatter:()=>i,metadata:()=>l,toc:()=>a});var r=n(5893),t=n(1151);const i={id:"configuration",title:"Configuration"},d=void 0,l={id:"configuration",title:"Configuration",description:"The Docker image internally employs a binary that offers flags to configure its multiple modules. This guide contains a",source:"@site/docs/configuration.mdx",sourceDirName:".",slug:"/configuration",permalink:"/docs/configuration",draft:!1,unlisted:!1,editUrl:"https://github.com/gotenberg/gotenberg.dev/edit/main/docs/configuration.mdx",tags:[],version:"current",frontMatter:{id:"configuration",title:"Configuration"},sidebar:"version-8.x",previous:{title:"Webhook",permalink:"/docs/webhook"},next:{title:"Troubleshooting",permalink:"/docs/troubleshooting"}},o={},a=[{value:"API",id:"api",level:2},{value:"Chromium",id:"chromium",level:2},{value:"LibreOffice",id:"libreoffice",level:2},{value:"Switch Language",id:"switch-language",level:3},{value:"PDF Engines",id:"pdf-engines",level:2},{value:"Webhook",id:"webhook",level:2},{value:"Prometheus",id:"prometheus",level:2},{value:"Logging",id:"logging",level:2},{value:"Graceful Shutdown",id:"graceful-shutdown",level:2},{value:"Docker Image",id:"docker-image",level:2},{value:"Fonts",id:"fonts",level:3},{value:"Ownership",id:"ownership",level:3}];function c(e){const s={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",hr:"hr",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,t.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(s.p,{children:"The Docker image internally employs a binary that offers flags to configure its multiple modules. This guide contains a\ncomprehensive list of flags that you can use to fine-tune Gotenberg according to your specific requirements."}),"\n",(0,r.jsx)(s.h2,{id:"api",children:"API"}),"\n",(0,r.jsx)(s.p,{children:"The API module is an HTTP/1 and HTTP/2 (with H2C support) server."}),"\n",(0,r.jsx)(s.p,{children:"The following flags allow you to configure the API module:"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Flag"}),(0,r.jsx)(s.th,{children:"Description"}),(0,r.jsx)(s.th,{children:"Default"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--api-port"})}),(0,r.jsx)(s.td,{children:"Set the port on which the API should listen."}),(0,r.jsx)(s.td,{children:"3000"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--api-port-from-env"})}),(0,r.jsx)(s.td,{children:"Set the environment variable with the port on which the API should listen - override the default port."}),(0,r.jsx)(s.td,{children:"None"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--api-bind-ip"})}),(0,r.jsx)(s.td,{children:"Set the IP address the API should bind to for incoming connections."}),(0,r.jsx)(s.td,{children:"0.0.0.0"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--api-tls-cert-file"})}),(0,r.jsx)(s.td,{children:"Path to the TLS/SSL certificate file - for HTTPS support."}),(0,r.jsx)(s.td,{children:"None"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--api-tls-key-file"})}),(0,r.jsx)(s.td,{children:"Path to the TLS/SSL key file - for HTTPS support."}),(0,r.jsx)(s.td,{children:"None"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--api-start-timeout"})}),(0,r.jsx)(s.td,{children:"Set the time limit for the API to start."}),(0,r.jsx)(s.td,{children:"30s"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--api-timeout"})}),(0,r.jsx)(s.td,{children:"Set the time limit for requests."}),(0,r.jsx)(s.td,{children:"30s"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--api-body-limit"})}),(0,r.jsx)(s.td,{children:"Set the body limit for multipart/form-data requests - it accepts values like 5MB, 1GB, etc."}),(0,r.jsx)(s.td,{children:"None"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--api-trace-header"})}),(0,r.jsx)(s.td,{children:"Set the header name to use for identifying requests."}),(0,r.jsx)(s.td,{children:"Gotenberg-Trace"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--api-enable-basic-auth"})}),(0,r.jsx)(s.td,{children:"Enable basic authentication - will look for the GOTENBERG_API_BASIC_AUTH_USERNAME and GOTENBERG_API_BASIC_AUTH_PASSWORD environment variables."}),(0,r.jsx)(s.td,{children:"false"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--api-download-from-allow-list"})}),(0,r.jsx)(s.td,{children:"Set the allowed URLs for the download from feature using a regular expression."}),(0,r.jsx)(s.td,{children:"All"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--api-download-from-deny-list"})}),(0,r.jsx)(s.td,{children:"Set the denied URLs for the download from feature using a regular expression."}),(0,r.jsx)(s.td,{children:"None"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--api-download-from-max-retry"})}),(0,r.jsx)(s.td,{children:"Set the maximum number of retries for the download from feature."}),(0,r.jsx)(s.td,{children:"4"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--api-disable-download-from"})}),(0,r.jsx)(s.td,{children:"Disable the download from feature."}),(0,r.jsx)(s.td,{children:"false"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--api-disable-health-check-logging"})}),(0,r.jsx)(s.td,{children:"Disable health check logging."}),(0,r.jsx)(s.td,{children:"false"})]})]})]}),"\n",(0,r.jsx)(s.h2,{id:"chromium",children:"Chromium"}),"\n",(0,r.jsx)(s.p,{children:"The Chromium module interacts with the Chromium browser to convert HTML documents to PDF."}),"\n",(0,r.jsx)(s.p,{children:"A single Chromium browser manages the conversions in a stateful mode, enabling quicker single conversions.\nHowever, due to a lock mechanism, a Chromium browser cannot execute parallel operations."}),"\n",(0,r.jsx)(s.p,{children:"During periods of heavy load, incoming requests will accumulate in the queue until they are processed, time out, or the\nqueue reaches its maximum capacity. In the latter case, the request will be terminated prematurely."}),"\n",(0,r.jsx)(s.p,{children:"To maintain performance under heavy load, consider increasing the number of Gotenberg instances."}),"\n",(0,r.jsxs)(s.admonition,{type:"caution",children:[(0,r.jsxs)(s.p,{children:["The ",(0,r.jsx)(s.code,{children:"amd64"})," Docker image uses Google Chrome stable, while other architectures use Chromium."]}),(0,r.jsxs)(s.p,{children:["The ",(0,r.jsx)(s.code,{children:"armhf"})," Docker image uses an earlier version of Chromium. See ",(0,r.jsx)(s.a,{href:"https://github.com/gotenberg/gotenberg/issues/709",children:"#709"}),"\nfor more details."]})]}),"\n",(0,r.jsx)(s.p,{children:"The following flags allow you to configure the Chromium module:"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Flag"}),(0,r.jsx)(s.th,{children:"Description"}),(0,r.jsx)(s.th,{children:"Default"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--chromium-restart-after"})}),(0,r.jsx)(s.td,{children:"Number of conversions after which Chromium will automatically restart. Set to 0 to disable this feature."}),(0,r.jsxs)(s.td,{children:["0",(0,r.jsx)("span",{style:{color:"red"},children:"*"})]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--chromium-max-queue-size"})}),(0,r.jsx)(s.td,{children:"Maximum request queue size for Chromium. Set to 0 to disable this feature."}),(0,r.jsx)(s.td,{children:"0"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--chromium-auto-start"})}),(0,r.jsx)(s.td,{children:"Automatically launch Chromium upon initialization if set to true; otherwise, Chromium will start at the time of the first conversion."}),(0,r.jsx)(s.td,{children:"false"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--chromium-start-timeout"})}),(0,r.jsx)(s.td,{children:"Maximum duration to wait for Chromium to start or restart."}),(0,r.jsx)(s.td,{children:"20s"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--chromium-allow-file-access-from-files"})}),(0,r.jsx)(s.td,{children:"Allow file:// URIs to read other file:// URIs."}),(0,r.jsx)(s.td,{children:"false"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--chromium-allow-insecure-localhost"})}),(0,r.jsx)(s.td,{children:"Ignore TLS/SSL errors on localhost."}),(0,r.jsx)(s.td,{children:"false"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--chromium-allow-list"})}),(0,r.jsx)(s.td,{children:"Set the allowed URLs for Chromium using a regular expression."}),(0,r.jsx)(s.td,{children:"All"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--chromium-deny-list"})}),(0,r.jsx)(s.td,{children:"Set the denied URLs for Chromium using a regular expression."}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"^file:(?!//\\/tmp/).*"})})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--chromium-ignore-certificate-errors"})}),(0,r.jsx)(s.td,{children:"Ignore the certificate errors."}),(0,r.jsx)(s.td,{children:"false"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--chromium-disable-web-security"})}),(0,r.jsx)(s.td,{children:"Don't enforce the same-origin policy."}),(0,r.jsx)(s.td,{children:"false"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--chromium-incognito"})}),(0,r.jsx)(s.td,{children:"Start Chromium with incognito mode."}),(0,r.jsx)(s.td,{children:"false"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--chromium-host-resolver-rules"})}),(0,r.jsx)(s.td,{children:"Set custom mappings to the host resolver."}),(0,r.jsx)(s.td,{children:"None"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--chromium-proxy-server"})}),(0,r.jsx)(s.td,{children:"Set the outbound proxy server; this switch only affects HTTP and HTTPS requests."}),(0,r.jsx)(s.td,{children:"None"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--chromium-clear-cache"})}),(0,r.jsx)(s.td,{children:"Clear Chromium cache between each conversion."}),(0,r.jsx)(s.td,{children:"false"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--chromium-clear-cookies"})}),(0,r.jsx)(s.td,{children:"Clear Chromium cookies between each conversion."}),(0,r.jsx)(s.td,{children:"false"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--chromium-disable-javascript"})}),(0,r.jsx)(s.td,{children:"Disable JavaScript."}),(0,r.jsx)(s.td,{children:"false"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--chromium-disable-routes"})}),(0,r.jsx)(s.td,{children:"Disable the routes."}),(0,r.jsx)(s.td,{children:"false"})]})]})]}),"\n",(0,r.jsxs)(s.p,{children:[(0,r.jsx)("span",{style:{color:"red"},children:"*"}),"Restarting Chromium currently results in memory leaks."]}),"\n",(0,r.jsx)(s.h2,{id:"libreoffice",children:"LibreOffice"}),"\n",(0,r.jsxs)(s.p,{children:["The LibreOffice module interacts with ",(0,r.jsx)(s.a,{href:"https://www.libreoffice.org/",children:"LibreOffice"})," to convert numerous documents to PDF,\nthanks to ",(0,r.jsx)(s.a,{href:"https://github.com/unoconv/unoconv",children:"unoconv"}),"."]}),"\n",(0,r.jsx)(s.p,{children:"A single LibreOffice instance manages the conversions in a stateful mode, enabling quicker single conversions.\nHowever, due to a lock mechanism, a LibreOffice instance cannot execute parallel operations."}),"\n",(0,r.jsx)(s.p,{children:"During periods of heavy load, incoming requests will accumulate in the queue until they are processed, time out, or the\nqueue reaches its maximum capacity. In the latter case, the request will be terminated prematurely."}),"\n",(0,r.jsx)(s.p,{children:"To maintain performance under heavy load, consider increasing the number of Gotenberg instances."}),"\n",(0,r.jsx)(s.p,{children:"The following flags allow you to configure the LibreOffice module:"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Flag"}),(0,r.jsx)(s.th,{children:"Description"}),(0,r.jsx)(s.th,{children:"Default"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--libreoffice-restart-after"})}),(0,r.jsx)(s.td,{children:"Number of conversions after which LibreOffice will automatically restart. Set to 0 to disable this feature."}),(0,r.jsx)(s.td,{children:"10"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--libreoffice-max-queue-size"})}),(0,r.jsx)(s.td,{children:"Maximum request queue size for LibreOffice. Set to 0 to disable this feature."}),(0,r.jsx)(s.td,{children:"0"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--libreoffice-auto-start"})}),(0,r.jsx)(s.td,{children:"Automatically launch LibreOffice upon initialization if set to true; otherwise, LibreOffice will start at the time of the first conversion."}),(0,r.jsx)(s.td,{children:"false"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--libreoffice-start-timeout"})}),(0,r.jsx)(s.td,{children:"Maximum duration to wait for LibreOffice to start or restart."}),(0,r.jsx)(s.td,{children:"20s"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--libreoffice-disable-routes"})}),(0,r.jsx)(s.td,{children:"Disable the routes."}),(0,r.jsx)(s.td,{children:"false"})]})]})]}),"\n",(0,r.jsx)(s.h3,{id:"switch-language",children:"Switch Language"}),"\n",(0,r.jsx)(s.p,{children:"By default, LibreOffice uses the English language when it converts documents to PDF. You may override this behavior by\nbuilding your own Docker image."}),"\n",(0,r.jsx)(s.p,{children:"For instance, with the German language:"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-docker",children:"FROM gotenberg/gotenberg:8\n\nUSER root\n\nRUN apt-get update -qq &&\\\n DEBIAN_FRONTEND=noninteractive apt-get install -y -qq --no-install-recommends -t bookworm-backports libreoffice-l10n-de &&\\\n sed -i '/de_DE.UTF-8/s/^# //g' /etc/locale.gen &&\\\n locale-gen &&\\\n # Cleanup.\n # Note: the Debian image does automatically a clean after each install thanks to a hook.\n # Therefore, there is no need for apt-get clean.\n # See https://stackoverflow.com/a/24417119/3248473.\n rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*\n\nENV LANG de_DE.UTF-8\nENV LANGUAGE de_DE:de\nENV LC_ALL de_DE.UTF-8\n\nUSER gotenberg\n"})}),"\n",(0,r.jsx)(s.h2,{id:"pdf-engines",children:"PDF Engines"}),"\n",(0,r.jsx)(s.p,{children:"The PDF Engines module gathers all engines that can manipulate PDF files. It calls each engine until one successfully\nhandles a task. A PDF engine is an external tool that Gotenberg leverages to perform a specific task, such as merging\nPDF files."}),"\n",(0,r.jsx)(s.p,{children:"Currently, Gotenberg supports the following PDF engines:"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Engine"}),(0,r.jsx)(s.th,{children:"Merge"}),(0,r.jsx)(s.th,{children:"Convert into PDF/A & PDF/UA"}),(0,r.jsx)(s.th,{children:"Read/Write metadata"}),(0,r.jsx)(s.th,{children:"Name"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"https://exiftool.org/",children:"ExifTool"})}),(0,r.jsx)(s.td,{children:"\u274c"}),(0,r.jsx)(s.td,{children:"\u274c"}),(0,r.jsx)(s.td,{children:"\u2705"}),(0,r.jsx)(s.td,{children:"exiftool"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"https://gitlab.com/pdftk-java/pdftk",children:"PDFtk"})}),(0,r.jsx)(s.td,{children:"\u2705"}),(0,r.jsx)(s.td,{children:"\u274c"}),(0,r.jsx)(s.td,{children:"\u274c"}),(0,r.jsx)(s.td,{children:"pdtk"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"https://github.com/pdfcpu/pdfcpu",children:"pdfcpu"})}),(0,r.jsx)(s.td,{children:"\u2705"}),(0,r.jsx)(s.td,{children:"\u274c"}),(0,r.jsx)(s.td,{children:"\u274c"}),(0,r.jsx)(s.td,{children:"pdfcpu"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"https://github.com/qpdf/qpdf",children:"QPDF"})}),(0,r.jsx)(s.td,{children:"\u2705"}),(0,r.jsx)(s.td,{children:"\u274c"}),(0,r.jsx)(s.td,{children:"\u274c"}),(0,r.jsx)(s.td,{children:"qpdf"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"https://github.com/unoconv/unoconv",children:"UNO"})}),(0,r.jsx)(s.td,{children:"\u274c"}),(0,r.jsx)(s.td,{children:"\u2705"}),(0,r.jsx)(s.td,{children:"\u274c"}),(0,r.jsx)(s.td,{children:"libreoffice-pdfengine"})]})]})]}),"\n",(0,r.jsx)(s.p,{children:"The following flags allow you to configure the PDF Engines module:"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Flag"}),(0,r.jsx)(s.th,{children:"Description"}),(0,r.jsx)(s.th,{children:"Default"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--pdfengines-engines"})}),(0,r.jsx)(s.td,{children:"Set the PDF engines and their order."}),(0,r.jsx)(s.td,{children:"All"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--pdfengines-disable-routes"})}),(0,r.jsx)(s.td,{children:"Disable the routes."}),(0,r.jsx)(s.td,{children:"false"})]})]})]}),"\n",(0,r.jsx)(s.admonition,{type:"info",children:(0,r.jsxs)(s.p,{children:["For instance, the value ",(0,r.jsx)(s.em,{children:'"pdftk,libreoffice-pdfengine"'})," selects PDFtk as the first engine, and UNO as the second."]})}),"\n",(0,r.jsx)(s.h2,{id:"webhook",children:"Webhook"}),"\n",(0,r.jsxs)(s.p,{children:["The webhook feature enables Gotenberg to upload the output file originating from ",(0,r.jsx)(s.em,{children:"multipart/form-data"})," routes to a\nselected destination."]}),"\n",(0,r.jsx)(s.p,{children:"The following flags allow you to configure the Webhook module:"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Flag"}),(0,r.jsx)(s.th,{children:"Description"}),(0,r.jsx)(s.th,{children:"Default"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--webhook-allow-list"})}),(0,r.jsx)(s.td,{children:"Set the allowed URLs for the webhook feature using a regular expression."}),(0,r.jsx)(s.td,{children:"All"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--webhook-deny-list"})}),(0,r.jsx)(s.td,{children:"Set the denied URLs for the webhook feature using a regular expression."}),(0,r.jsx)(s.td,{children:"None"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--webhook-error-allow-list"})}),(0,r.jsx)(s.td,{children:"Set the allowed URLs in case of an error for the webhook feature using a regular expression."}),(0,r.jsx)(s.td,{children:"All"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--webhook-error-deny-list"})}),(0,r.jsx)(s.td,{children:"Set the denied URLs in case of an error for the webhook feature using a regular expression."}),(0,r.jsx)(s.td,{children:"None"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--webhook-max-retry"})}),(0,r.jsx)(s.td,{children:"Set the maximum number of retries for the webhook feature."}),(0,r.jsx)(s.td,{children:"4"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--webhook-retry-min-wait"})}),(0,r.jsx)(s.td,{children:"Set the minimum duration to wait before trying to call the webhook again."}),(0,r.jsx)(s.td,{children:"1s"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--webhook-retry-max-wait"})}),(0,r.jsx)(s.td,{children:"Set the maximum duration to wait before trying to call the webhook again."}),(0,r.jsx)(s.td,{children:"30s"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--webhook-client-timeout"})}),(0,r.jsx)(s.td,{children:"Set the time limit for requests to the webhook."}),(0,r.jsx)(s.td,{children:"30s"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--webhook-disable"})}),(0,r.jsx)(s.td,{children:"Disable the webhook feature."}),(0,r.jsx)(s.td,{children:"false"})]})]})]}),"\n",(0,r.jsx)(s.h2,{id:"prometheus",children:"Prometheus"}),"\n",(0,r.jsxs)(s.p,{children:["The Prometheus module collects metrics from other modules and exposes an HTTP endpoint that can be scraped by\n",(0,r.jsx)(s.a,{href:"https://prometheus.io/",children:"Prometheus"}),"."]}),"\n",(0,r.jsx)(s.p,{children:"The following flags allow you to configure the Prometheus module:"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Flag"}),(0,r.jsx)(s.th,{children:"Description"}),(0,r.jsx)(s.th,{children:"Default"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--prometheus-collect-interval"})}),(0,r.jsx)(s.td,{children:"Set the interval for collecting modules' metrics."}),(0,r.jsx)(s.td,{children:"1s"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--prometheus-namespace"})}),(0,r.jsx)(s.td,{children:"Set the namespace of modules' metrics."}),(0,r.jsx)(s.td,{children:"gotenberg"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--prometheus-disable-collect"})}),(0,r.jsx)(s.td,{children:"Disable the collect of metrics."}),(0,r.jsx)(s.td,{children:"false"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--prometheus-disable-route-logging"})}),(0,r.jsx)(s.td,{children:"Disable the route logging."}),(0,r.jsx)(s.td,{children:"false"})]})]})]}),"\n",(0,r.jsx)(s.h2,{id:"logging",children:"Logging"}),"\n",(0,r.jsx)(s.p,{children:"Gotenberg employs a logger that generates structured logs. Structured logs are formatted in a standardized,\nmachine-readable way, making them extremely beneficial for centralized log management."}),"\n",(0,r.jsx)(s.p,{children:"The following flags allow you to configure the logger:"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Flag"}),(0,r.jsx)(s.th,{children:"Description"}),(0,r.jsx)(s.th,{children:"Default"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--log-format"})}),(0,r.jsx)(s.td,{children:"Specify the format of logging. Options include auto, json, or text."}),(0,r.jsx)(s.td,{children:"auto"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--log-level"})}),(0,r.jsx)(s.td,{children:"Choose the level of logging detail. Options include error, warn, info, or debug."}),(0,r.jsx)(s.td,{children:"info"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--log-fields-prefix"})}),(0,r.jsx)(s.td,{children:"Prepend a specified prefix to each field in the logs."}),(0,r.jsx)(s.td,{children:"None"})]})]})]}),"\n",(0,r.jsx)(s.h2,{id:"graceful-shutdown",children:"Graceful Shutdown"}),"\n",(0,r.jsx)(s.p,{children:"To ensure running tasks have sufficient time to complete, Gotenberg waits for a specific duration before initiating the\nshutdown process."}),"\n",(0,r.jsx)(s.p,{children:"The following flag allows you to configure this duration:"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Flag"}),(0,r.jsx)(s.th,{children:"Description"}),(0,r.jsx)(s.th,{children:"Default"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)("span",{class:"badge badge--secondary",children:"--gotenberg-graceful-shutdown-duration"})}),(0,r.jsx)(s.td,{children:"Set the graceful shutdown duration."}),(0,r.jsx)(s.td,{children:"30s"})]})})]}),"\n",(0,r.jsx)(s.admonition,{type:"info",children:(0,r.jsxs)(s.p,{children:["When using the ",(0,r.jsx)(s.a,{href:"webhook",children:"webhook feature"}),", ensure that this duration is equal to or longer than the API timeout period.\nThis way, you can confirm that all asynchronous processes complete before Gotenberg begins its shutdown sequence."]})}),"\n",(0,r.jsx)(s.h2,{id:"docker-image",children:"Docker Image"}),"\n",(0,r.jsx)(s.h3,{id:"fonts",children:"Fonts"}),"\n",(0,r.jsx)(s.p,{children:"The default Docker image is pre-packaged with an extensive assortment of fonts, including Asian ones. If your application\nrequires additional or specific fonts not included in this collection, you'll need to construct a tailored Docker image\nto incorporate those fonts."}),"\n",(0,r.jsx)(s.p,{children:(0,r.jsx)(s.strong,{children:"Via .tff files"})}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-docker",children:"FROM gotenberg/gotenberg:8\n\nUSER root\n\nCOPY /local/path/to/{font}.ttf /usr/local/share/fonts/{font}.ttf\n\nUSER gotenberg\n"})}),"\n",(0,r.jsx)(s.p,{children:"Or, if you have many fonts:"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-docker",children:"FROM gotenberg/gotenberg:8\n\nUSER root\n\nCOPY /local/path/to/fonts/* /usr/local/share/fonts/\n\nUSER gotenberg\n"})}),"\n",(0,r.jsx)(s.hr,{}),"\n",(0,r.jsx)(s.p,{children:(0,r.jsx)(s.strong,{children:"Via .deb packages"})}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-docker",children:"FROM gotenberg/gotenberg:8\n\nUSER root\n\nRUN DEBIAN_FRONTEND=noninteractive apt-get install -y -qq --no-install-recommends my-fonts-package\n\nUSER gotenberg\n"})}),"\n",(0,r.jsx)(s.hr,{}),"\n",(0,r.jsx)(s.admonition,{type:"info",children:(0,r.jsxs)(s.p,{children:["You could also mount a volume containing your fonts to ",(0,r.jsx)(s.em,{children:"/usr/local/share/fonts/"})," as suggested in this\n",(0,r.jsx)(s.a,{href:"https://github.com/gotenberg/gotenberg/issues/602#issue-1580360200",children:"comment"}),"."]})}),"\n",(0,r.jsx)(s.h3,{id:"ownership",children:"Ownership"}),"\n",(0,r.jsxs)(s.p,{children:["The Docker image employs a specific non-root user, named ",(0,r.jsx)(s.em,{children:"gotenberg"}),", with a User ID (uid) and Group ID (gid) of ",(0,r.jsx)(s.strong,{children:"1001"}),".\nIf you want to change these identifiers, you will have to build a custom Docker image:"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-docker",children:"FROM gotenberg/gotenberg:8\n\nUSER root\n\nRUN usermod -u {uid} -g {gid} gotenberg\n\nUSER gotenberg\n"})})]})}function h(e={}){const{wrapper:s}={...(0,t.a)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},1151:(e,s,n)=>{n.d(s,{Z:()=>l,a:()=>d});var r=n(7294);const t={},i=r.createContext(t);function d(e){const s=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:d(e.components),r.createElement(i.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/runtime~main.8c324f3b.js b/assets/js/runtime~main.b4789dfd.js similarity index 84% rename from assets/js/runtime~main.8c324f3b.js rename to assets/js/runtime~main.b4789dfd.js index 4ef84f8..f48c38e 100644 --- a/assets/js/runtime~main.8c324f3b.js +++ b/assets/js/runtime~main.b4789dfd.js @@ -1 +1 @@ -(()=>{"use strict";var e,a,t,r,c,o={},f={};function n(e){var a=f[e];if(void 0!==a)return a.exports;var t=f[e]={exports:{}};return o[e].call(t.exports,t,t.exports,n),t.exports}n.m=o,e=[],n.O=(a,t,r,c)=>{if(!t){var o=1/0;for(i=0;i=c)&&Object.keys(n.O).every((e=>n.O[e](t[d])))?t.splice(d--,1):(f=!1,c0&&e[i-1][2]>c;i--)e[i]=e[i-1];e[i]=[t,r,c]},n.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return n.d(a,{a:a}),a},t=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,n.t=function(e,r){if(1&r&&(e=this(e)),8&r)return e;if("object"==typeof e&&e){if(4&r&&e.__esModule)return e;if(16&r&&"function"==typeof e.then)return e}var c=Object.create(null);n.r(c);var o={};a=a||[null,t({}),t([]),t(t)];for(var f=2&r&&e;"object"==typeof f&&!~a.indexOf(f);f=t(f))Object.getOwnPropertyNames(f).forEach((a=>o[a]=()=>e[a]));return o.default=()=>e,n.d(c,o),c},n.d=(e,a)=>{for(var t in a)n.o(a,t)&&!n.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:a[t]})},n.f={},n.e=e=>Promise.all(Object.keys(n.f).reduce(((a,t)=>(n.f[t](e,a),a)),[])),n.u=e=>"assets/js/"+({4:"c141421f",17:"91c58979",41:"0f95c1bf",88:"0058b4c6",140:"6d3e4e67",154:"ccc86bce",170:"6b937fca",195:"c4f5d8e4",196:"cbb899e4",198:"9d491c57",211:"92c921f1",299:"bc290bc8",306:"54481e7f",368:"a94703ab",387:"14c75c93",446:"4a30aa99",450:"7c146eec",484:"bf81d381",491:"696b11ca",518:"a7bd4aaa",594:"db48eac5",624:"a76de88e",629:"aba21aa0",661:"5e95c892",681:"0262d15d",723:"b356f5c9",868:"6459b84b",895:"30b7620c",910:"0ec7db4b",918:"17896441",920:"1a4e3797",939:"2f77ce62",967:"ac6d5fda",980:"a7456010"}[e]||e)+"."+{4:"625dd6bd",17:"c4d0b761",41:"382a56cc",88:"809adf2a",140:"f4935090",153:"b6e6f94f",154:"644c9513",170:"911e2d02",195:"5d7b284a",196:"868eb590",198:"84f71447",211:"c863ceac",299:"1b463542",306:"73e6c2b4",336:"138c4996",368:"6f566e4d",387:"a2e30a83",416:"8c1aff5a",446:"841fcb53",450:"b577e6bc",483:"490851fe",484:"2c9ac96d",491:"944ed6bd",518:"8a4b1fe5",594:"46d50748",624:"2e6b638f",629:"de9526ff",661:"6d1298ad",681:"22dfdb59",723:"72669bba",868:"53c771a2",895:"c7d552af",910:"8fbf44ff",918:"5feafbff",920:"e6d43e92",939:"7db70149",945:"bf1e1cc3",967:"834a7f66",980:"0ad4d8c2"}[e]+".js",n.miniCssF=e=>{},n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),n.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),r={},c="gotenberg-dev:",n.l=(e,a,t,o)=>{if(r[e])r[e].push(a);else{var f,d;if(void 0!==t)for(var b=document.getElementsByTagName("script"),i=0;i{f.onerror=f.onload=null,clearTimeout(s);var c=r[e];if(delete r[e],f.parentNode&&f.parentNode.removeChild(f),c&&c.forEach((e=>e(t))),a)return a(t)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:f}),12e4);f.onerror=l.bind(null,f.onerror),f.onload=l.bind(null,f.onload),d&&document.head.appendChild(f)}},n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.p="/",n.gca=function(e){return e={17896441:"918",c141421f:"4","91c58979":"17","0f95c1bf":"41","0058b4c6":"88","6d3e4e67":"140",ccc86bce:"154","6b937fca":"170",c4f5d8e4:"195",cbb899e4:"196","9d491c57":"198","92c921f1":"211",bc290bc8:"299","54481e7f":"306",a94703ab:"368","14c75c93":"387","4a30aa99":"446","7c146eec":"450",bf81d381:"484","696b11ca":"491",a7bd4aaa:"518",db48eac5:"594",a76de88e:"624",aba21aa0:"629","5e95c892":"661","0262d15d":"681",b356f5c9:"723","6459b84b":"868","30b7620c":"895","0ec7db4b":"910","1a4e3797":"920","2f77ce62":"939",ac6d5fda:"967",a7456010:"980"}[e]||e,n.p+n.u(e)},(()=>{var e={303:0,532:0};n.f.j=(a,t)=>{var r=n.o(e,a)?e[a]:void 0;if(0!==r)if(r)t.push(r[2]);else if(/^(303|532)$/.test(a))e[a]=0;else{var c=new Promise(((t,c)=>r=e[a]=[t,c]));t.push(r[2]=c);var o=n.p+n.u(a),f=new Error;n.l(o,(t=>{if(n.o(e,a)&&(0!==(r=e[a])&&(e[a]=void 0),r)){var c=t&&("load"===t.type?"missing":t.type),o=t&&t.target&&t.target.src;f.message="Loading chunk "+a+" failed.\n("+c+": "+o+")",f.name="ChunkLoadError",f.type=c,f.request=o,r[1](f)}}),"chunk-"+a,a)}},n.O.j=a=>0===e[a];var a=(a,t)=>{var r,c,o=t[0],f=t[1],d=t[2],b=0;if(o.some((a=>0!==e[a]))){for(r in f)n.o(f,r)&&(n.m[r]=f[r]);if(d)var i=d(n)}for(a&&a(t);b{"use strict";var e,a,t,r,c,o={},f={};function n(e){var a=f[e];if(void 0!==a)return a.exports;var t=f[e]={exports:{}};return o[e].call(t.exports,t,t.exports,n),t.exports}n.m=o,e=[],n.O=(a,t,r,c)=>{if(!t){var o=1/0;for(i=0;i=c)&&Object.keys(n.O).every((e=>n.O[e](t[b])))?t.splice(b--,1):(f=!1,c0&&e[i-1][2]>c;i--)e[i]=e[i-1];e[i]=[t,r,c]},n.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return n.d(a,{a:a}),a},t=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,n.t=function(e,r){if(1&r&&(e=this(e)),8&r)return e;if("object"==typeof e&&e){if(4&r&&e.__esModule)return e;if(16&r&&"function"==typeof e.then)return e}var c=Object.create(null);n.r(c);var o={};a=a||[null,t({}),t([]),t(t)];for(var f=2&r&&e;"object"==typeof f&&!~a.indexOf(f);f=t(f))Object.getOwnPropertyNames(f).forEach((a=>o[a]=()=>e[a]));return o.default=()=>e,n.d(c,o),c},n.d=(e,a)=>{for(var t in a)n.o(a,t)&&!n.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:a[t]})},n.f={},n.e=e=>Promise.all(Object.keys(n.f).reduce(((a,t)=>(n.f[t](e,a),a)),[])),n.u=e=>"assets/js/"+({4:"c141421f",17:"91c58979",41:"0f95c1bf",88:"0058b4c6",140:"6d3e4e67",154:"ccc86bce",170:"6b937fca",195:"c4f5d8e4",196:"cbb899e4",198:"9d491c57",211:"92c921f1",299:"bc290bc8",306:"54481e7f",368:"a94703ab",387:"14c75c93",446:"4a30aa99",450:"7c146eec",484:"bf81d381",491:"696b11ca",518:"a7bd4aaa",594:"db48eac5",624:"a76de88e",629:"aba21aa0",661:"5e95c892",681:"0262d15d",723:"b356f5c9",868:"6459b84b",895:"30b7620c",910:"0ec7db4b",918:"17896441",920:"1a4e3797",939:"2f77ce62",967:"ac6d5fda",980:"a7456010"}[e]||e)+"."+{4:"625dd6bd",17:"c4d0b761",41:"382a56cc",88:"809adf2a",140:"f4935090",153:"b6e6f94f",154:"644c9513",170:"911e2d02",195:"5d7b284a",196:"8d12d08f",198:"84f71447",211:"c863ceac",299:"1b463542",306:"73e6c2b4",336:"138c4996",368:"6f566e4d",387:"a2e30a83",416:"8c1aff5a",446:"841fcb53",450:"b577e6bc",483:"490851fe",484:"2c9ac96d",491:"944ed6bd",518:"8a4b1fe5",594:"46d50748",624:"2e6b638f",629:"de9526ff",661:"6d1298ad",681:"22dfdb59",723:"72669bba",868:"53c771a2",895:"c7d552af",910:"8fbf44ff",918:"5feafbff",920:"e6d43e92",939:"7db70149",945:"bf1e1cc3",967:"834a7f66",980:"0ad4d8c2"}[e]+".js",n.miniCssF=e=>{},n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),n.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),r={},c="gotenberg-dev:",n.l=(e,a,t,o)=>{if(r[e])r[e].push(a);else{var f,b;if(void 0!==t)for(var d=document.getElementsByTagName("script"),i=0;i{f.onerror=f.onload=null,clearTimeout(s);var c=r[e];if(delete r[e],f.parentNode&&f.parentNode.removeChild(f),c&&c.forEach((e=>e(t))),a)return a(t)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:f}),12e4);f.onerror=l.bind(null,f.onerror),f.onload=l.bind(null,f.onload),b&&document.head.appendChild(f)}},n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.p="/",n.gca=function(e){return e={17896441:"918",c141421f:"4","91c58979":"17","0f95c1bf":"41","0058b4c6":"88","6d3e4e67":"140",ccc86bce:"154","6b937fca":"170",c4f5d8e4:"195",cbb899e4:"196","9d491c57":"198","92c921f1":"211",bc290bc8:"299","54481e7f":"306",a94703ab:"368","14c75c93":"387","4a30aa99":"446","7c146eec":"450",bf81d381:"484","696b11ca":"491",a7bd4aaa:"518",db48eac5:"594",a76de88e:"624",aba21aa0:"629","5e95c892":"661","0262d15d":"681",b356f5c9:"723","6459b84b":"868","30b7620c":"895","0ec7db4b":"910","1a4e3797":"920","2f77ce62":"939",ac6d5fda:"967",a7456010:"980"}[e]||e,n.p+n.u(e)},(()=>{var e={303:0,532:0};n.f.j=(a,t)=>{var r=n.o(e,a)?e[a]:void 0;if(0!==r)if(r)t.push(r[2]);else if(/^(303|532)$/.test(a))e[a]=0;else{var c=new Promise(((t,c)=>r=e[a]=[t,c]));t.push(r[2]=c);var o=n.p+n.u(a),f=new Error;n.l(o,(t=>{if(n.o(e,a)&&(0!==(r=e[a])&&(e[a]=void 0),r)){var c=t&&("load"===t.type?"missing":t.type),o=t&&t.target&&t.target.src;f.message="Loading chunk "+a+" failed.\n("+c+": "+o+")",f.name="ChunkLoadError",f.type=c,f.request=o,r[1](f)}}),"chunk-"+a,a)}},n.O.j=a=>0===e[a];var a=(a,t)=>{var r,c,o=t[0],f=t[1],b=t[2],d=0;if(o.some((a=>0!==e[a]))){for(r in f)n.o(f,r)&&(n.m[r]=f[r]);if(b)var i=b(n)}for(a&&a(t);d