[{"data":1,"prerenderedAt":184},["ShallowReactive",2],{"seo-verification":3,"blog-alojar-gotenberg-en-un-vps-ma-es":6,"promo-bar-likely":183},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-alojar-gotenberg-en-un-vps-ma-es",{"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":36,"sections":37,"ctaTitle":129,"ctaBody":130,"ctaButton":131,"ctaUrl":132,"relatedPosts":133},275,"alojar-gotenberg-en-un-vps",{"fr":12,"en":13,"ar":14,"es":10},"heberger-gotenberg-vps","self-host-gotenberg-on-a-vps-pdf-generation-api-for-developers","استضافة-gotenberg-على-vps-واجهة-توليد-pdf-للمطورين","Alojar Gotenberg en un VPS: API PDF para desarrolladores","Despliegue Gotenberg 8.x en su VPS: API REST autoalojada para generar PDF desde HTML, URL, DOCX y Markdown. Guía completa con nginx, Laravel, Python, Node.js.",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,"Desarrollo","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":34,"appSlug":35},"desarrollo","gotenberg","Todo servicio de PDF en modo SaaS cobra por página o por documento. Gotenberg, no. Es un microservicio HTTP de código abierto con licencia MIT que genera PDF a partir de HTML, URL, Markdown y documentos LibreOffice, con Chromium y LibreOffice integrados en un único contenedor Docker. Esta guía cubre el despliegue completo en un VPS — rutas de API, reverse proxy nginx, ejemplos de integración PHP\u002FPython\u002FNode.js, configuración avanzada y resolución de errores comunes.",[38,42,76,86,89,108,111,114,117,120,123,126],{"type":39,"title":40,"body":41},"h2","¿Por qué autoalojar una API de generación de PDF?","Los servicios de PDF en modo SaaS (Puppeteer Cloud, PDFShift, DocRaptor) cobran por documento, por página o por volumen de llamadas a la API. En cuanto su aplicación genera facturas, informes o contratos a escala, el costo aumenta de forma lineal con su uso. Gotenberg los sustituye por un costo mensual fijo de VPS, sea cual sea el número de PDF generados. También preserva la confidencialidad de sus documentos: nada sale de su infraestructura durante la conversión.",{"type":43,"title":44,"headers":45,"rows":51},"comparison","¿Gotenberg, WeasyPrint, Stirling-PDF o Puppeteer?",[46,47,48,49,50],"Herramienta","Formatos fuente","RAM mínima","API REST","Licencia",[52,58,64,70],[53,54,55,56,57],"Gotenberg 8.x","HTML, URL, DOCX\u002FODT\u002FXLSX, Markdown, imágenes","2 GB (Chromium)","Sí — multipart\u002Fform-data","MIT",[59,60,61,62,63],"WeasyPrint","HTML + CSS (sin JS)","256 MB","No — lib Python\u002FCLI","BSD",[65,66,67,68,69],"Stirling-PDF","PDF (edición, OCR, fusión)","512 MB","Sí — JSON\u002Fmultipart","MIT (AGPLv3 para Pro)",[71,72,73,74,75],"Puppeteer solo","HTML + URL via Chrome headless","1,5 GB","No — lib Node.js","Apache 2.0",{"type":77,"title":78,"items":79},"ul","Lo que Gotenberg puede convertir",[80,81,82,83,84,85],"HTML a PDF mediante una instancia completa de Chromium — se respetan CSS, fuentes web, JavaScript y las media queries de impresión.","Cualquier URL a PDF — archive vistas de paneles de control, genere informes semanales o capture recibos de pago.","Documentos LibreOffice (DOCX, XLSX, PPTX, ODT, ODS, ODP y más de 20 formatos) a PDF sin Microsoft Office.","Markdown a PDF por la ruta Chromium, con CSS configurable.","Varios PDF fusionados en un único archivo con una sola llamada a la API.","Imágenes (PNG, JPEG, WebP, TIFF) convertidas a PDF.",{"type":39,"title":87,"body":88},"Requisitos previos","Un VPS con al menos **1 vCPU** y **2 GB de RAM** (Chromium solo consume entre 1,2 y 1,5 GB durante el renderizado; 1 GB de RAM es insuficiente en cuanto hay una conversión en curso). Ubuntu 22.04 o 24.04 con Docker y Docker Compose v2 instalados. Gotenberg escucha en el **puerto 3000** por defecto. No hace falta ningún dominio si llama a la API desde el mismo servidor — `http:\u002F\u002F127.0.0.1:3000` es suficiente. Para exponerlo a otros servicios se recomienda un reverse proxy nginx (véase más abajo).",{"type":90,"title":91,"steps":92},"steps","Desplegar Gotenberg paso a paso",[93,96,99,102,105],{"title":94,"body":95},"Crear el archivo compose","Conéctese por SSH a su VPS y cree un directorio:\n```\nmkdir gotenberg && cd gotenberg\n```\nCree `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 vinculación a `127.0.0.1` impide el acceso directo desde Internet. En 2026 la versión estable es **8.x** (8.9.1 y superiores) — la imagen `:8` sigue la última 8.x.",{"title":97,"body":98},"Arrancar el contenedor","Ejecute `docker compose up -d`. Gotenberg descarga la imagen (~1,5 GB, incluye Chromium y LibreOffice) e inicia el servidor HTTP. Compruebe el endpoint de salud:\n```\ncurl http:\u002F\u002F127.0.0.1:3000\u002Fhealth\n```\nUna respuesta `{\"status\":\"up\"}` confirma que el servicio está listo.",{"title":100,"body":101},"Generar su primer PDF a partir de HTML","Cree un archivo HTML mínimo (`factura.html`) y conviértalo:\n```\ncurl -s --request POST http:\u002F\u002F127.0.0.1:3000\u002Fforms\u002Fchromium\u002Fconvert\u002Fhtml \\\n  --form 'index.html=@factura.html' \\\n  -o factura.pdf\n```\nLa respuesta es el PDF en flujo binario — rediríjalo a un archivo, a un objeto de respuesta o a una subida a S3.",{"title":103,"body":104},"Convertir un documento Word a PDF","Suba un archivo DOCX a la ruta 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 utiliza el motor LibreOffice integrado para la conversión — no se requiere ninguna licencia de Microsoft Office.",{"title":106,"body":107},"Añadir una autenticación (recomendado)","Gotenberg no trae autenticación integrada. El enfoque recomendado: instale nginx, cree un reverse proxy de `https:\u002F\u002Fgotenberg.su-dominio.com` hacia `http:\u002F\u002F127.0.0.1:3000` y añada una autenticación HTTP basic. No lo exponga nunca sin autenticación a la Internet pública, ya que puede utilizarse para renderizar URL arbitrarias.",{"type":39,"title":109,"body":110},"Rutas y formatos de la API","Gotenberg expone dos familias de rutas REST, todas en `POST multipart\u002Fform-data`.\n\n**Rutas Chromium** — renderizado mediante navegador headless:\n- `POST \u002Fforms\u002Fchromium\u002Fconvert\u002Fhtml` — conversión desde un archivo HTML local (campo `index.html`).\n- `POST \u002Fforms\u002Fchromium\u002Fconvert\u002Furl` — conversión desde una URL pública (campo `url`); Chromium carga la página completa, JavaScript incluido.\n- `POST \u002Fforms\u002Fchromium\u002Fconvert\u002Fmarkdown` — conversión Markdown con hoja de estilos opcional.\n\n**Rutas LibreOffice** — conversión de documentos ofimáticos:\n- `POST \u002Fforms\u002Flibreoffice\u002Fconvert` — acepta DOCX, XLSX, PPTX, ODT, ODS, ODP y más de 20 formatos; varios archivos fusionados en un único PDF si envía `merge=true`.\n\n**Rutas PDF** — manipulación de PDF existentes:\n- `POST \u002Fforms\u002Fpdfengines\u002Fmerge` — fusiona varios archivos PDF en uno.\n- `POST \u002Fforms\u002Fpdfengines\u002Fconvert` — convierte a PDF\u002FA (archivo a largo plazo).\n\n**Webhook**: en lugar de recibir el PDF como respuesta síncrona, pase una cabecera `Gotenberg-Webhook-Url` — Gotenberg enviará entonces el PDF mediante `POST` a su URL en cuanto finalice la conversión.",{"type":39,"title":112,"body":113},"Reverse proxy nginx","Para exponer Gotenberg a otros servicios o llamarlo desde un dominio dedicado, añada un bloque `location` en su configuración nginx:\n\n```nginx\nserver {\n    listen 443 ssl;\n    server_name gotenberg.su-dominio.com;\n\n    ssl_certificate     \u002Fetc\u002Fletsencrypt\u002Flive\u002Fgotenberg.su-dominio.com\u002Ffullchain.pem;\n    ssl_certificate_key \u002Fetc\u002Fletsencrypt\u002Flive\u002Fgotenberg.su-dominio.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;\n        client_max_body_size 50M;\n\n        auth_basic           \"Gotenberg API\";\n        auth_basic_user_file \u002Fetc\u002Fnginx\u002F.htpasswd;\n    }\n}\n```\n\nSi Gotenberg corre en el mismo servidor que su backend, prefiera la llamada directa a `http:\u002F\u002F127.0.0.1:3000` — menor latencia y no es necesario exponer el servicio en un dominio.",{"type":39,"title":115,"body":116},"Integración avanzada: PHP, Python, Node.js","Gotenberg es independiente del lenguaje — cualquier cliente HTTP capaz de enviar `multipart\u002Fform-data` funciona.\n\n**PHP \u002F Laravel** — use el paquete oficial `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('\u002Fruta\u002Fa\u002Ffactura.html'));\n\n$response = $client->sendRequest($request);\nfile_put_contents('factura.pdf', $response->getBody());\n```\n\n**Python** — con la librería `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('factura.html'))\n        response = route.run()\n        Path('factura.pdf').write_bytes(response.content)\n```\n\n**Node.js** — con `fetch` nativo (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('factura.pdf', pdf);\n```\n\nPara Node.js, el paquete `chromiumly` envuelve la API completa si prefiere evitar el `FormData` manual.",{"type":39,"title":118,"body":119},"Configuración avanzada","Los parámetros se pasan como argumentos al comando `gotenberg` en su `docker-compose.yml` (o mediante variables de entorno con el prefijo `GOTENBERG_`).\n\n**Tiempo límite**: `--api-timeout=30s` — duración máxima de una conversión. Auméntelo (p. ej. `60s`) para documentos DOCX largos o páginas con JavaScript pesado.\n\n**Concurrencia**: `--chromium-max-queue-size=10` — número máximo de conversiones Chromium en cola. Superado este límite, Gotenberg responde `503` en lugar de acumular en memoria.\n\n**Logs**: Gotenberg registra en JSON en stdout — `docker compose logs gotenberg` le da el detalle de cada conversión.\n\n**Deshabilitar LibreOffice** (si solo necesita Chromium, ahorra RAM):\n```yaml\ncommand:\n  - gotenberg\n  - --libreoffice-disable-listener=true\n```",{"type":121,"body":122},"tip","Para arquitecturas de alto volumen, lance varias réplicas de Gotenberg detrás de un balanceador de carga nginx (`upstream`): cada instancia mantiene sus propios workers de Chromium y escala horizontalmente sin estado compartido.",{"type":39,"title":124,"body":125},"Resolución de errores comunes","**Timeout de Chromium — `context deadline exceeded`**: la conversión HTML supera el timeout configurado. Causas frecuentes: JavaScript lento, recursos externos (CDN, Google Fonts) inaccesibles desde el servidor, o DOM demasiado grande. Solución: aumente `--api-timeout`, aloje sus assets localmente y adjúntelos como campos multipart.\n\n**Puerto 3000 ya en uso**: otra aplicación escucha en 3000. Cambie el mapeo en `docker-compose.yml`: `\"127.0.0.1:3001:3000\"` y actualice la URL en sus llamadas.\n\n**Archivo demasiado grande — `413 Request Entity Too Large`**: nginx corta la petición antes de llegar a Gotenberg. Aumente `client_max_body_size` en el bloque nginx (p. ej. `100M` para archivos XLSX grandes).\n\n**Sin memoria — `OOMKilled`**: Docker mata el contenedor cuando Chromium supera la RAM disponible. Verifique con `docker inspect gotenberg | grep OOMKilled`. Remedios: añada RAM al VPS, limite la concurrencia (`--chromium-max-queue-size=3`), o deshabilite JavaScript si su HTML no lo requiere (`--chromium-disable-javascript=true`).\n\n**Error de LibreOffice — archivo corrupto o formato no reconocido**: algunos DOCX generados por herramientas de terceros no son conformes con el estándar OOXML. Verifique primero que el archivo se abre sin errores en LibreOffice Desktop. La cabecera del log de Gotenberg indica el mensaje exacto de LibreOffice (`docker compose logs gotenberg --tail 50`).",{"type":39,"title":127,"body":128},"Integrarlo con su aplicación","Gotenberg es independiente del lenguaje: cualquier cliente HTTP funciona. Existen bibliotecas para PHP (`gotenberg-php`), Node.js (`chromiumly`), Python (`gotenberg-client`), Go y otros. Para Laravel, un paquete oficial encapsula la API. En Node.js, puede llamarla con `axios` o con la API `fetch` nativa enviando un objeto `FormData` con el contenido HTML o el archivo. Consulte la sección de integración avanzada de más arriba para ejemplos de código listos para usar en cada lenguaje.","Despliegue Gotenberg en minutos en un VPS Cloud ServOrbit","Con un VPS Cloud ServOrbit que incluye Docker preconfigurado y recursos escalables, instala Gotenberg y obtiene una API de generación de PDF privada para todos sus backends, sin cobro por petición.","Lanzar mi VPS Cloud","\u002Fapplications\u002Fdesarrollo\u002Fgotenberg",[134,159],{"id":135,"slug":136,"slugs":137,"title":141,"excerpt":142,"readTime":143,"views":144,"isPinned":19,"noindex":19,"publishedAt":145,"updatedAt":146,"category":147,"categories":153,"featuredImage":30,"bgImage":31,"posterImage":155,"relatedSolution":156},178,"alojar-stirling-pdf-en-un-vps",{"fr":138,"en":139,"ar":140,"es":136},"self-host-stirling-pdf-vps","self-host-stirling-pdf-on-a-vps-50-pdf-operations-no-cloud","استضافة-stirling-pdf-على-vps-أكثر-من-50-عملية-بلا-سحابة","Alojar Stirling PDF en un VPS: 50+ operaciones, sin nube","Autoaloje Stirling PDF en un VPS: la app PDF n.º 1 en GitHub (87 k estrellas, MIT). Fusión, división, compresión, conversión, OCR y 50+ operaciones, sin nube.",5,0,"2026-07-13T00:00:00+00:00","2026-11-04T16:30:26+00:00",{"id":148,"name":149,"slug":150,"color":151,"icon":152},7,"Autoalojamiento","self-hosting","bg-indigo-500\u002F10 text-indigo-400","cloud",[154],{"id":148,"name":149,"slug":150,"color":151,"icon":152},"\u002Fblog\u002Fcovers\u002Fself-host-stirling-pdf-vps-poster.svg",{"categorySlug":157,"appSlug":158},"colaboracion-productividad","stirling-pdf",{"id":160,"slug":161,"slugs":162,"title":166,"excerpt":167,"readTime":168,"views":18,"isPinned":19,"noindex":19,"publishedAt":169,"updatedAt":170,"category":171,"categories":177,"featuredImage":30,"bgImage":31,"posterImage":179,"relatedSolution":180},61,"alojar-appwrite-en-un-vps",{"fr":163,"en":164,"ar":165,"es":161},"heberger-appwrite-vps","hosting-appwrite-on-a-vps","استضافة-appwrite-على-خادم-vps","Alojar Appwrite en un VPS: guía completa self-hosted","Despliega Appwrite en tu VPS con Docker: stack completa, Traefik SSL, copias de seguridad, hardening y comparativa con Supabase.",10,"2026-04-20T00:00:00+00:00","2026-09-19T02:00:43+00:00",{"id":172,"name":173,"slug":174,"color":175,"icon":176},6,"Bases de datos","bases-de-donnees","bg-teal-500\u002F10 text-teal-400","database",[178],{"id":172,"name":173,"slug":174,"color":175,"icon":176},"\u002Fblog\u002Fcovers\u002Fheberger-appwrite-vps-poster.svg",{"categorySlug":181,"appSlug":182},"bases-de-datos","appwrite",true,1794270525520]