[PR #11] [MERGED] Fix OOM issues for PDF generation and increase Kubernetes resource limits #43

Closed
opened 2026-06-08 09:15:48 +00:00 by ryangr0 · 0 comments
Owner

📋 Pull Request Information

Original PR: https://github.com/webgrip/invoiceninja-application/pull/11
Author: @Copilot
Created: 9/6/2025
Status: Merged
Merged: 9/6/2025
Merged by: @Ryangr0

Base: mainHead: copilot/fix-10


📝 Commits (5)

  • 3235a69 Initial plan
  • 5263669 Fix OOM issues for PDF generation and add resource limits
  • 3552555 Add comprehensive documentation for PDF memory fix
  • c173fb7 Set opcache.enable_cli=0 and remove test script per review feedback
  • 2e237a8 Merge branch 'main' into copilot/fix-10

📊 Changes

5 files changed (+104 additions, -5 deletions)

View changed files

docs/pdf-memory-fix.md (+66 -0)
📝 ops/docker/application/Dockerfile (+3 -0)
ops/docker/application/php.ini (+30 -0)
📝 ops/docker/nginx/config/default.conf (+3 -3)
📝 ops/helm/invoiceninja-application/values.yaml (+2 -2)

📄 Description

This PR resolves Out of Memory (OOM) issues that were occurring during PDF generation in the Invoice Ninja application running on Kubernetes.

Problem

The application was experiencing pod crashes when generating PDFs due to insufficient memory allocation. The base Invoice Ninja image had a PHP memory limit of only 128M, while the Kubernetes container was limited to 512Mi, both inadequate for complex PDF generation operations.

Root Cause Analysis

  • PHP Memory Limit: Base image configured with memory_limit = 128M
  • Upload Constraints: Small file upload limits (8M) preventing large document processing
  • Resource Allocation: Kubernetes memory limits too restrictive for PDF operations
  • Request Timeouts: Short processing timeouts causing failures on complex invoices

Solution

PHP Configuration Optimizations (ops/docker/application/php.ini)

  • Increased memory_limit from 128M to 512M for PDF processing
  • Raised upload limits to 50M for both upload_max_filesize and post_max_size
  • Extended max_execution_time to 300 seconds for complex operations
  • Optimized OPcache settings for better performance
  • Updated: Set opcache.enable_cli = 0 per review feedback

Kubernetes Resource Adjustments (values.yaml)

  • Memory request: 256Mi → 512Mi (guaranteed memory)
  • Memory limit: 512Mi → 1Gi (maximum allowed memory)
  • CPU limit: 500m → 1000m (full CPU core for PDF processing)

Nginx Configuration Updates

  • Increased client_max_body_size from 20M to 50M
  • Extended fastcgi_read_timeout from 300s to 600s

Testing

Created comprehensive integration tests that verify:
- PHP memory configuration properly applied (512M)
- Upload limits correctly set (50M)
- Memory allocation functionality (100MB test allocation)
- Configuration load order and precedence

Updated: Removed test bash script per review feedback

Expected Impact

  • Eliminates OOM errors during PDF generation
  • Supports larger invoices with many line items or complex layouts
  • Handles file attachments up to 50M
  • Improves overall application stability and performance

Fixes #10.


Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.


🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.

## 📋 Pull Request Information **Original PR:** https://github.com/webgrip/invoiceninja-application/pull/11 **Author:** [@Copilot](https://github.com/apps/copilot-swe-agent) **Created:** 9/6/2025 **Status:** ✅ Merged **Merged:** 9/6/2025 **Merged by:** [@Ryangr0](https://github.com/Ryangr0) **Base:** `main` ← **Head:** `copilot/fix-10` --- ### 📝 Commits (5) - [`3235a69`](https://github.com/webgrip/invoiceninja-application/commit/3235a692b0f5c48a3191e0064066734a6c541f8f) Initial plan - [`5263669`](https://github.com/webgrip/invoiceninja-application/commit/5263669938d33d16c6ba8afc3bce604d07944a62) Fix OOM issues for PDF generation and add resource limits - [`3552555`](https://github.com/webgrip/invoiceninja-application/commit/35525558a39368e9fc6200fc061e9af3f3e60746) Add comprehensive documentation for PDF memory fix - [`c173fb7`](https://github.com/webgrip/invoiceninja-application/commit/c173fb7512ef05305c5d38f5d40627064b5db2f8) Set opcache.enable_cli=0 and remove test script per review feedback - [`2e237a8`](https://github.com/webgrip/invoiceninja-application/commit/2e237a8dd712146cf9e2a91e8bf6c05331bcd1a2) Merge branch 'main' into copilot/fix-10 ### 📊 Changes **5 files changed** (+104 additions, -5 deletions) <details> <summary>View changed files</summary> ➕ `docs/pdf-memory-fix.md` (+66 -0) 📝 `ops/docker/application/Dockerfile` (+3 -0) ➕ `ops/docker/application/php.ini` (+30 -0) 📝 `ops/docker/nginx/config/default.conf` (+3 -3) 📝 `ops/helm/invoiceninja-application/values.yaml` (+2 -2) </details> ### 📄 Description This PR resolves Out of Memory (OOM) issues that were occurring during PDF generation in the Invoice Ninja application running on Kubernetes. ## Problem The application was experiencing pod crashes when generating PDFs due to insufficient memory allocation. The base Invoice Ninja image had a PHP memory limit of only 128M, while the Kubernetes container was limited to 512Mi, both inadequate for complex PDF generation operations. ## Root Cause Analysis - **PHP Memory Limit**: Base image configured with `memory_limit = 128M` - **Upload Constraints**: Small file upload limits (8M) preventing large document processing - **Resource Allocation**: Kubernetes memory limits too restrictive for PDF operations - **Request Timeouts**: Short processing timeouts causing failures on complex invoices ## Solution ### PHP Configuration Optimizations (`ops/docker/application/php.ini`) - Increased `memory_limit` from 128M to **512M** for PDF processing - Raised upload limits to **50M** for both `upload_max_filesize` and `post_max_size` - Extended `max_execution_time` to 300 seconds for complex operations - Optimized OPcache settings for better performance - **Updated**: Set `opcache.enable_cli = 0` per review feedback ### Kubernetes Resource Adjustments (`values.yaml`) - **Memory request**: 256Mi → **512Mi** (guaranteed memory) - **Memory limit**: 512Mi → **1Gi** (maximum allowed memory) - **CPU limit**: 500m → **1000m** (full CPU core for PDF processing) ### Nginx Configuration Updates - Increased `client_max_body_size` from 20M to **50M** - Extended `fastcgi_read_timeout` from 300s to **600s** ## Testing ~~Created comprehensive integration tests that verify:~~ ~~- PHP memory configuration properly applied (512M)~~ ~~- Upload limits correctly set (50M)~~ ~~- Memory allocation functionality (100MB test allocation)~~ ~~- Configuration load order and precedence~~ **Updated**: Removed test bash script per review feedback ## Expected Impact - ✅ Eliminates OOM errors during PDF generation - ✅ Supports larger invoices with many line items or complex layouts - ✅ Handles file attachments up to 50M - ✅ Improves overall application stability and performance Fixes #10. <!-- START COPILOT CODING AGENT TIPS --> --- ✨ Let Copilot coding agent [set things up for you](https://github.com/webgrip/invoiceninja-application/issues/new?title=✨+Set+up+Copilot+instructions&body=Configure%20instructions%20for%20this%20repository%20as%20documented%20in%20%5BBest%20practices%20for%20Copilot%20coding%20agent%20in%20your%20repository%5D%28https://gh.io/copilot-coding-agent-tips%29%2E%0A%0A%3COnboard%20this%20repo%3E&assignees=copilot) — coding agent works faster and does higher quality work when set up for your repo. --- <sub>🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.</sub>
ryangr0 2026-06-08 09:15:48 +00:00
Sign in to join this conversation.
No labels
pull-request
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
webgrip/invoiceninja-application#43
No description provided.