55 Commits

Author SHA1 Message Date
2e7be7edbe feat: remove push render
All checks were successful
renovate / renovate (push) Successful in 2m6s
2026-03-15 16:42:36 -05:00
383f29e421 feat: use vars
All checks were successful
renovate / renovate (push) Successful in 3m8s
2026-03-15 16:27:31 -05:00
b43cdeba18 feat: use PR instead of date
All checks were successful
renovate / renovate (push) Successful in 1m48s
2026-03-15 16:16:30 -05:00
bde7552ae1 feat: more specific condition for push event 2026-03-15 16:16:30 -05:00
3830d32c67 chore(deps): update freikin/dawarich docker tag to v1.3.4 (#4767)
All checks were successful
lint-test-helm / lint-helm (push) Successful in 29s
lint-test-helm / validate-kubeconform (push) Has been skipped
render-manifests / render-manifests (push) Successful in 33s
renovate / renovate (push) Successful in 2m44s
This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [freikin/dawarich](https://github.com/Freika/dawarich) | patch | `1.3.3` → `1.3.4` |

---

### Release Notes

<details>
<summary>Freika/dawarich (freikin/dawarich)</summary>

### [`v1.3.4`](https://github.com/Freika/dawarich/blob/HEAD/CHANGELOG.md#134---2026-03-15)

[Compare Source](https://github.com/Freika/dawarich/compare/1.3.3...1.3.4)

##### Changed

- Redesigned onboarding modal with two paths: "I have data" (inline file import) and "Start tracking" (app download + QR code). New users with existing location data can now start importing within 2 clicks of signing up.
- Onboarding completion is now persisted server-side (`settings.onboarding_completed`) instead of relying solely on localStorage, preventing the modal from reappearing after browser data clears.
- Route opacity data migration now runs as a background job instead of inline during migration, improving deployment reliability for large instances.

##### Fixed

- Fix admin and supporter tooltip overflowing the page on narrow screens. [#&#8203;1449](https://github.com/Freika/dawarich/issues/1449)
- Fix date navigation arrow tooltips overlapping with the navbar on map pages. [#&#8203;2229](https://github.com/Freika/dawarich/issues/2229) [#&#8203;2100](https://github.com/Freika/dawarich/issues/2100)
- Fix infinite loading spinner when a trip has no points in its date range. [#&#8203;2293](https://github.com/Freika/dawarich/issues/2293)
- Fix Insights monthly digest panels disappearing when switching months. [#&#8203;2305](https://github.com/Freika/dawarich/issues/2305)
- Fix suggested visit confirm/decline not removing the visit from the list. [#&#8203;2307](https://github.com/Freika/dawarich/issues/2307)
- Fix Stats page reloading when clicking "countries, cities" link. [#&#8203;2270](https://github.com/Freika/dawarich/issues/2270)
- Fix map base layer selection not being restored after page reload (Maps v1). [#&#8203;2093](https://github.com/Freika/dawarich/issues/2093)
- Fix duplicate country names in stats caused by geocoder returning different spellings. [#&#8203;2044](https://github.com/Freika/dawarich/issues/2044)
- Fix total distance display overlapping layer picker when distance is in miles. [#&#8203;2017](https://github.com/Freika/dawarich/issues/2017)
- Fix default route opacity displaying as 6000% for new users. [#&#8203;1891](https://github.com/Freika/dawarich/issues/1891)
- Fix shared month stats map missing hexagons from the last day of the month. [#&#8203;1934](https://github.com/Freika/dawarich/issues/1934)
- Fix Nominatim reverse geocoder producing all places named "Suggested place" instead of actual place names. [#&#8203;2182](https://github.com/Freika/dawarich/issues/2182)
- Fix IDL-crossing route segmenter returning inconsistent coordinate types. `unwrapCoordinates` now always returns a uniform array-of-arrays structure. [#&#8203;2038](https://github.com/Freika/dawarich/issues/2038)
- Fix a migration taking too long. [#&#8203;2375](https://github.com/Freika/dawarich/issues/2375)
- Fix family sharing not including the requesting user's own location. [#&#8203;2153](https://github.com/Freika/dawarich/issues/2153)
- The "Destroy" button on the trip page is now orange. [#&#8203;2348](https://github.com/Freika/dawarich/issues/2348)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My41OS4yIiwidXBkYXRlZEluVmVyIjoiNDMuNTkuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiYXV0b21lcmdlIiwiaW1hZ2UiXX0=-->

Reviewed-on: https://gitea.alexlebens.dev/alexlebens/infrastructure/pulls/4767
Co-authored-by: Renovate Bot <renovate-bot@alexlebens.net>
Co-committed-by: Renovate Bot <renovate-bot@alexlebens.net>
2026-03-15 21:06:09 +00:00
92892732d0 chore(deps): update dependency freika/dawarich to v1.3.4 (#4766)
All checks were successful
render-manifests / render-manifests (push) Has been skipped
lint-test-helm / lint-helm (push) Successful in 17s
lint-test-helm / validate-kubeconform (push) Has been skipped
renovate / renovate (push) Successful in 1m33s
2026-03-15 20:49:21 +00:00
d71b0597cc chore(deps): update dependency binwiederhier/ntfy to v2.19.0 (#4755)
Some checks failed
lint-test-helm / lint-helm (push) Successful in 11s
lint-test-helm / validate-kubeconform (push) Has been skipped
render-manifests / render-manifests (push) Successful in 33s
renovate / renovate (push) Has been cancelled
This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [binwiederhier/ntfy](https://github.com/binwiederhier/ntfy) | minor | `2.18.0` → `2.19.0` |
| [binwiederhier/ntfy](https://ntfy.sh/) ([source](https://github.com/binwiederhier/ntfy)) | minor | `v2.18.0` → `v2.19.0` |

---

### Release Notes

<details>
<summary>binwiederhier/ntfy (binwiederhier/ntfy)</summary>

### [`v2.19.0`](https://github.com/binwiederhier/ntfy/releases/tag/v2.19.0)

[Compare Source](https://github.com/binwiederhier/ntfy/compare/v2.18.0...v2.19.0)

This is a fast-follow release that enables Postgres read replica support.

To offload read-heavy queries from the primary database, you can optionally configure one or more read replicas using the `database-replica-urls` option. When configured, non-critical read-only queries (e.g. fetching messages, checking access permissions, etc) are distributed across the replicas using round-robin, while all writes and correctness-critical reads continue to go to the primary. If a replica becomes unhealthy, ntfy automatically falls back to the primary until the replica recovers.

**Features:**

- Support [PostgreSQL read replicas](https://docs.ntfy.sh/config/#postgresql-experimental) for offloading non-critical read queries via `database-replica-urls` config option ([#&#8203;1648](https://github.com/binwiederhier/ntfy/pull/1648))
- Add interactive [config generator](https://docs.ntfy.sh/config/#config-generator) to the documentation to help create server configuration files ([#&#8203;1654](https://github.com/binwiederhier/ntfy/pull/1654))

**Bug fixes + maintenance:**

- Web: Throttle notification sound in web app to play at most once every 2 seconds (similar to [#&#8203;1550](https://github.com/binwiederhier/ntfy/issues/1550), thanks to [@&#8203;jlaffaye](https://github.com/jlaffaye) for reporting)
- Web: Add hover tooltips to icon buttons in web app account and preferences pages ([#&#8203;1565](https://github.com/binwiederhier/ntfy/issues/1565), thanks to [@&#8203;jermanuts](https://github.com/jermanuts) for reporting)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about these updates again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My41OS4yIiwidXBkYXRlZEluVmVyIjoiNDMuNTkuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiaW1hZ2UiXX0=-->

Reviewed-on: https://gitea.alexlebens.dev/alexlebens/infrastructure/pulls/4755
Co-authored-by: Renovate Bot <renovate-bot@alexlebens.net>
Co-committed-by: Renovate Bot <renovate-bot@alexlebens.net>
2026-03-15 20:46:41 +00:00
1a70faa2e9 feat: use the user url for messages
All checks were successful
renovate / renovate (push) Successful in 2m4s
2026-03-15 15:40:46 -05:00
e1e54e567d feat: more specific condition for push event 2026-03-15 15:40:46 -05:00
3daa236d8c chore(deps): update kube-prometheus-stack docker tag to v82.10.4 (#4763)
All checks were successful
render-manifests / render-manifests (push) Has been skipped
lint-test-helm / lint-helm (push) Successful in 1m8s
lint-test-helm / validate-kubeconform (push) Has been skipped
renovate / renovate (push) Successful in 1m45s
2026-03-15 20:38:33 +00:00
d764dbc6d2 chore(deps): update helm release generic-device-plugin to v0.20.22 (#4761)
Some checks failed
render-manifests / render-manifests (push) Has been skipped
lint-test-helm / lint-helm (push) Successful in 12s
lint-test-helm / validate-kubeconform (push) Has been skipped
renovate / renovate (push) Has been cancelled
2026-03-15 20:36:24 +00:00
44104ba195 chore(deps): update dependency outline/outline to v1.6.0 (#4756)
Some checks failed
lint-test-helm / lint-helm (push) Successful in 22s
lint-test-helm / validate-kubeconform (push) Has been skipped
render-manifests / render-manifests (push) Successful in 32s
renovate / renovate (push) Has been cancelled
This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [outline/outline](https://github.com/outline/outline) | minor | `1.5.0` → `1.6.0` |

---

### Release Notes

<details>
<summary>outline/outline (outline/outline)</summary>

### [`v1.6.0`](https://github.com/outline/outline/releases/tag/v1.6.0)

[Compare Source](https://github.com/outline/outline/compare/v1.5.0...v1.6.0)

#### What's Changed

##### Highlights

- Added a built-in MCP (Model Context Protocol) server, allowing AI assistants like Claude, Cursor, and Mistral to securely interact with the knowledge base. This is disabled by default for existing workspaces – see more details in the [docs](https://docs.getoutline.com/s/guide/doc/mcp-6j9jtENNKL).
- New GitLab integration allows previewing issues, merge requests, and projects in documents. Connect GitLab cloud, self-hosted, or both!
- A new "Present" mode allows presenting any document as formatted slides based on headers and dividers. See [docs](https://docs.getoutline.com/s/guide/doc/present-mode-yMGzaY7A9L).

##### Other Improvements

- Fortran and ABAP language support added to code blocks in [#&#8203;11471](https://github.com/outline/outline/pull/11471)
- OAuth provider now supports dynamic client registration in [#&#8203;11462](https://github.com/outline/outline/pull/11462)
- Added support for rich Linear, GitHub, and GitLab project mentions
- It is now possible to insert templates from the block menu in [#&#8203;11647](https://github.com/outline/outline/pull/11647)
- Embed integrations shown in the editor are now configurable in **Settings -> Integrations -> Embeds** in [#&#8203;11612](https://github.com/outline/outline/pull/11612)
- Toggle blocks can now be closed/open by clicking on the title in [#&#8203;11469](https://github.com/outline/outline/pull/11469)
- Add `Meta+Shift+I` shortcut for opening Insights in [#&#8203;11492](https://github.com/outline/outline/pull/11492)
- Added webhook category for file attachments in [#&#8203;11494](https://github.com/outline/outline/pull/11494)
- Child documents are now shown in the markdown for shared documents in [#&#8203;11495](https://github.com/outline/outline/pull/11495)
- Much smaller initial javascript bundle in [#&#8203;11518](https://github.com/outline/outline/pull/11518)
- Added support for configurable proxy IP header in environment settings by [@&#8203;ashleysommer](https://github.com/ashleysommer) in [#&#8203;11595](https://github.com/outline/outline/pull/11595)
- Added text wrap option for code blocks in [#&#8203;11614](https://github.com/outline/outline/pull/11614)
- Support rendering any shared doc as Markdown by adding `.md` extension ([example](https://docs.getoutline.com/s/guide.md)) in [#&#8203;11668](https://github.com/outline/outline/pull/11668)
- Added support for the ELK layout engine in Mermaid diagrams in [#&#8203;11631](https://github.com/outline/outline/pull/11631)
- Added FontAwesome icon support to Mermaid diagrams in [#&#8203;11704](https://github.com/outline/outline/pull/11704)
- There is now an option to toggle all notifications in [#&#8203;11713](https://github.com/outline/outline/pull/11713)
- Added an "Open in Desktop" option to document menu in [#&#8203;11729](https://github.com/outline/outline/pull/11729)
- It is now possible to toggle the preview display for attached PDFs in [#&#8203;11746](https://github.com/outline/outline/pull/11746)
- `CMD+Shift+L` shortcut now works to toggle theme on publicly shared pages in [#&#8203;11750](https://github.com/outline/outline/pull/11750)
- Discord will no longer re-prompt authorization for existing grants by [@&#8203;lrstanley](https://github.com/lrstanley) in [#&#8203;11757](https://github.com/outline/outline/pull/11757)
- Small facelift of integrations directory in [#&#8203;11516](https://github.com/outline/outline/pull/11516) and group management
- API: Added new `templates.list`, `templates.create`, `templates.info` etc endpoints to manage templates in [#&#8203;11027](https://github.com/outline/outline/pull/11027)

##### Fixes

- Fixed an issue with pagination on search results in [#&#8203;11489](https://github.com/outline/outline/pull/11489)
- Fixed an issue where the find and replace dialog immediately closes when opened on mobile devices in [#&#8203;11497](https://github.com/outline/outline/pull/11497)
- Improved caching behavior by ignoring the browser cache for the diagram extension in [#&#8203;11498](https://github.com/outline/outline/pull/11498)
- Fixed an issue where the read-only collection editor would not remount correctly when navigating in [#&#8203;11499](https://github.com/outline/outline/pull/11499)
- Fixed overly greedy background highlighting in the editor in [#&#8203;11500](https://github.com/outline/outline/pull/11500)
- Resolved multiple issues related to sticky headers on tables in [#&#8203;11501](https://github.com/outline/outline/pull/11501)
- Improved performance by applying initial decorations earlier for toggle blocks in [#&#8203;11493](https://github.com/outline/outline/pull/11493)
- Improved the accuracy of touch device detection in [#&#8203;11515](https://github.com/outline/outline/pull/11515)
- Improved performance by protecting against thundering herd issues in the SSO access validation task in [#&#8203;11532](https://github.com/outline/outline/pull/11532)
- Improved performance by optimizing a slow database query in the notification helper in [#&#8203;11534](https://github.com/outline/outline/pull/11534)
- Improved performance by moving image downloads outside of database transactions in [#&#8203;11528](https://github.com/outline/outline/pull/11528)
- Fixed an issue where a duplicate Korean IME character would be inserted when pressing Enter in the search bar by [@&#8203;huiseo](https://github.com/huiseo) in [#&#8203;11543](https://github.com/outline/outline/pull/11543)
- Fixed an issue where split comment marks were not correctly updated or deleted in [#&#8203;11537](https://github.com/outline/outline/pull/11537)
- Added handling for network failures in the installation info endpoint for isolated environments in [#&#8203;11546](https://github.com/outline/outline/pull/11546)
- Fixed a printing error caused by timing issues with React's `queueMicrotask` in [#&#8203;11551](https://github.com/outline/outline/pull/11551)
- Improved performance by optimizing the user memberships query in [#&#8203;11553](https://github.com/outline/outline/pull/11553)
- Fixed styling issues by adding a read-only guard on table cell selections in [#&#8203;11555](https://github.com/outline/outline/pull/11555)
- Fixed an issue in the Notion importer where child page mentions were being ignored in [#&#8203;11567](https://github.com/outline/outline/pull/11567)
- Fixed an issue with the misuse of database transactions in document revision endpoints in [#&#8203;11574](https://github.com/outline/outline/pull/11574)
- Fixed an issue by properly wrapping the content of toggle blocks in [#&#8203;11577](https://github.com/outline/outline/pull/11577)
- Improved performance by caching user collection IDs in [#&#8203;11579](https://github.com/outline/outline/pull/11579)
- Fixed a memory leak where failed webhooks were held in memory after a timeout in [#&#8203;11580](https://github.com/outline/outline/pull/11580)
- Improved database performance by removing unnecessarily complex joins in [#&#8203;11581](https://github.com/outline/outline/pull/11581)
- Fixed horizontal text overflow issues in notification emails in [#&#8203;11584](https://github.com/outline/outline/pull/11584)
- Fixed support for toggling nested lists within completed checkbox items in [#&#8203;11583](https://github.com/outline/outline/pull/11583)
- Fixed an issue where an empty state would briefly flash in the mention menu in [#&#8203;11587](https://github.com/outline/outline/pull/11587)
- Fixed issues by normalizing the edit state in the collection overview in [#&#8203;11586](https://github.com/outline/outline/pull/11586)
- Improved performance to prevent database lockups when presenting lists of imported documents in [#&#8203;11591](https://github.com/outline/outline/pull/11591)
- Fixed UUID escaping for custom emojis during document creation via the API in [#&#8203;11594](https://github.com/outline/outline/pull/11594)
- Fixed an issue where searches within public docs were incorrectly including internal popularity scores in [#&#8203;11598](https://github.com/outline/outline/pull/11598)
- Fixed an issue with the rank ordering of search results in [#&#8203;11599](https://github.com/outline/outline/pull/11599)
- Improved the appearance and functionality of the search popover on public documents in [#&#8203;11601](https://github.com/outline/outline/pull/11601)
- Fixed visual and functional issues with the notifications popover in [#&#8203;11602](https://github.com/outline/outline/pull/11602)
- Increased the request timeout for file creation to better support uploading large files in [#&#8203;11570](https://github.com/outline/outline/pull/11570)
- Fixed a misalignment issue with the right sidebar header in [#&#8203;11539](https://github.com/outline/outline/pull/11539)
- Fixed issues related to rendering Mermaid diagrams in [#&#8203;11604](https://github.com/outline/outline/pull/11604)
- Fixed a visual issue where the search sorting control would wrap onto its own line in [#&#8203;11606](https://github.com/outline/outline/pull/11606)
- Made a variety of performance improvements to the `ProsemirrorHelper` in [#&#8203;11554](https://github.com/outline/outline/pull/11554)
- Fixed an issue where the sidebar would briefly flash upon initial page load in [#&#8203;11607](https://github.com/outline/outline/pull/11607)
- Ensured that documents are removed from the starred list when they are archived in [#&#8203;11611](https://github.com/outline/outline/pull/11611)
- Improved performance by verifying websocket connections before querying the database in [#&#8203;11620](https://github.com/outline/outline/pull/11620)
- Updated the rate limiter to use a combination of user ID and IP address for better accuracy in [#&#8203;11613](https://github.com/outline/outline/pull/11613)
- Fixed an issue to ensure diagram file formats (PNG/SVG) are preserved when editing in [#&#8203;11622](https://github.com/outline/outline/pull/11622)
- Added a security limit of 10 attempts for OTP (One-Time Password) logins in [#&#8203;11623](https://github.com/outline/outline/pull/11623)
- Fixed issues related to avatar uploads in [#&#8203;11624](https://github.com/outline/outline/pull/11624)
- Improved performance by including the collection's `updatedAt` property in websocket payloads in [#&#8203;11628](https://github.com/outline/outline/pull/11628)
- Improved performance by adding API request deduplication in [#&#8203;11629](https://github.com/outline/outline/pull/11629)
- Upgraded `framer-motion` to version 5 to resolve issues with tab animations in [#&#8203;11632](https://github.com/outline/outline/pull/11632)
- Fixed an issue by skipping link unfurling attempts for non-HTTP/HTTPS URLs in [#&#8203;11640](https://github.com/outline/outline/pull/11640)
- Improved reliability by validating OAuth client IDs as UUIDs before querying the database in [#&#8203;11653](https://github.com/outline/outline/pull/11653)
- Fixed an issue to ensure sourced permissions are correctly rebuilt when a document is moved in [#&#8203;11229](https://github.com/outline/outline/pull/11229)
- Improved navigation visuals by highlighting the parent menu item when its submenu is open in [#&#8203;11659](https://github.com/outline/outline/pull/11659)
- Fixed an issue where the ESC key was not working to close the Share popover in [#&#8203;11662](https://github.com/outline/outline/pull/11662)
- Removed the hidden star control from document list items on mobile devices in [#&#8203;11655](https://github.com/outline/outline/pull/11655)
- Fixed an issue that caused database deadlocks when inserting into subscriptions in [#&#8203;11667](https://github.com/outline/outline/pull/11667)
- Removed the deprecated `datadog-metrics` library in [#&#8203;11665](https://github.com/outline/outline/pull/11665)
- Fixed an issue where @&#8203;mentions on mobile were being inserted at the incorrect position in [#&#8203;11671](https://github.com/outline/outline/pull/11671)
- Fixed incorrect visual nesting of items in the document explorer in [#&#8203;11680](https://github.com/outline/outline/pull/11680)
- Improved the accuracy of user membership policy checks in [#&#8203;11687](https://github.com/outline/outline/pull/11687)
- Improved performance by avoiding the instantiation of unnecessary editor extensions in read-only mode in [#&#8203;11681](https://github.com/outline/outline/pull/11681)
- Added a missing check for enabled passkeys in the verification endpoint in [#&#8203;11689](https://github.com/outline/outline/pull/11689)
- Increased the font size within code blocks for better readability in [#&#8203;11690](https://github.com/outline/outline/pull/11690)
- Fixed an issue to ensure comments on nodes are correctly stripped when duplicating a document in [#&#8203;11700](https://github.com/outline/outline/pull/11700)
- Moved warning-level logs from Sentry to standard logging outputs in [#&#8203;11708](https://github.com/outline/outline/pull/11708)
- Added support for the German (`de_DE`) long-date format in localized time display by [@&#8203;iljalukin](https://github.com/iljalukin) in [#&#8203;11720](https://github.com/outline/outline/pull/11720)
- Removed the deprecated usage of `ALLOWED_DOMAINS` and `GOOGLE_ALLOWED_DOMAINS` environment variables by [@&#8203;akshat-kumar-singhal](https://github.com/akshat-kumar-singhal) in [#&#8203;11718](https://github.com/outline/outline/pull/11718)
- Improved database performance by optimizing query pagination in [#&#8203;11726](https://github.com/outline/outline/pull/11726)
- Fixed a visual issue where the document explorer would jump when hovered over with the pointer in [#&#8203;11727](https://github.com/outline/outline/pull/11727)
- Fixed incorrect policy enforcement for file operations in [#&#8203;11728](https://github.com/outline/outline/pull/11728)
- Fixed an issue by properly filtering relationships returned from the list endpoint in [#&#8203;11738](https://github.com/outline/outline/pull/11738)
- Ensured that "Passkey" is only displayed on login screen if the workspace has actually used them in [#&#8203;11748](https://github.com/outline/outline/pull/11748)
- Changed the default behavior so that PDF attachments are no longer embedded automatically upon drag upload in [#&#8203;11745](https://github.com/outline/outline/pull/11745)
- Fixed an issue that caused stale collaborator IDs to be retained in [#&#8203;11749](https://github.com/outline/outline/pull/11749)
- Moved the group management interface to a dedicated sub-page for better organization in [#&#8203;11755](https://github.com/outline/outline/pull/11755)

#### New Contributors

- [@&#8203;ashleysommer](https://github.com/ashleysommer) made their first contribution in [#&#8203;11595](https://github.com/outline/outline/pull/11595)
- [@&#8203;iljalukin](https://github.com/iljalukin) made their first contribution in [#&#8203;11720](https://github.com/outline/outline/pull/11720)
- [@&#8203;akshat-kumar-singhal](https://github.com/akshat-kumar-singhal) made their first contribution in [#&#8203;11718](https://github.com/outline/outline/pull/11718)
- [@&#8203;Daniel15](https://github.com/Daniel15) made their first contribution in [#&#8203;11731](https://github.com/outline/outline/pull/11731)
- [@&#8203;lrstanley](https://github.com/lrstanley) made their first contribution in [#&#8203;11757](https://github.com/outline/outline/pull/11757)

**Full Changelog**: <https://github.com/outline/outline/compare/v1.5.0...v1.6.0>

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My41OS4yIiwidXBkYXRlZEluVmVyIjoiNDMuNTkuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiaW1hZ2UiXX0=-->

Reviewed-on: #4756
Co-authored-by: Renovate Bot <renovate-bot@alexlebens.net>
Co-committed-by: Renovate Bot <renovate-bot@alexlebens.net>
2026-03-15 20:32:01 +00:00
45754be712 chore(deps): update outlinewiki/outline docker tag to v1.6.0 (#4757)
Some checks failed
lint-test-helm / validate-kubeconform (push) Has been cancelled
lint-test-helm / lint-helm (push) Has started running
render-manifests / render-manifests (push) Has started running
renovate / renovate (push) Has been cancelled
This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [outlinewiki/outline](https://github.com/outline/outline) | minor | `1.5.0` → `1.6.0` |

---

### Release Notes

<details>
<summary>outline/outline (outlinewiki/outline)</summary>

### [`v1.6.0`](https://github.com/outline/outline/releases/tag/v1.6.0)

[Compare Source](https://github.com/outline/outline/compare/v1.5.0...v1.6.0)

##### What's Changed

##### Highlights

- Added a built-in MCP (Model Context Protocol) server, allowing AI assistants like Claude, Cursor, and Mistral to securely interact with the knowledge base. This is disabled by default for existing workspaces – see more details in the [docs](https://docs.getoutline.com/s/guide/doc/mcp-6j9jtENNKL).
- New GitLab integration allows previewing issues, merge requests, and projects in documents. Connect GitLab cloud, self-hosted, or both!
- A new "Present" mode allows presenting any document as formatted slides based on headers and dividers. See [docs](https://docs.getoutline.com/s/guide/doc/present-mode-yMGzaY7A9L).

##### Other Improvements

- Fortran and ABAP language support added to code blocks in [#&#8203;11471](https://github.com/outline/outline/pull/11471)
- OAuth provider now supports dynamic client registration in [#&#8203;11462](https://github.com/outline/outline/pull/11462)
- Added support for rich Linear, GitHub, and GitLab project mentions
- It is now possible to insert templates from the block menu in [#&#8203;11647](https://github.com/outline/outline/pull/11647)
- Embed integrations shown in the editor are now configurable in **Settings -> Integrations -> Embeds** in [#&#8203;11612](https://github.com/outline/outline/pull/11612)
- Toggle blocks can now be closed/open by clicking on the title in [#&#8203;11469](https://github.com/outline/outline/pull/11469)
- Add `Meta+Shift+I` shortcut for opening Insights in [#&#8203;11492](https://github.com/outline/outline/pull/11492)
- Added webhook category for file attachments in [#&#8203;11494](https://github.com/outline/outline/pull/11494)
- Child documents are now shown in the markdown for shared documents in [#&#8203;11495](https://github.com/outline/outline/pull/11495)
- Much smaller initial javascript bundle in [#&#8203;11518](https://github.com/outline/outline/pull/11518)
- Added support for configurable proxy IP header in environment settings by [@&#8203;ashleysommer](https://github.com/ashleysommer) in [#&#8203;11595](https://github.com/outline/outline/pull/11595)
- Added text wrap option for code blocks in [#&#8203;11614](https://github.com/outline/outline/pull/11614)
- Support rendering any shared doc as Markdown by adding `.md` extension ([example](https://docs.getoutline.com/s/guide.md)) in [#&#8203;11668](https://github.com/outline/outline/pull/11668)
- Added support for the ELK layout engine in Mermaid diagrams in [#&#8203;11631](https://github.com/outline/outline/pull/11631)
- Added FontAwesome icon support to Mermaid diagrams in [#&#8203;11704](https://github.com/outline/outline/pull/11704)
- There is now an option to toggle all notifications in [#&#8203;11713](https://github.com/outline/outline/pull/11713)
- Added an "Open in Desktop" option to document menu in [#&#8203;11729](https://github.com/outline/outline/pull/11729)
- It is now possible to toggle the preview display for attached PDFs in [#&#8203;11746](https://github.com/outline/outline/pull/11746)
- `CMD+Shift+L` shortcut now works to toggle theme on publicly shared pages in [#&#8203;11750](https://github.com/outline/outline/pull/11750)
- Discord will no longer re-prompt authorization for existing grants by [@&#8203;lrstanley](https://github.com/lrstanley) in [#&#8203;11757](https://github.com/outline/outline/pull/11757)
- Small facelift of integrations directory in [#&#8203;11516](https://github.com/outline/outline/pull/11516) and group management
- API: Added new `templates.list`, `templates.create`, `templates.info` etc endpoints to manage templates in [#&#8203;11027](https://github.com/outline/outline/pull/11027)

##### Fixes

- Fixed an issue with pagination on search results in [#&#8203;11489](https://github.com/outline/outline/pull/11489)
- Fixed an issue where the find and replace dialog immediately closes when opened on mobile devices in [#&#8203;11497](https://github.com/outline/outline/pull/11497)
- Improved caching behavior by ignoring the browser cache for the diagram extension in [#&#8203;11498](https://github.com/outline/outline/pull/11498)
- Fixed an issue where the read-only collection editor would not remount correctly when navigating in [#&#8203;11499](https://github.com/outline/outline/pull/11499)
- Fixed overly greedy background highlighting in the editor in [#&#8203;11500](https://github.com/outline/outline/pull/11500)
- Resolved multiple issues related to sticky headers on tables in [#&#8203;11501](https://github.com/outline/outline/pull/11501)
- Improved performance by applying initial decorations earlier for toggle blocks in [#&#8203;11493](https://github.com/outline/outline/pull/11493)
- Improved the accuracy of touch device detection in [#&#8203;11515](https://github.com/outline/outline/pull/11515)
- Improved performance by protecting against thundering herd issues in the SSO access validation task in [#&#8203;11532](https://github.com/outline/outline/pull/11532)
- Improved performance by optimizing a slow database query in the notification helper in [#&#8203;11534](https://github.com/outline/outline/pull/11534)
- Improved performance by moving image downloads outside of database transactions in [#&#8203;11528](https://github.com/outline/outline/pull/11528)
- Fixed an issue where a duplicate Korean IME character would be inserted when pressing Enter in the search bar by [@&#8203;huiseo](https://github.com/huiseo) in [#&#8203;11543](https://github.com/outline/outline/pull/11543)
- Fixed an issue where split comment marks were not correctly updated or deleted in [#&#8203;11537](https://github.com/outline/outline/pull/11537)
- Added handling for network failures in the installation info endpoint for isolated environments in [#&#8203;11546](https://github.com/outline/outline/pull/11546)
- Fixed a printing error caused by timing issues with React's `queueMicrotask` in [#&#8203;11551](https://github.com/outline/outline/pull/11551)
- Improved performance by optimizing the user memberships query in [#&#8203;11553](https://github.com/outline/outline/pull/11553)
- Fixed styling issues by adding a read-only guard on table cell selections in [#&#8203;11555](https://github.com/outline/outline/pull/11555)
- Fixed an issue in the Notion importer where child page mentions were being ignored in [#&#8203;11567](https://github.com/outline/outline/pull/11567)
- Fixed an issue with the misuse of database transactions in document revision endpoints in [#&#8203;11574](https://github.com/outline/outline/pull/11574)
- Fixed an issue by properly wrapping the content of toggle blocks in [#&#8203;11577](https://github.com/outline/outline/pull/11577)
- Improved performance by caching user collection IDs in [#&#8203;11579](https://github.com/outline/outline/pull/11579)
- Fixed a memory leak where failed webhooks were held in memory after a timeout in [#&#8203;11580](https://github.com/outline/outline/pull/11580)
- Improved database performance by removing unnecessarily complex joins in [#&#8203;11581](https://github.com/outline/outline/pull/11581)
- Fixed horizontal text overflow issues in notification emails in [#&#8203;11584](https://github.com/outline/outline/pull/11584)
- Fixed support for toggling nested lists within completed checkbox items in [#&#8203;11583](https://github.com/outline/outline/pull/11583)
- Fixed an issue where an empty state would briefly flash in the mention menu in [#&#8203;11587](https://github.com/outline/outline/pull/11587)
- Fixed issues by normalizing the edit state in the collection overview in [#&#8203;11586](https://github.com/outline/outline/pull/11586)
- Improved performance to prevent database lockups when presenting lists of imported documents in [#&#8203;11591](https://github.com/outline/outline/pull/11591)
- Fixed UUID escaping for custom emojis during document creation via the API in [#&#8203;11594](https://github.com/outline/outline/pull/11594)
- Fixed an issue where searches within public docs were incorrectly including internal popularity scores in [#&#8203;11598](https://github.com/outline/outline/pull/11598)
- Fixed an issue with the rank ordering of search results in [#&#8203;11599](https://github.com/outline/outline/pull/11599)
- Improved the appearance and functionality of the search popover on public documents in [#&#8203;11601](https://github.com/outline/outline/pull/11601)
- Fixed visual and functional issues with the notifications popover in [#&#8203;11602](https://github.com/outline/outline/pull/11602)
- Increased the request timeout for file creation to better support uploading large files in [#&#8203;11570](https://github.com/outline/outline/pull/11570)
- Fixed a misalignment issue with the right sidebar header in [#&#8203;11539](https://github.com/outline/outline/pull/11539)
- Fixed issues related to rendering Mermaid diagrams in [#&#8203;11604](https://github.com/outline/outline/pull/11604)
- Fixed a visual issue where the search sorting control would wrap onto its own line in [#&#8203;11606](https://github.com/outline/outline/pull/11606)
- Made a variety of performance improvements to the `ProsemirrorHelper` in [#&#8203;11554](https://github.com/outline/outline/pull/11554)
- Fixed an issue where the sidebar would briefly flash upon initial page load in [#&#8203;11607](https://github.com/outline/outline/pull/11607)
- Ensured that documents are removed from the starred list when they are archived in [#&#8203;11611](https://github.com/outline/outline/pull/11611)
- Improved performance by verifying websocket connections before querying the database in [#&#8203;11620](https://github.com/outline/outline/pull/11620)
- Updated the rate limiter to use a combination of user ID and IP address for better accuracy in [#&#8203;11613](https://github.com/outline/outline/pull/11613)
- Fixed an issue to ensure diagram file formats (PNG/SVG) are preserved when editing in [#&#8203;11622](https://github.com/outline/outline/pull/11622)
- Added a security limit of 10 attempts for OTP (One-Time Password) logins in [#&#8203;11623](https://github.com/outline/outline/pull/11623)
- Fixed issues related to avatar uploads in [#&#8203;11624](https://github.com/outline/outline/pull/11624)
- Improved performance by including the collection's `updatedAt` property in websocket payloads in [#&#8203;11628](https://github.com/outline/outline/pull/11628)
- Improved performance by adding API request deduplication in [#&#8203;11629](https://github.com/outline/outline/pull/11629)
- Upgraded `framer-motion` to version 5 to resolve issues with tab animations in [#&#8203;11632](https://github.com/outline/outline/pull/11632)
- Fixed an issue by skipping link unfurling attempts for non-HTTP/HTTPS URLs in [#&#8203;11640](https://github.com/outline/outline/pull/11640)
- Improved reliability by validating OAuth client IDs as UUIDs before querying the database in [#&#8203;11653](https://github.com/outline/outline/pull/11653)
- Fixed an issue to ensure sourced permissions are correctly rebuilt when a document is moved in [#&#8203;11229](https://github.com/outline/outline/pull/11229)
- Improved navigation visuals by highlighting the parent menu item when its submenu is open in [#&#8203;11659](https://github.com/outline/outline/pull/11659)
- Fixed an issue where the ESC key was not working to close the Share popover in [#&#8203;11662](https://github.com/outline/outline/pull/11662)
- Removed the hidden star control from document list items on mobile devices in [#&#8203;11655](https://github.com/outline/outline/pull/11655)
- Fixed an issue that caused database deadlocks when inserting into subscriptions in [#&#8203;11667](https://github.com/outline/outline/pull/11667)
- Removed the deprecated `datadog-metrics` library in [#&#8203;11665](https://github.com/outline/outline/pull/11665)
- Fixed an issue where @&#8203;mentions on mobile were being inserted at the incorrect position in [#&#8203;11671](https://github.com/outline/outline/pull/11671)
- Fixed incorrect visual nesting of items in the document explorer in [#&#8203;11680](https://github.com/outline/outline/pull/11680)
- Improved the accuracy of user membership policy checks in [#&#8203;11687](https://github.com/outline/outline/pull/11687)
- Improved performance by avoiding the instantiation of unnecessary editor extensions in read-only mode in [#&#8203;11681](https://github.com/outline/outline/pull/11681)
- Added a missing check for enabled passkeys in the verification endpoint in [#&#8203;11689](https://github.com/outline/outline/pull/11689)
- Increased the font size within code blocks for better readability in [#&#8203;11690](https://github.com/outline/outline/pull/11690)
- Fixed an issue to ensure comments on nodes are correctly stripped when duplicating a document in [#&#8203;11700](https://github.com/outline/outline/pull/11700)
- Moved warning-level logs from Sentry to standard logging outputs in [#&#8203;11708](https://github.com/outline/outline/pull/11708)
- Added support for the German (`de_DE`) long-date format in localized time display by [@&#8203;iljalukin](https://github.com/iljalukin) in [#&#8203;11720](https://github.com/outline/outline/pull/11720)
- Removed the deprecated usage of `ALLOWED_DOMAINS` and `GOOGLE_ALLOWED_DOMAINS` environment variables by [@&#8203;akshat-kumar-singhal](https://github.com/akshat-kumar-singhal) in [#&#8203;11718](https://github.com/outline/outline/pull/11718)
- Improved database performance by optimizing query pagination in [#&#8203;11726](https://github.com/outline/outline/pull/11726)
- Fixed a visual issue where the document explorer would jump when hovered over with the pointer in [#&#8203;11727](https://github.com/outline/outline/pull/11727)
- Fixed incorrect policy enforcement for file operations in [#&#8203;11728](https://github.com/outline/outline/pull/11728)
- Fixed an issue by properly filtering relationships returned from the list endpoint in [#&#8203;11738](https://github.com/outline/outline/pull/11738)
- Ensured that "Passkey" is only displayed on login screen if the workspace has actually used them in [#&#8203;11748](https://github.com/outline/outline/pull/11748)
- Changed the default behavior so that PDF attachments are no longer embedded automatically upon drag upload in [#&#8203;11745](https://github.com/outline/outline/pull/11745)
- Fixed an issue that caused stale collaborator IDs to be retained in [#&#8203;11749](https://github.com/outline/outline/pull/11749)
- Moved the group management interface to a dedicated sub-page for better organization in [#&#8203;11755](https://github.com/outline/outline/pull/11755)

##### New Contributors

- [@&#8203;ashleysommer](https://github.com/ashleysommer) made their first contribution in [#&#8203;11595](https://github.com/outline/outline/pull/11595)
- [@&#8203;iljalukin](https://github.com/iljalukin) made their first contribution in [#&#8203;11720](https://github.com/outline/outline/pull/11720)
- [@&#8203;akshat-kumar-singhal](https://github.com/akshat-kumar-singhal) made their first contribution in [#&#8203;11718](https://github.com/outline/outline/pull/11718)
- [@&#8203;Daniel15](https://github.com/Daniel15) made their first contribution in [#&#8203;11731](https://github.com/outline/outline/pull/11731)
- [@&#8203;lrstanley](https://github.com/lrstanley) made their first contribution in [#&#8203;11757](https://github.com/outline/outline/pull/11757)

**Full Changelog**: <https://github.com/outline/outline/compare/v1.5.0...v1.6.0>

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My41OS4yIiwidXBkYXRlZEluVmVyIjoiNDMuNTkuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiaW1hZ2UiXX0=-->

Reviewed-on: #4757
Co-authored-by: Renovate Bot <renovate-bot@alexlebens.net>
Co-committed-by: Renovate Bot <renovate-bot@alexlebens.net>
2026-03-15 20:31:37 +00:00
0e9d1eb85d chore(deps): update postgres-cluster docker tag to v7.10.0 (#4758)
Some checks failed
renovate / renovate (push) Successful in 1m46s
render-manifests / render-manifests (push) Successful in 1m48s
lint-test-helm / validate-kubeconform (push) Has been cancelled
lint-test-helm / lint-helm (push) Has been cancelled
This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [postgres-cluster](https://github.com/cloudnative-pg/cloudnative-pg) | minor | `7.9.1` → `7.10.0` |

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My41OS4yIiwidXBkYXRlZEluVmVyIjoiNDMuNTkuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiY2hhcnQiLCJpbWFnZSJdfQ==-->

Reviewed-on: #4758
Co-authored-by: Renovate Bot <renovate-bot@alexlebens.net>
Co-committed-by: Renovate Bot <renovate-bot@alexlebens.net>
2026-03-15 20:25:47 +00:00
1062e4cb3c feat: specify http port
All checks were successful
render-manifests / render-manifests (push) Successful in 43s
lint-test-helm / lint-helm (push) Successful in 1m7s
lint-test-helm / validate-kubeconform (push) Has been skipped
renovate / renovate (push) Successful in 8m55s
2026-03-15 15:02:19 -05:00
7dac56f404 chore(deps): update ghcr.io/linuxserver/qbittorrent:5.1.4 docker digest to 855e5f4 (#4753)
All checks were successful
lint-test-helm / lint-helm (push) Successful in 21s
lint-test-helm / validate-kubeconform (push) Has been skipped
render-manifests / render-manifests (push) Successful in 8m24s
renovate / renovate (push) Successful in 1m22s
2026-03-15 08:03:46 +00:00
649b9f4bbe chore(config): migrate Renovate config (#4752)
All checks were successful
renovate / renovate (push) Successful in 3m8s
The Renovate config in this repository needs migrating. Typically this is because one or more configuration options you are using have been renamed.

  You don't need to merge this PR right away, because Renovate will continue to migrate these fields internally each time it runs. But later some of these fields may be fully deprecated and the migrations removed. So it's a good idea to merge this migration PR soon.

🔕 **Ignore**: Close this PR and you won't be reminded about config migration again, but one day your current config may no longer be valid.

 Got questions? Does something look wrong to you? Please don't hesitate to [request help here](https://github.com/renovatebot/renovate/discussions).

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).

Reviewed-on: #4752
Co-authored-by: Renovate Bot <renovate-bot@alexlebens.net>
Co-committed-by: Renovate Bot <renovate-bot@alexlebens.net>
2026-03-15 06:08:46 +00:00
27151632c0 feat: add description
All checks were successful
lint-test-helm / lint-helm (push) Successful in 50s
render-manifests / render-manifests (push) Successful in 49s
lint-test-helm / validate-kubeconform (push) Has been skipped
renovate / renovate (push) Successful in 1m48s
2026-03-15 01:00:58 -05:00
04ff752696 feat: add renovate tags for specific images 2026-03-15 01:00:28 -05:00
d373ba5ae9 feat: renovate for kubeconform 2026-03-15 00:54:33 -05:00
e00b12f619 feat: update helm and use renovate to keep it updated 2026-03-15 00:52:57 -05:00
6cb0c2e987 feat: remove if
All checks were successful
renovate / renovate (push) Successful in 1m27s
2026-03-15 00:44:06 -05:00
088c4ae827 feat: remove link to wiki
All checks were successful
lint-test-helm / lint-helm (push) Successful in 14s
lint-test-helm / validate-kubeconform (push) Has been skipped
render-manifests / render-manifests (push) Successful in 33s
renovate / renovate (push) Successful in 2m46s
2026-03-15 00:39:46 -05:00
e00766e4b0 feat: add cache
Some checks failed
renovate / renovate (push) Has been cancelled
2026-03-15 00:39:04 -05:00
79b301e4ef feat: add helm repos
All checks were successful
renovate / renovate (push) Successful in 1m26s
2026-03-15 00:34:47 -05:00
e1bf47f045 feat: improve linking 2026-03-15 00:33:28 -05:00
0315445a50 feat: add kubeconform job
All checks were successful
renovate / renovate (push) Successful in 1m40s
2026-03-15 00:25:35 -05:00
6450588d17 feat: refactor and improve steps
All checks were successful
renovate / renovate (push) Successful in 1m40s
2026-03-15 00:10:28 -05:00
4dd98f9581 feat: refactor and improve steps
All checks were successful
renovate / renovate (push) Successful in 3m34s
2026-03-15 00:05:19 -05:00
702ffc65da feat: use hyphen for consistency
All checks were successful
renovate / renovate (push) Successful in 1m27s
2026-03-14 23:38:35 -05:00
2372ab4b69 feat: add dir output to render
All checks were successful
renovate / renovate (push) Successful in 1m43s
2026-03-14 23:33:15 -05:00
ed57ae842b feat: ignore oci repo
All checks were successful
renovate / renovate (push) Successful in 1m33s
2026-03-14 23:26:46 -05:00
9099d66bd8 feat: group output
All checks were successful
renovate / renovate (push) Successful in 1m35s
2026-03-14 23:22:46 -05:00
b8447dd0ed feat: add update pr step 2026-03-14 23:22:03 -05:00
c373ee4844 feat: improve formatting, revert yq strip command
All checks were successful
renovate / renovate (push) Successful in 1m26s
2026-03-14 23:19:31 -05:00
da8ba776e8 feat: consolidate render workflows to 1
All checks were successful
renovate / renovate (push) Successful in 1m55s
2026-03-14 23:07:57 -05:00
b4afd2ab46 feat: upgrade chart to v1
All checks were successful
lint-test-helm / lint-helm (push) Successful in 11s
render-manifests-push / render-manifests-push (push) Successful in 2m10s
renovate / renovate (push) Successful in 1m18s
2026-03-14 21:08:24 -05:00
d0d9380b93 chore(deps): update booklore-app/booklore to v2.2.1 (#4747)
Some checks failed
render-manifests-push / render-manifests-push (push) Has been skipped
lint-test-helm / lint-helm (push) Successful in 14s
renovate / renovate (push) Has been cancelled
2026-03-15 02:06:18 +00:00
c435ba993e feat: refactor and improve steps
Some checks failed
renovate / renovate (push) Has been cancelled
2026-03-14 21:04:35 -05:00
85aa62b529 feat: remove link to wiki
All checks were successful
lint-test-helm / lint-helm (push) Successful in 31s
render-manifests-push / render-manifests-push (push) Successful in 31s
renovate / renovate (push) Successful in 2m8s
2026-03-14 21:02:19 -05:00
74af45cb57 fix: missing closing quote
Some checks failed
renovate / renovate (push) Has been cancelled
2026-03-14 21:00:35 -05:00
849fdb432d chore(deps): update registry.k8s.io/coredns/coredns docker tag to v1.14.2 (#4745)
All checks were successful
render-manifests-push / render-manifests-push (push) Has been skipped
lint-test-helm / lint-helm (push) Successful in 31s
renovate / renovate (push) Successful in 1m36s
2026-03-15 01:58:17 +00:00
78d15dccad feat: refactor and improve steps
All checks were successful
renovate / renovate (push) Successful in 1m57s
2026-03-14 20:56:01 -05:00
8bfb5aeea3 feat: add api version and dry-run=server options to render
Some checks failed
renovate / renovate (push) Has been cancelled
2026-03-14 20:54:57 -05:00
5baa34db7e feat: change schedule to morning 2026-03-14 20:49:05 -05:00
d05381f6d2 fix: missing slash to place into folder
All checks were successful
renovate / renovate (push) Successful in 3m17s
2026-03-14 20:45:48 -05:00
b2cf5c094c feat: revert clean comments
All checks were successful
renovate / renovate (push) Successful in 2m4s
2026-03-14 20:31:20 -05:00
20d80826cb fix: missing apostrophe
All checks were successful
renovate / renovate (push) Successful in 3m59s
2026-03-14 20:15:06 -05:00
efe27b9307 chore(deps): update actions/cache action to v5 (#4741)
All checks were successful
renovate / renovate (push) Successful in 3m2s
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [actions/cache](https://github.com/actions/cache) | action | major | `v4` → `v5` |

---

### Release Notes

<details>
<summary>actions/cache (actions/cache)</summary>

### [`v5`](https://github.com/actions/cache/compare/v4...v5)

[Compare Source](https://github.com/actions/cache/compare/v4...v5)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My41OS4yIiwidXBkYXRlZEluVmVyIjoiNDMuNTkuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Reviewed-on: #4741
Co-authored-by: Renovate Bot <renovate-bot@alexlebens.net>
Co-committed-by: Renovate Bot <renovate-bot@alexlebens.net>
2026-03-15 01:06:15 +00:00
13f4726021 fix: remove local variable assignment
Some checks failed
renovate / renovate (push) Has been cancelled
2026-03-14 20:05:46 -05:00
2785f337cf feat: refactor and improve steps
All checks were successful
renovate / renovate (push) Successful in 3m1s
2026-03-14 19:59:30 -05:00
67163611af chore(deps): update dependency mariadb-operator/mariadb-operator to v26 (#4704)
All checks were successful
render-manifests-push / render-manifests-push (push) Has been skipped
lint-test-helm / lint-helm (push) Successful in 1m0s
renovate / renovate (push) Successful in 2m58s
This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [mariadb-operator/mariadb-operator](https://github.com/mariadb-operator/mariadb-operator) | major | `25.10.4` → `26.3.0` |

---

### Release Notes

<details>
<summary>mariadb-operator/mariadb-operator (mariadb-operator/mariadb-operator)</summary>

### [`v26.3.0`](https://github.com/mariadb-operator/mariadb-operator/releases/tag/26.3.0)

[Compare Source](https://github.com/mariadb-operator/mariadb-operator/compare/25.10.4...26.3.0)

**`mariadb-operator` [26.03](https://github.com/mariadb-operator/mariadb-operator/releases/tag/26.3.0) is here!** 🦭

Welcome to another release of `mariadb-operator`! In this version, we have significantly enhanced our disaster recovery capabilities by adding support for **on-demand physical backups**, **Azure Blob Storage** and... (🥁)... **Point-In-Time-Recovery** .

Additionally, we've received a bunch of contributions by our amazing community during this release, including bug fixes and new features. We feel very grateful for your efforts and support, thank you! 🙇‍♂️ Refer to the PRs in the changelog below for further details.

If you're upgrading from previous versions, **do not miss the [UPGRADE GUIDE](https://github.com/mariadb-operator/mariadb-operator/blob/main/docs/releases/UPGRADE_26.3.0.md)** for a smooth transition.

#### Point-In-Time-Recovery

Point-in-time recovery (PITR) is a feature that allows you to restore a `MariaDB` instance to a specific point in time. For achieving this, it combines a full base backup and the binary logs that record all changes made to the database after the backup. This is something fully automated by operator, covering archival and restoration up to a specific time, ensuring business continuity and reduced RTO and RPO.

In order to configure PITR, you need to create a `PhysicalBackup` object to be used as full base backup. For example, you can configure a nightly backup:

```yaml
apiVersion: k8s.mariadb.com/v1alpha1
kind: PhysicalBackup
metadata:
  name: physicalbackup-daily
spec:
  mariaDbRef:
    name: mariadb-repl
  schedule:
    cron: "0 0 * * *"
    suspend: false
    immediate: true
  compression: bzip2
  maxRetention: 720h
  storage:
    s3:
      bucket: physicalbackups
      prefix: mariadb
      endpoint: minio.minio.svc.cluster.local:9000
      region: us-east-1
      accessKeyIdSecretKeyRef:
        name: minio
        key: access-key-id
      secretAccessKeySecretKeyRef:
        name: minio
        key: secret-access-key
      tls:
        enabled: true
        caSecretKeyRef:
          name: minio-ca
          key: ca.crt
```

Next step is configuring common aspects of both binary log archiving and point-in-time restoration by defining a `PointInTimeRecovery` object:

```yaml
apiVersion: k8s.mariadb.com/v1alpha1
kind: PointInTimeRecovery
metadata:
  name: pitr
spec:
  physicalBackupRef:
    name: physicalbackup-daily
  storage:
    s3:
      bucket: binlogs
      prefix: mariadb
      endpoint: minio.minio.svc.cluster.local:9000
      region: us-east-1
      accessKeyIdSecretKeyRef:
        name: minio
        key: access-key-id
      secretAccessKeySecretKeyRef:
        name: minio
        key: secret-access-key
      tls:
        enabled: true
        caSecretKeyRef:
          name: minio-ca
          key: ca.crt
  compression: gzip
  archiveTimeout: 1h
  strictMode: false
```

The new `PointInTimeRecovery` CR is just a configuration object that contains shared settings for both binary log archiving and point-in-time recovery. It has also a reference to a `PhysicalBackup` CR, used as full base backup.

In order to configure binary log archiving, you need to set a reference to the `PointInTimeRecovery` CR in the `MariaDB` object:

```yaml
apiVersion: k8s.mariadb.com/v1alpha1
kind: MariaDB
metadata:
  name: mariadb-repl
spec:
  pointInTimeRecoveryRef:
    name: pitr
```

This will enable the binary log archival in the sidecar agent, which will eventually report the last recoverable time via the `PointInTimeRecovery` status:

```bash
kubectl get pitr
NAME   PHYSICAL BACKUP        LAST RECOVERABLE TIME   STRICT MODE   AGE
pitr   physicalbackup-daily   2026-02-27T20:10:42Z    false         43h
```

In order to perform a point-in-time restoration, you can create a new `MariaDB` instance with a reference to the `PointInTimeRecovery` object in the `bootstrapFrom` field, along with the `targetRecoveryTime`, which should be before or at the last recoverable time:

```yaml
apiVersion: k8s.mariadb.com/v1alpha1
kind: MariaDB
metadata:
  name: mariadb-repl
spec:
  bootstrapFrom:
    pointInTimeRecoveryRef:
      name: pitr
    targetRecoveryTime: 2026-02-27T20:10:42Z
```

The restoration process will match the closest physical backup before or at the `targetRecoveryTime`, and then it will replay the archived binary logs from the backup GTID position up until the `targetRecoveryTime`.

Refer to the [PITR docs](https://github.com/mariadb-operator/mariadb-operator/blob/main/docs/pitr.md) for additional details.

#### Azure Blob Storage

So far, we have only supported S3-compatible storage as object storage for keeping the backups. We are now introducing native support for Azure Blob Storage in the `PhysicalBackup` and `PointInTimeRecovery` CRs. You can configure it under the `storage` field, similarly to S3:

```yaml
apiVersion: k8s.mariadb.com/v1alpha1
kind: PointInTimeRecovery
metadata:
  name: pitr
spec:
  storage:
    azureBlob:
      containerName: binlogs
      serviceURL: https://azurite.default.svc.cluster.local:10000/devstoreaccount1
      prefix: mariadb
      storageAccountName: devstoreaccount1
      storageAccountKey:
        name: azurite-key
        key: storageAccountKey
      tls:
        enabled: true
        caSecretKeyRef:
          name: azurite-certs
          key: cert.pem
```

```yaml
apiVersion: k8s.mariadb.com/v1alpha1
kind: PhysicalBackup
metadata:
  name: physicalbackup-daily
spec:
  storage:
    azureBlob:
      containerName: physicalbackup
      serviceURL: https://azurite.default.svc.cluster.local:10000/devstoreaccount1
      prefix: mariadb
      storageAccountName: devstoreaccount1
      storageAccountKey:
        name: azurite-key
        key: storageAccountKey
      tls:
        enabled: true
        caSecretKeyRef:
          name: azurite-certs
          key: cert.pem
```

Refer to the [physical backup storage](https://github.com/mariadb-operator/mariadb-operator/blob/main/docs/physical_backup.md#azure-blob-storage-credentials) docs for additional details.

It is important to note that we couldn't find the bandwidth to support it for `Backup` resource (logical backup) in this release, [contributions are welcomed](https://github.com/mariadb-operator/mariadb-operator/issues/1653)!

Kudos to our co-maintainer [@&#8203;Michaelpalacce](https://github.com/Michaelpalacce) for smoothly driving this feature end-to-end!

#### On-demand `PhysicalBackup`

We have introduced the ability to trigger on-demand physical backup manually. For doing so, you need to provide an identifier in the `schedule.onDemand` field of the `PhysicalBackup` resource:

```yaml
apiVersion: k8s.mariadb.com/v1alpha1
kind: PhysicalBackup
metadata:
  name: physicalbackup
spec:
  schedule:
    onDemand: "1"
```

Once scheduled, the operator tracks the identifier under the status subresource. If the identifier in the status differs from `schedule.onDemand`, the operator will trigger a new physical backup.

Refer to the [physical backup scheduling](https://github.com/mariadb-operator/mariadb-operator/blob/main/docs/physical_backup.md#scheduling) docs for additional details.

##### Behaviour change in `targetRecoveryTime`

To satisfy requirements of point-in-time recovery, we have unified the behaviour of the `bootstrapFrom.targetRecoveryTime` field in the `MariaDB` object: Logical and physical backup files whose timestamp is closest to `targetRecoveryTime`, **but not after**, will be matched.

Please take this into account when upgrading to this version.

##### Change in Helm `values.yaml`

`config` has been split into `repository` and `tag` to facilitate overriding the image registry (see [#&#8203;1632](https://github.com/mariadb-operator/mariadb-operator/pull/1632)). Please update your `values.yaml` from:

```yaml
config:
  mariadbImageName: docker-registry1.mariadb.com/library/mariadb
  maxscaleImage: docker-registry2.mariadb.com/mariadb/maxscale:23.08.5
  exporterImage: prom/mysqld-exporter:v0.15.1
  exporterMaxscaleImage: docker-registry2.mariadb.com/mariadb/maxscale-prometheus-exporter-ubi:v0.0.1
```

to the following format:

```yaml
config:
  mariadbImage:
    repository: docker-registry1.mariadb.com/library/mariadb
    tag: 11.8.5
  maxscaleImage:
    repository: docker-registry2.mariadb.com/mariadb/maxscale
    tag: 23.08.5
  exporterImage:
    repository: prom/mysqld-exporter
    tag: v0.15.1
  exporterMaxscaleImage:
    repository: docker-registry2.mariadb.com/mariadb/maxscale-prometheus-exporter-ubi
    tag: v0.0.1
```

##### Updated dependencies

| Platform/Component | Version |
| ------------------ | ------- |
| Kubernetes         | 1.35    |
| Go                 | 1.26.1  |
| controller-runtime | 0.23.3  |

#### Updated roadmap

The next feature to be supported is the new multi-cluster topology. Stay tuned!

- [x] ~~[Point In Time Recovery (PITR)](https://github.com/mariadb-operator/mariadb-operator/issues/507)~~
- [ ] [Multi-cluster topology](https://github.com/mariadb-operator/mariadb-operator/issues/1543)

***

#### Community

Contributions of any kind are always welcome: adding yourself to the [list of adopters](https://github.com/mariadb-operator/mariadb-operator/blob/main/ADOPTERS.md), reporting issues, submitting pull requests, or simply starring the project! 🌟

#### Enterprise

For enterprise users, see the **[MariaDB Enterprise Operator](https://mariadb.com/products/enterprise/kubernetes-operator/)**, a commercially supported Kubernetes operator from MariaDB with additional enterprise-grade features.

#### What's Changed

- feat: Use primary Service by default for HA mariaDB connections by [@&#8203;softho0n](https://github.com/softho0n) in [#&#8203;1575](https://github.com/mariadb-operator/mariadb-operator/pull/1575)
- feat: add loadBalancerClass field to ServiceTemplate by [@&#8203;yangminglintw](https://github.com/yangminglintw) in [#&#8203;1589](https://github.com/mariadb-operator/mariadb-operator/pull/1589)
- fix: use standard compression extensions and add magic bytes validation by [@&#8203;yangminglintw](https://github.com/yangminglintw) in [#&#8203;1588](https://github.com/mariadb-operator/mariadb-operator/pull/1588)
- Make volumes and volumeMounts mutable by [@&#8203;hedgieinsocks](https://github.com/hedgieinsocks) in [#&#8203;1601](https://github.com/mariadb-operator/mariadb-operator/pull/1601)
- chore: Bump to latest go by [@&#8203;Michaelpalacce](https://github.com/Michaelpalacce) in [#&#8203;1630](https://github.com/mariadb-operator/mariadb-operator/pull/1630)
- make imagePullSecrets mutable by [@&#8203;dmaes](https://github.com/dmaes) in [#&#8203;1614](https://github.com/mariadb-operator/mariadb-operator/pull/1614)
- split config images in repository and tag by [@&#8203;dmaes](https://github.com/dmaes) in [#&#8203;1632](https://github.com/mariadb-operator/mariadb-operator/pull/1632)
- Galera recovery: disable bootstrap on other pods before bootstrapping by [@&#8203;infocusmodereal](https://github.com/infocusmodereal) in [#&#8203;1631](https://github.com/mariadb-operator/mariadb-operator/pull/1631)
- Bump github.com/minio/minio-go/v7 from 7.0.97 to 7.0.98 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1585](https://github.com/mariadb-operator/mariadb-operator/pull/1585)
- Bump ghcr.io/devcontainers/features/docker-in-docker from 2.13.0 to 2.16.0 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1624](https://github.com/mariadb-operator/mariadb-operator/pull/1624)
- Bump ghcr.io/devcontainers/features/kubectl-helm-minikube from 1.2.2 to 1.3.1 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1623](https://github.com/mariadb-operator/mariadb-operator/pull/1623)
- Bump goreleaser/goreleaser-action from 6 to 7 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1620](https://github.com/mariadb-operator/mariadb-operator/pull/1620)
- Bump github.com/onsi/gomega from 1.38.3 to 1.39.0 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1581](https://github.com/mariadb-operator/mariadb-operator/pull/1581)
- Bump crate-ci/typos from 1.41.0 to 1.44.0 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1625](https://github.com/mariadb-operator/mariadb-operator/pull/1625)
- Bump github.com/onsi/ginkgo/v2 from 2.27.3 to 2.27.5 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1586](https://github.com/mariadb-operator/mariadb-operator/pull/1586)
- Bump github.com/cert-manager/cert-manager from 1.18.2 to 1.19.2 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1580](https://github.com/mariadb-operator/mariadb-operator/pull/1580)
- Bump github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring from 0.87.1 to 0.88.0 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1579](https://github.com/mariadb-operator/mariadb-operator/pull/1579)
- Disable service links in MariaDB and MaxScale pod specs by [@&#8203;usiegj00](https://github.com/usiegj00) in [#&#8203;1635](https://github.com/mariadb-operator/mariadb-operator/pull/1635)
- Fix finalizer for ExternalMariDB by [@&#8203;snaax](https://github.com/snaax) in [#&#8203;1606](https://github.com/mariadb-operator/mariadb-operator/pull/1606)
- test: Added int tests for sql resources with external mariadb deletion by [@&#8203;Michaelpalacce](https://github.com/Michaelpalacce) in [#&#8203;1649](https://github.com/mariadb-operator/mariadb-operator/pull/1649)
- Bump github.com/minio/minio-go/v7 from 7.0.98 to 7.0.99 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1648](https://github.com/mariadb-operator/mariadb-operator/pull/1648)
- Bump golang.org/x/sync from 0.19.0 to 0.20.0 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1645](https://github.com/mariadb-operator/mariadb-operator/pull/1645)
- Bump docker/build-push-action from 6 to 7 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1644](https://github.com/mariadb-operator/mariadb-operator/pull/1644)
- Bump docker/setup-qemu-action from 3 to 4 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1642](https://github.com/mariadb-operator/mariadb-operator/pull/1642)
- Bump github.com/go-chi/chi/v5 from 5.2.3 to 5.2.5 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1641](https://github.com/mariadb-operator/mariadb-operator/pull/1641)
- Bump docker/login-action from 3 to 4 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1646](https://github.com/mariadb-operator/mariadb-operator/pull/1646)
- Bump ghcr.io/devcontainers/features/docker-in-docker from 2.16.0 to 2.16.1 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1640](https://github.com/mariadb-operator/mariadb-operator/pull/1640)
- Bump docker/setup-buildx-action from 3 to 4 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1638](https://github.com/mariadb-operator/mariadb-operator/pull/1638)
- Bump github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring from 0.88.0 to 0.89.0 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1643](https://github.com/mariadb-operator/mariadb-operator/pull/1643)
- Bump golang from 1.25.7-alpine3.23 to 1.26.1-alpine3.23 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1639](https://github.com/mariadb-operator/mariadb-operator/pull/1639)
- feat: Latest controller-runtime. Webhook changes, New Events API by [@&#8203;Michaelpalacce](https://github.com/Michaelpalacce) in [#&#8203;1651](https://github.com/mariadb-operator/mariadb-operator/pull/1651)
- Support for ephemeral volumes in `MariaDB` by [@&#8203;mmontes11](https://github.com/mmontes11) in [#&#8203;1650](https://github.com/mariadb-operator/mariadb-operator/pull/1650)
- fix: accept compressed backup files in logical restore by [@&#8203;voron](https://github.com/voron) in [#&#8203;1655](https://github.com/mariadb-operator/mariadb-operator/pull/1655)
- Fix typo: syncrhonous -> synchronous by [@&#8203;sjmudd](https://github.com/sjmudd) in [#&#8203;1657](https://github.com/mariadb-operator/mariadb-operator/pull/1657)
- Release 26.03: `PointInTimeRecovery`, Azure Blob Storage & on-demand `PhysicalBackups` by [@&#8203;mmontes11](https://github.com/mmontes11) in [#&#8203;1517](https://github.com/mariadb-operator/mariadb-operator/pull/1517)

#### New Contributors

- [@&#8203;softho0n](https://github.com/softho0n) made their first contribution in [#&#8203;1575](https://github.com/mariadb-operator/mariadb-operator/pull/1575)
- [@&#8203;yangminglintw](https://github.com/yangminglintw) made their first contribution in [#&#8203;1589](https://github.com/mariadb-operator/mariadb-operator/pull/1589)
- [@&#8203;dmaes](https://github.com/dmaes) made their first contribution in [#&#8203;1614](https://github.com/mariadb-operator/mariadb-operator/pull/1614)
- [@&#8203;infocusmodereal](https://github.com/infocusmodereal) made their first contribution in [#&#8203;1631](https://github.com/mariadb-operator/mariadb-operator/pull/1631)
- [@&#8203;usiegj00](https://github.com/usiegj00) made their first contribution in [#&#8203;1635](https://github.com/mariadb-operator/mariadb-operator/pull/1635)
- [@&#8203;voron](https://github.com/voron) made their first contribution in [#&#8203;1655](https://github.com/mariadb-operator/mariadb-operator/pull/1655)
- [@&#8203;sjmudd](https://github.com/sjmudd) made their first contribution in [#&#8203;1657](https://github.com/mariadb-operator/mariadb-operator/pull/1657)

**Full Changelog**: <https://github.com/mariadb-operator/mariadb-operator/compare/25.10.4...26.3.0>

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My41OS4yIiwidXBkYXRlZEluVmVyIjoiNDMuNTkuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiaW1hZ2UiXX0=-->

Reviewed-on: https://gitea.alexlebens.dev/alexlebens/infrastructure/pulls/4704
Co-authored-by: Renovate Bot <renovate-bot@alexlebens.net>
Co-committed-by: Renovate Bot <renovate-bot@alexlebens.net>
2026-03-15 00:04:42 +00:00
15f4df3ec4 chore(deps): update helm release mariadb-cluster to v26 (#4705)
All checks were successful
render-manifests-push / render-manifests-push (push) Has been skipped
lint-test-helm / lint-helm (push) Successful in 11s
renovate / renovate (push) Successful in 2m31s
This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [mariadb-cluster](https://github.com/mariadb-operator/mariadb-operator) | major | `25.10.4` → `26.3.0` |

---

### Release Notes

<details>
<summary>mariadb-operator/mariadb-operator (mariadb-cluster)</summary>

### [`v26.3.0`](https://github.com/mariadb-operator/mariadb-operator/releases/tag/26.3.0)

[Compare Source](https://github.com/mariadb-operator/mariadb-operator/compare/mariadb-cluster-25.10.4...mariadb-cluster-26.3.0)

**`mariadb-operator` [26.03](https://github.com/mariadb-operator/mariadb-operator/releases/tag/26.3.0) is here!** 🦭

Welcome to another release of `mariadb-operator`! In this version, we have significantly enhanced our disaster recovery capabilities by adding support for **on-demand physical backups**, **Azure Blob Storage** and... (🥁)... **Point-In-Time-Recovery** .

Additionally, we've received a bunch of contributions by our amazing community during this release, including bug fixes and new features. We feel very grateful for your efforts and support, thank you! 🙇‍♂️ Refer to the PRs in the changelog below for further details.

If you're upgrading from previous versions, **do not miss the [UPGRADE GUIDE](https://github.com/mariadb-operator/mariadb-operator/blob/main/docs/releases/UPGRADE_26.3.0.md)** for a smooth transition.

#### Point-In-Time-Recovery

Point-in-time recovery (PITR) is a feature that allows you to restore a `MariaDB` instance to a specific point in time. For achieving this, it combines a full base backup and the binary logs that record all changes made to the database after the backup. This is something fully automated by operator, covering archival and restoration up to a specific time, ensuring business continuity and reduced RTO and RPO.

In order to configure PITR, you need to create a `PhysicalBackup` object to be used as full base backup. For example, you can configure a nightly backup:

```yaml
apiVersion: k8s.mariadb.com/v1alpha1
kind: PhysicalBackup
metadata:
  name: physicalbackup-daily
spec:
  mariaDbRef:
    name: mariadb-repl
  schedule:
    cron: "0 0 * * *"
    suspend: false
    immediate: true
  compression: bzip2
  maxRetention: 720h
  storage:
    s3:
      bucket: physicalbackups
      prefix: mariadb
      endpoint: minio.minio.svc.cluster.local:9000
      region: us-east-1
      accessKeyIdSecretKeyRef:
        name: minio
        key: access-key-id
      secretAccessKeySecretKeyRef:
        name: minio
        key: secret-access-key
      tls:
        enabled: true
        caSecretKeyRef:
          name: minio-ca
          key: ca.crt
```

Next step is configuring common aspects of both binary log archiving and point-in-time restoration by defining a `PointInTimeRecovery` object:

```yaml
apiVersion: k8s.mariadb.com/v1alpha1
kind: PointInTimeRecovery
metadata:
  name: pitr
spec:
  physicalBackupRef:
    name: physicalbackup-daily
  storage:
    s3:
      bucket: binlogs
      prefix: mariadb
      endpoint: minio.minio.svc.cluster.local:9000
      region: us-east-1
      accessKeyIdSecretKeyRef:
        name: minio
        key: access-key-id
      secretAccessKeySecretKeyRef:
        name: minio
        key: secret-access-key
      tls:
        enabled: true
        caSecretKeyRef:
          name: minio-ca
          key: ca.crt
  compression: gzip
  archiveTimeout: 1h
  strictMode: false
```

The new `PointInTimeRecovery` CR is just a configuration object that contains shared settings for both binary log archiving and point-in-time recovery. It has also a reference to a `PhysicalBackup` CR, used as full base backup.

In order to configure binary log archiving, you need to set a reference to the `PointInTimeRecovery` CR in the `MariaDB` object:

```yaml
apiVersion: k8s.mariadb.com/v1alpha1
kind: MariaDB
metadata:
  name: mariadb-repl
spec:
  pointInTimeRecoveryRef:
    name: pitr
```

This will enable the binary log archival in the sidecar agent, which will eventually report the last recoverable time via the `PointInTimeRecovery` status:

```bash
kubectl get pitr
NAME   PHYSICAL BACKUP        LAST RECOVERABLE TIME   STRICT MODE   AGE
pitr   physicalbackup-daily   2026-02-27T20:10:42Z    false         43h
```

In order to perform a point-in-time restoration, you can create a new `MariaDB` instance with a reference to the `PointInTimeRecovery` object in the `bootstrapFrom` field, along with the `targetRecoveryTime`, which should be before or at the last recoverable time:

```yaml
apiVersion: k8s.mariadb.com/v1alpha1
kind: MariaDB
metadata:
  name: mariadb-repl
spec:
  bootstrapFrom:
    pointInTimeRecoveryRef:
      name: pitr
    targetRecoveryTime: 2026-02-27T20:10:42Z
```

The restoration process will match the closest physical backup before or at the `targetRecoveryTime`, and then it will replay the archived binary logs from the backup GTID position up until the `targetRecoveryTime`.

Refer to the [PITR docs](https://github.com/mariadb-operator/mariadb-operator/blob/main/docs/pitr.md) for additional details.

#### Azure Blob Storage

So far, we have only supported S3-compatible storage as object storage for keeping the backups. We are now introducing native support for Azure Blob Storage in the `PhysicalBackup` and `PointInTimeRecovery` CRs. You can configure it under the `storage` field, similarly to S3:

```yaml
apiVersion: k8s.mariadb.com/v1alpha1
kind: PointInTimeRecovery
metadata:
  name: pitr
spec:
  storage:
    azureBlob:
      containerName: binlogs
      serviceURL: https://azurite.default.svc.cluster.local:10000/devstoreaccount1
      prefix: mariadb
      storageAccountName: devstoreaccount1
      storageAccountKey:
        name: azurite-key
        key: storageAccountKey
      tls:
        enabled: true
        caSecretKeyRef:
          name: azurite-certs
          key: cert.pem
```

```yaml
apiVersion: k8s.mariadb.com/v1alpha1
kind: PhysicalBackup
metadata:
  name: physicalbackup-daily
spec:
  storage:
    azureBlob:
      containerName: physicalbackup
      serviceURL: https://azurite.default.svc.cluster.local:10000/devstoreaccount1
      prefix: mariadb
      storageAccountName: devstoreaccount1
      storageAccountKey:
        name: azurite-key
        key: storageAccountKey
      tls:
        enabled: true
        caSecretKeyRef:
          name: azurite-certs
          key: cert.pem
```

Refer to the [physical backup storage](https://github.com/mariadb-operator/mariadb-operator/blob/main/docs/physical_backup.md#azure-blob-storage-credentials) docs for additional details.

It is important to note that we couldn't find the bandwidth to support it for `Backup` resource (logical backup) in this release, [contributions are welcomed](https://github.com/mariadb-operator/mariadb-operator/issues/1653)!

Kudos to our co-maintainer [@&#8203;Michaelpalacce](https://github.com/Michaelpalacce) for smoothly driving this feature end-to-end!

#### On-demand `PhysicalBackup`

We have introduced the ability to trigger on-demand physical backup manually. For doing so, you need to provide an identifier in the `schedule.onDemand` field of the `PhysicalBackup` resource:

```yaml
apiVersion: k8s.mariadb.com/v1alpha1
kind: PhysicalBackup
metadata:
  name: physicalbackup
spec:
  schedule:
    onDemand: "1"
```

Once scheduled, the operator tracks the identifier under the status subresource. If the identifier in the status differs from `schedule.onDemand`, the operator will trigger a new physical backup.

Refer to the [physical backup scheduling](https://github.com/mariadb-operator/mariadb-operator/blob/main/docs/physical_backup.md#scheduling) docs for additional details.

##### Behaviour change in `targetRecoveryTime`

To satisfy requirements of point-in-time recovery, we have unified the behaviour of the `bootstrapFrom.targetRecoveryTime` field in the `MariaDB` object: Logical and physical backup files whose timestamp is closest to `targetRecoveryTime`, **but not after**, will be matched.

Please take this into account when upgrading to this version.

##### Change in Helm `values.yaml`

`config` has been split into `repository` and `tag` to facilitate overriding the image registry (see [#&#8203;1632](https://github.com/mariadb-operator/mariadb-operator/pull/1632)). Please update your `values.yaml` from:

```yaml
config:
  mariadbImageName: docker-registry1.mariadb.com/library/mariadb
  maxscaleImage: docker-registry2.mariadb.com/mariadb/maxscale:23.08.5
  exporterImage: prom/mysqld-exporter:v0.15.1
  exporterMaxscaleImage: docker-registry2.mariadb.com/mariadb/maxscale-prometheus-exporter-ubi:v0.0.1
```

to the following format:

```yaml
config:
  mariadbImage:
    repository: docker-registry1.mariadb.com/library/mariadb
    tag: 11.8.5
  maxscaleImage:
    repository: docker-registry2.mariadb.com/mariadb/maxscale
    tag: 23.08.5
  exporterImage:
    repository: prom/mysqld-exporter
    tag: v0.15.1
  exporterMaxscaleImage:
    repository: docker-registry2.mariadb.com/mariadb/maxscale-prometheus-exporter-ubi
    tag: v0.0.1
```

##### Updated dependencies

| Platform/Component | Version |
| ------------------ | ------- |
| Kubernetes         | 1.35    |
| Go                 | 1.26.1  |
| controller-runtime | 0.23.3  |

#### Updated roadmap

The next feature to be supported is the new multi-cluster topology. Stay tuned!

- [x] ~~[Point In Time Recovery (PITR)](https://github.com/mariadb-operator/mariadb-operator/issues/507)~~
- [ ] [Multi-cluster topology](https://github.com/mariadb-operator/mariadb-operator/issues/1543)

***

#### Community

Contributions of any kind are always welcome: adding yourself to the [list of adopters](https://github.com/mariadb-operator/mariadb-operator/blob/main/ADOPTERS.md), reporting issues, submitting pull requests, or simply starring the project! 🌟

#### Enterprise

For enterprise users, see the **[MariaDB Enterprise Operator](https://mariadb.com/products/enterprise/kubernetes-operator/)**, a commercially supported Kubernetes operator from MariaDB with additional enterprise-grade features.

#### What's Changed

- feat: Use primary Service by default for HA mariaDB connections by [@&#8203;softho0n](https://github.com/softho0n) in [#&#8203;1575](https://github.com/mariadb-operator/mariadb-operator/pull/1575)
- feat: add loadBalancerClass field to ServiceTemplate by [@&#8203;yangminglintw](https://github.com/yangminglintw) in [#&#8203;1589](https://github.com/mariadb-operator/mariadb-operator/pull/1589)
- fix: use standard compression extensions and add magic bytes validation by [@&#8203;yangminglintw](https://github.com/yangminglintw) in [#&#8203;1588](https://github.com/mariadb-operator/mariadb-operator/pull/1588)
- Make volumes and volumeMounts mutable by [@&#8203;hedgieinsocks](https://github.com/hedgieinsocks) in [#&#8203;1601](https://github.com/mariadb-operator/mariadb-operator/pull/1601)
- chore: Bump to latest go by [@&#8203;Michaelpalacce](https://github.com/Michaelpalacce) in [#&#8203;1630](https://github.com/mariadb-operator/mariadb-operator/pull/1630)
- make imagePullSecrets mutable by [@&#8203;dmaes](https://github.com/dmaes) in [#&#8203;1614](https://github.com/mariadb-operator/mariadb-operator/pull/1614)
- split config images in repository and tag by [@&#8203;dmaes](https://github.com/dmaes) in [#&#8203;1632](https://github.com/mariadb-operator/mariadb-operator/pull/1632)
- Galera recovery: disable bootstrap on other pods before bootstrapping by [@&#8203;infocusmodereal](https://github.com/infocusmodereal) in [#&#8203;1631](https://github.com/mariadb-operator/mariadb-operator/pull/1631)
- Bump github.com/minio/minio-go/v7 from 7.0.97 to 7.0.98 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1585](https://github.com/mariadb-operator/mariadb-operator/pull/1585)
- Bump ghcr.io/devcontainers/features/docker-in-docker from 2.13.0 to 2.16.0 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1624](https://github.com/mariadb-operator/mariadb-operator/pull/1624)
- Bump ghcr.io/devcontainers/features/kubectl-helm-minikube from 1.2.2 to 1.3.1 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1623](https://github.com/mariadb-operator/mariadb-operator/pull/1623)
- Bump goreleaser/goreleaser-action from 6 to 7 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1620](https://github.com/mariadb-operator/mariadb-operator/pull/1620)
- Bump github.com/onsi/gomega from 1.38.3 to 1.39.0 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1581](https://github.com/mariadb-operator/mariadb-operator/pull/1581)
- Bump crate-ci/typos from 1.41.0 to 1.44.0 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1625](https://github.com/mariadb-operator/mariadb-operator/pull/1625)
- Bump github.com/onsi/ginkgo/v2 from 2.27.3 to 2.27.5 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1586](https://github.com/mariadb-operator/mariadb-operator/pull/1586)
- Bump github.com/cert-manager/cert-manager from 1.18.2 to 1.19.2 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1580](https://github.com/mariadb-operator/mariadb-operator/pull/1580)
- Bump github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring from 0.87.1 to 0.88.0 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1579](https://github.com/mariadb-operator/mariadb-operator/pull/1579)
- Disable service links in MariaDB and MaxScale pod specs by [@&#8203;usiegj00](https://github.com/usiegj00) in [#&#8203;1635](https://github.com/mariadb-operator/mariadb-operator/pull/1635)
- Fix finalizer for ExternalMariDB by [@&#8203;snaax](https://github.com/snaax) in [#&#8203;1606](https://github.com/mariadb-operator/mariadb-operator/pull/1606)
- test: Added int tests for sql resources with external mariadb deletion by [@&#8203;Michaelpalacce](https://github.com/Michaelpalacce) in [#&#8203;1649](https://github.com/mariadb-operator/mariadb-operator/pull/1649)
- Bump github.com/minio/minio-go/v7 from 7.0.98 to 7.0.99 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1648](https://github.com/mariadb-operator/mariadb-operator/pull/1648)
- Bump golang.org/x/sync from 0.19.0 to 0.20.0 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1645](https://github.com/mariadb-operator/mariadb-operator/pull/1645)
- Bump docker/build-push-action from 6 to 7 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1644](https://github.com/mariadb-operator/mariadb-operator/pull/1644)
- Bump docker/setup-qemu-action from 3 to 4 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1642](https://github.com/mariadb-operator/mariadb-operator/pull/1642)
- Bump github.com/go-chi/chi/v5 from 5.2.3 to 5.2.5 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1641](https://github.com/mariadb-operator/mariadb-operator/pull/1641)
- Bump docker/login-action from 3 to 4 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1646](https://github.com/mariadb-operator/mariadb-operator/pull/1646)
- Bump ghcr.io/devcontainers/features/docker-in-docker from 2.16.0 to 2.16.1 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1640](https://github.com/mariadb-operator/mariadb-operator/pull/1640)
- Bump docker/setup-buildx-action from 3 to 4 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1638](https://github.com/mariadb-operator/mariadb-operator/pull/1638)
- Bump github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring from 0.88.0 to 0.89.0 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1643](https://github.com/mariadb-operator/mariadb-operator/pull/1643)
- Bump golang from 1.25.7-alpine3.23 to 1.26.1-alpine3.23 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1639](https://github.com/mariadb-operator/mariadb-operator/pull/1639)
- feat: Latest controller-runtime. Webhook changes, New Events API by [@&#8203;Michaelpalacce](https://github.com/Michaelpalacce) in [#&#8203;1651](https://github.com/mariadb-operator/mariadb-operator/pull/1651)
- Support for ephemeral volumes in `MariaDB` by [@&#8203;mmontes11](https://github.com/mmontes11) in [#&#8203;1650](https://github.com/mariadb-operator/mariadb-operator/pull/1650)
- fix: accept compressed backup files in logical restore by [@&#8203;voron](https://github.com/voron) in [#&#8203;1655](https://github.com/mariadb-operator/mariadb-operator/pull/1655)
- Fix typo: syncrhonous -> synchronous by [@&#8203;sjmudd](https://github.com/sjmudd) in [#&#8203;1657](https://github.com/mariadb-operator/mariadb-operator/pull/1657)
- Release 26.03: `PointInTimeRecovery`, Azure Blob Storage & on-demand `PhysicalBackups` by [@&#8203;mmontes11](https://github.com/mmontes11) in [#&#8203;1517](https://github.com/mariadb-operator/mariadb-operator/pull/1517)

#### New Contributors

- [@&#8203;softho0n](https://github.com/softho0n) made their first contribution in [#&#8203;1575](https://github.com/mariadb-operator/mariadb-operator/pull/1575)
- [@&#8203;yangminglintw](https://github.com/yangminglintw) made their first contribution in [#&#8203;1589](https://github.com/mariadb-operator/mariadb-operator/pull/1589)
- [@&#8203;dmaes](https://github.com/dmaes) made their first contribution in [#&#8203;1614](https://github.com/mariadb-operator/mariadb-operator/pull/1614)
- [@&#8203;infocusmodereal](https://github.com/infocusmodereal) made their first contribution in [#&#8203;1631](https://github.com/mariadb-operator/mariadb-operator/pull/1631)
- [@&#8203;usiegj00](https://github.com/usiegj00) made their first contribution in [#&#8203;1635](https://github.com/mariadb-operator/mariadb-operator/pull/1635)
- [@&#8203;voron](https://github.com/voron) made their first contribution in [#&#8203;1655](https://github.com/mariadb-operator/mariadb-operator/pull/1655)
- [@&#8203;sjmudd](https://github.com/sjmudd) made their first contribution in [#&#8203;1657](https://github.com/mariadb-operator/mariadb-operator/pull/1657)

**Full Changelog**: <https://github.com/mariadb-operator/mariadb-operator/compare/25.10.4...26.3.0>

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My41OS4yIiwidXBkYXRlZEluVmVyIjoiNDMuNTkuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiY2hhcnQiXX0=-->

Reviewed-on: https://gitea.alexlebens.dev/alexlebens/infrastructure/pulls/4705
Co-authored-by: Renovate Bot <renovate-bot@alexlebens.net>
Co-committed-by: Renovate Bot <renovate-bot@alexlebens.net>
2026-03-14 23:58:42 +00:00
215f7edc86 chore(deps): update helm release mariadb-operator to v26 (#4706)
All checks were successful
render-manifests-push / render-manifests-push (push) Has been skipped
lint-test-helm / lint-helm (push) Successful in 12s
renovate / renovate (push) Successful in 3m2s
This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [mariadb-operator](https://github.com/mariadb-operator/mariadb-operator) | major | `25.10.4` → `26.3.0` |

---

### Release Notes

<details>
<summary>mariadb-operator/mariadb-operator (mariadb-operator)</summary>

### [`v26.3.0`](https://github.com/mariadb-operator/mariadb-operator/releases/tag/26.3.0)

[Compare Source](https://github.com/mariadb-operator/mariadb-operator/compare/mariadb-operator-25.10.4...mariadb-operator-26.3.0)

**`mariadb-operator` [26.03](https://github.com/mariadb-operator/mariadb-operator/releases/tag/26.3.0) is here!** 🦭

Welcome to another release of `mariadb-operator`! In this version, we have significantly enhanced our disaster recovery capabilities by adding support for **on-demand physical backups**, **Azure Blob Storage** and... (🥁)... **Point-In-Time-Recovery** .

Additionally, we've received a bunch of contributions by our amazing community during this release, including bug fixes and new features. We feel very grateful for your efforts and support, thank you! 🙇‍♂️ Refer to the PRs in the changelog below for further details.

If you're upgrading from previous versions, **do not miss the [UPGRADE GUIDE](https://github.com/mariadb-operator/mariadb-operator/blob/main/docs/releases/UPGRADE_26.3.0.md)** for a smooth transition.

#### Point-In-Time-Recovery

Point-in-time recovery (PITR) is a feature that allows you to restore a `MariaDB` instance to a specific point in time. For achieving this, it combines a full base backup and the binary logs that record all changes made to the database after the backup. This is something fully automated by operator, covering archival and restoration up to a specific time, ensuring business continuity and reduced RTO and RPO.

In order to configure PITR, you need to create a `PhysicalBackup` object to be used as full base backup. For example, you can configure a nightly backup:

```yaml
apiVersion: k8s.mariadb.com/v1alpha1
kind: PhysicalBackup
metadata:
  name: physicalbackup-daily
spec:
  mariaDbRef:
    name: mariadb-repl
  schedule:
    cron: "0 0 * * *"
    suspend: false
    immediate: true
  compression: bzip2
  maxRetention: 720h
  storage:
    s3:
      bucket: physicalbackups
      prefix: mariadb
      endpoint: minio.minio.svc.cluster.local:9000
      region: us-east-1
      accessKeyIdSecretKeyRef:
        name: minio
        key: access-key-id
      secretAccessKeySecretKeyRef:
        name: minio
        key: secret-access-key
      tls:
        enabled: true
        caSecretKeyRef:
          name: minio-ca
          key: ca.crt
```

Next step is configuring common aspects of both binary log archiving and point-in-time restoration by defining a `PointInTimeRecovery` object:

```yaml
apiVersion: k8s.mariadb.com/v1alpha1
kind: PointInTimeRecovery
metadata:
  name: pitr
spec:
  physicalBackupRef:
    name: physicalbackup-daily
  storage:
    s3:
      bucket: binlogs
      prefix: mariadb
      endpoint: minio.minio.svc.cluster.local:9000
      region: us-east-1
      accessKeyIdSecretKeyRef:
        name: minio
        key: access-key-id
      secretAccessKeySecretKeyRef:
        name: minio
        key: secret-access-key
      tls:
        enabled: true
        caSecretKeyRef:
          name: minio-ca
          key: ca.crt
  compression: gzip
  archiveTimeout: 1h
  strictMode: false
```

The new `PointInTimeRecovery` CR is just a configuration object that contains shared settings for both binary log archiving and point-in-time recovery. It has also a reference to a `PhysicalBackup` CR, used as full base backup.

In order to configure binary log archiving, you need to set a reference to the `PointInTimeRecovery` CR in the `MariaDB` object:

```yaml
apiVersion: k8s.mariadb.com/v1alpha1
kind: MariaDB
metadata:
  name: mariadb-repl
spec:
  pointInTimeRecoveryRef:
    name: pitr
```

This will enable the binary log archival in the sidecar agent, which will eventually report the last recoverable time via the `PointInTimeRecovery` status:

```bash
kubectl get pitr
NAME   PHYSICAL BACKUP        LAST RECOVERABLE TIME   STRICT MODE   AGE
pitr   physicalbackup-daily   2026-02-27T20:10:42Z    false         43h
```

In order to perform a point-in-time restoration, you can create a new `MariaDB` instance with a reference to the `PointInTimeRecovery` object in the `bootstrapFrom` field, along with the `targetRecoveryTime`, which should be before or at the last recoverable time:

```yaml
apiVersion: k8s.mariadb.com/v1alpha1
kind: MariaDB
metadata:
  name: mariadb-repl
spec:
  bootstrapFrom:
    pointInTimeRecoveryRef:
      name: pitr
    targetRecoveryTime: 2026-02-27T20:10:42Z
```

The restoration process will match the closest physical backup before or at the `targetRecoveryTime`, and then it will replay the archived binary logs from the backup GTID position up until the `targetRecoveryTime`.

Refer to the [PITR docs](https://github.com/mariadb-operator/mariadb-operator/blob/main/docs/pitr.md) for additional details.

#### Azure Blob Storage

So far, we have only supported S3-compatible storage as object storage for keeping the backups. We are now introducing native support for Azure Blob Storage in the `PhysicalBackup` and `PointInTimeRecovery` CRs. You can configure it under the `storage` field, similarly to S3:

```yaml
apiVersion: k8s.mariadb.com/v1alpha1
kind: PointInTimeRecovery
metadata:
  name: pitr
spec:
  storage:
    azureBlob:
      containerName: binlogs
      serviceURL: https://azurite.default.svc.cluster.local:10000/devstoreaccount1
      prefix: mariadb
      storageAccountName: devstoreaccount1
      storageAccountKey:
        name: azurite-key
        key: storageAccountKey
      tls:
        enabled: true
        caSecretKeyRef:
          name: azurite-certs
          key: cert.pem
```

```yaml
apiVersion: k8s.mariadb.com/v1alpha1
kind: PhysicalBackup
metadata:
  name: physicalbackup-daily
spec:
  storage:
    azureBlob:
      containerName: physicalbackup
      serviceURL: https://azurite.default.svc.cluster.local:10000/devstoreaccount1
      prefix: mariadb
      storageAccountName: devstoreaccount1
      storageAccountKey:
        name: azurite-key
        key: storageAccountKey
      tls:
        enabled: true
        caSecretKeyRef:
          name: azurite-certs
          key: cert.pem
```

Refer to the [physical backup storage](https://github.com/mariadb-operator/mariadb-operator/blob/main/docs/physical_backup.md#azure-blob-storage-credentials) docs for additional details.

It is important to note that we couldn't find the bandwidth to support it for `Backup` resource (logical backup) in this release, [contributions are welcomed](https://github.com/mariadb-operator/mariadb-operator/issues/1653)!

Kudos to our co-maintainer [@&#8203;Michaelpalacce](https://github.com/Michaelpalacce) for smoothly driving this feature end-to-end!

#### On-demand `PhysicalBackup`

We have introduced the ability to trigger on-demand physical backup manually. For doing so, you need to provide an identifier in the `schedule.onDemand` field of the `PhysicalBackup` resource:

```yaml
apiVersion: k8s.mariadb.com/v1alpha1
kind: PhysicalBackup
metadata:
  name: physicalbackup
spec:
  schedule:
    onDemand: "1"
```

Once scheduled, the operator tracks the identifier under the status subresource. If the identifier in the status differs from `schedule.onDemand`, the operator will trigger a new physical backup.

Refer to the [physical backup scheduling](https://github.com/mariadb-operator/mariadb-operator/blob/main/docs/physical_backup.md#scheduling) docs for additional details.

##### Behaviour change in `targetRecoveryTime`

To satisfy requirements of point-in-time recovery, we have unified the behaviour of the `bootstrapFrom.targetRecoveryTime` field in the `MariaDB` object: Logical and physical backup files whose timestamp is closest to `targetRecoveryTime`, **but not after**, will be matched.

Please take this into account when upgrading to this version.

##### Change in Helm `values.yaml`

`config` has been split into `repository` and `tag` to facilitate overriding the image registry (see [#&#8203;1632](https://github.com/mariadb-operator/mariadb-operator/pull/1632)). Please update your `values.yaml` from:

```yaml
config:
  mariadbImageName: docker-registry1.mariadb.com/library/mariadb
  maxscaleImage: docker-registry2.mariadb.com/mariadb/maxscale:23.08.5
  exporterImage: prom/mysqld-exporter:v0.15.1
  exporterMaxscaleImage: docker-registry2.mariadb.com/mariadb/maxscale-prometheus-exporter-ubi:v0.0.1
```

to the following format:

```yaml
config:
  mariadbImage:
    repository: docker-registry1.mariadb.com/library/mariadb
    tag: 11.8.5
  maxscaleImage:
    repository: docker-registry2.mariadb.com/mariadb/maxscale
    tag: 23.08.5
  exporterImage:
    repository: prom/mysqld-exporter
    tag: v0.15.1
  exporterMaxscaleImage:
    repository: docker-registry2.mariadb.com/mariadb/maxscale-prometheus-exporter-ubi
    tag: v0.0.1
```

##### Updated dependencies

| Platform/Component | Version |
| ------------------ | ------- |
| Kubernetes         | 1.35    |
| Go                 | 1.26.1  |
| controller-runtime | 0.23.3  |

#### Updated roadmap

The next feature to be supported is the new multi-cluster topology. Stay tuned!

- [x] ~~[Point In Time Recovery (PITR)](https://github.com/mariadb-operator/mariadb-operator/issues/507)~~
- [ ] [Multi-cluster topology](https://github.com/mariadb-operator/mariadb-operator/issues/1543)

***

#### Community

Contributions of any kind are always welcome: adding yourself to the [list of adopters](https://github.com/mariadb-operator/mariadb-operator/blob/main/ADOPTERS.md), reporting issues, submitting pull requests, or simply starring the project! 🌟

#### Enterprise

For enterprise users, see the **[MariaDB Enterprise Operator](https://mariadb.com/products/enterprise/kubernetes-operator/)**, a commercially supported Kubernetes operator from MariaDB with additional enterprise-grade features.

#### What's Changed

- feat: Use primary Service by default for HA mariaDB connections by [@&#8203;softho0n](https://github.com/softho0n) in [#&#8203;1575](https://github.com/mariadb-operator/mariadb-operator/pull/1575)
- feat: add loadBalancerClass field to ServiceTemplate by [@&#8203;yangminglintw](https://github.com/yangminglintw) in [#&#8203;1589](https://github.com/mariadb-operator/mariadb-operator/pull/1589)
- fix: use standard compression extensions and add magic bytes validation by [@&#8203;yangminglintw](https://github.com/yangminglintw) in [#&#8203;1588](https://github.com/mariadb-operator/mariadb-operator/pull/1588)
- Make volumes and volumeMounts mutable by [@&#8203;hedgieinsocks](https://github.com/hedgieinsocks) in [#&#8203;1601](https://github.com/mariadb-operator/mariadb-operator/pull/1601)
- chore: Bump to latest go by [@&#8203;Michaelpalacce](https://github.com/Michaelpalacce) in [#&#8203;1630](https://github.com/mariadb-operator/mariadb-operator/pull/1630)
- make imagePullSecrets mutable by [@&#8203;dmaes](https://github.com/dmaes) in [#&#8203;1614](https://github.com/mariadb-operator/mariadb-operator/pull/1614)
- split config images in repository and tag by [@&#8203;dmaes](https://github.com/dmaes) in [#&#8203;1632](https://github.com/mariadb-operator/mariadb-operator/pull/1632)
- Galera recovery: disable bootstrap on other pods before bootstrapping by [@&#8203;infocusmodereal](https://github.com/infocusmodereal) in [#&#8203;1631](https://github.com/mariadb-operator/mariadb-operator/pull/1631)
- Bump github.com/minio/minio-go/v7 from 7.0.97 to 7.0.98 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1585](https://github.com/mariadb-operator/mariadb-operator/pull/1585)
- Bump ghcr.io/devcontainers/features/docker-in-docker from 2.13.0 to 2.16.0 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1624](https://github.com/mariadb-operator/mariadb-operator/pull/1624)
- Bump ghcr.io/devcontainers/features/kubectl-helm-minikube from 1.2.2 to 1.3.1 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1623](https://github.com/mariadb-operator/mariadb-operator/pull/1623)
- Bump goreleaser/goreleaser-action from 6 to 7 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1620](https://github.com/mariadb-operator/mariadb-operator/pull/1620)
- Bump github.com/onsi/gomega from 1.38.3 to 1.39.0 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1581](https://github.com/mariadb-operator/mariadb-operator/pull/1581)
- Bump crate-ci/typos from 1.41.0 to 1.44.0 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1625](https://github.com/mariadb-operator/mariadb-operator/pull/1625)
- Bump github.com/onsi/ginkgo/v2 from 2.27.3 to 2.27.5 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1586](https://github.com/mariadb-operator/mariadb-operator/pull/1586)
- Bump github.com/cert-manager/cert-manager from 1.18.2 to 1.19.2 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1580](https://github.com/mariadb-operator/mariadb-operator/pull/1580)
- Bump github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring from 0.87.1 to 0.88.0 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1579](https://github.com/mariadb-operator/mariadb-operator/pull/1579)
- Disable service links in MariaDB and MaxScale pod specs by [@&#8203;usiegj00](https://github.com/usiegj00) in [#&#8203;1635](https://github.com/mariadb-operator/mariadb-operator/pull/1635)
- Fix finalizer for ExternalMariDB by [@&#8203;snaax](https://github.com/snaax) in [#&#8203;1606](https://github.com/mariadb-operator/mariadb-operator/pull/1606)
- test: Added int tests for sql resources with external mariadb deletion by [@&#8203;Michaelpalacce](https://github.com/Michaelpalacce) in [#&#8203;1649](https://github.com/mariadb-operator/mariadb-operator/pull/1649)
- Bump github.com/minio/minio-go/v7 from 7.0.98 to 7.0.99 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1648](https://github.com/mariadb-operator/mariadb-operator/pull/1648)
- Bump golang.org/x/sync from 0.19.0 to 0.20.0 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1645](https://github.com/mariadb-operator/mariadb-operator/pull/1645)
- Bump docker/build-push-action from 6 to 7 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1644](https://github.com/mariadb-operator/mariadb-operator/pull/1644)
- Bump docker/setup-qemu-action from 3 to 4 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1642](https://github.com/mariadb-operator/mariadb-operator/pull/1642)
- Bump github.com/go-chi/chi/v5 from 5.2.3 to 5.2.5 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1641](https://github.com/mariadb-operator/mariadb-operator/pull/1641)
- Bump docker/login-action from 3 to 4 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1646](https://github.com/mariadb-operator/mariadb-operator/pull/1646)
- Bump ghcr.io/devcontainers/features/docker-in-docker from 2.16.0 to 2.16.1 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1640](https://github.com/mariadb-operator/mariadb-operator/pull/1640)
- Bump docker/setup-buildx-action from 3 to 4 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1638](https://github.com/mariadb-operator/mariadb-operator/pull/1638)
- Bump github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring from 0.88.0 to 0.89.0 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1643](https://github.com/mariadb-operator/mariadb-operator/pull/1643)
- Bump golang from 1.25.7-alpine3.23 to 1.26.1-alpine3.23 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1639](https://github.com/mariadb-operator/mariadb-operator/pull/1639)
- feat: Latest controller-runtime. Webhook changes, New Events API by [@&#8203;Michaelpalacce](https://github.com/Michaelpalacce) in [#&#8203;1651](https://github.com/mariadb-operator/mariadb-operator/pull/1651)
- Support for ephemeral volumes in `MariaDB` by [@&#8203;mmontes11](https://github.com/mmontes11) in [#&#8203;1650](https://github.com/mariadb-operator/mariadb-operator/pull/1650)
- fix: accept compressed backup files in logical restore by [@&#8203;voron](https://github.com/voron) in [#&#8203;1655](https://github.com/mariadb-operator/mariadb-operator/pull/1655)
- Fix typo: syncrhonous -> synchronous by [@&#8203;sjmudd](https://github.com/sjmudd) in [#&#8203;1657](https://github.com/mariadb-operator/mariadb-operator/pull/1657)
- Release 26.03: `PointInTimeRecovery`, Azure Blob Storage & on-demand `PhysicalBackups` by [@&#8203;mmontes11](https://github.com/mmontes11) in [#&#8203;1517](https://github.com/mariadb-operator/mariadb-operator/pull/1517)

#### New Contributors

- [@&#8203;softho0n](https://github.com/softho0n) made their first contribution in [#&#8203;1575](https://github.com/mariadb-operator/mariadb-operator/pull/1575)
- [@&#8203;yangminglintw](https://github.com/yangminglintw) made their first contribution in [#&#8203;1589](https://github.com/mariadb-operator/mariadb-operator/pull/1589)
- [@&#8203;dmaes](https://github.com/dmaes) made their first contribution in [#&#8203;1614](https://github.com/mariadb-operator/mariadb-operator/pull/1614)
- [@&#8203;infocusmodereal](https://github.com/infocusmodereal) made their first contribution in [#&#8203;1631](https://github.com/mariadb-operator/mariadb-operator/pull/1631)
- [@&#8203;usiegj00](https://github.com/usiegj00) made their first contribution in [#&#8203;1635](https://github.com/mariadb-operator/mariadb-operator/pull/1635)
- [@&#8203;voron](https://github.com/voron) made their first contribution in [#&#8203;1655](https://github.com/mariadb-operator/mariadb-operator/pull/1655)
- [@&#8203;sjmudd](https://github.com/sjmudd) made their first contribution in [#&#8203;1657](https://github.com/mariadb-operator/mariadb-operator/pull/1657)

**Full Changelog**: <https://github.com/mariadb-operator/mariadb-operator/compare/25.10.4...26.3.0>

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My41OS4yIiwidXBkYXRlZEluVmVyIjoiNDMuNTkuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiY2hhcnQiXX0=-->

Reviewed-on: https://gitea.alexlebens.dev/alexlebens/infrastructure/pulls/4706
Co-authored-by: Renovate Bot <renovate-bot@alexlebens.net>
Co-committed-by: Renovate Bot <renovate-bot@alexlebens.net>
2026-03-14 23:54:24 +00:00
510f059037 chore(deps): update ghcr.io/haveagitgat/tdarr_node docker tag to v2.63.01 (#4737)
Some checks failed
render-manifests-push / render-manifests-push (push) Has been skipped
lint-test-helm / lint-helm (push) Successful in 11s
renovate / renovate (push) Has been cancelled
This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [ghcr.io/haveagitgat/tdarr_node](https://github.com/HaveAGitGat/tdarr_express_be) | minor | `2.62.01` → `2.63.01` |

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My41OS4yIiwidXBkYXRlZEluVmVyIjoiNDMuNTkuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiaW1hZ2UiXX0=-->

Reviewed-on: #4737
Co-authored-by: Renovate Bot <renovate-bot@alexlebens.net>
Co-committed-by: Renovate Bot <renovate-bot@alexlebens.net>
2026-03-14 23:51:38 +00:00
89 changed files with 1572 additions and 596 deletions

View File

@@ -14,7 +14,7 @@ on:
- 'hosts/**' - 'hosts/**'
env: env:
BASE_BRANCH: "origin/${{ gitea.base_ref }}" BASE_BRANCH: "origin/${{ github.base_ref }}"
jobs: jobs:
lint-docker-compose: lint-docker-compose:
@@ -36,19 +36,20 @@ jobs:
id: branch-exists id: branch-exists
if: github.event_name == 'push' || steps.check-branch-exists.outputs.exists == 'true' && github.event_name == 'pull_request' if: github.event_name == 'push' || steps.check-branch-exists.outputs.exists == 'true' && github.event_name == 'pull_request'
run: | run: |
if [ ${{ github.event_name == 'push' }} ]; then if [ "${{ github.event_name }}" == "push" ]; then
echo ">> Action is from a push event, will continue with linting" echo ">> Action is from a push event, will continue with linting"
else else
echo ">> Branch ${{ gitea.base_ref }} exists, will continue with linting" echo ">> Branch ${{ github.base_ref }} exists, will continue with linting"
fi fi
echo ""
echo "----" echo "----"
echo "exists=true" >> $GITEA_OUTPUT echo "exists=true" >> $GITHUB_OUTPUT
- name: Set up Node.js - name: Set Up Node.js
if: steps.branch-exists.outputs.exists == 'true' if: steps.branch-exists.outputs.exists == 'true'
uses: actions/setup-node@v6 uses: actions/setup-node@v6
with: with:
@@ -58,58 +59,48 @@ jobs:
id: check-dir-changes id: check-dir-changes
if: steps.branch-exists.outputs.exists == 'true' if: steps.branch-exists.outputs.exists == 'true'
run: | run: |
CHANGED_COMPOSE=()
echo ">> Target branch for diff is: ${BASE_BRANCH}" echo ">> Target branch for diff is: ${BASE_BRANCH}"
if [ "${{ github.event_name }}" == "pull_request" ]; then if [ "${{ github.event_name }}" == "pull_request" ]; then
DIFF_TARGET="${BASE_BRANCH}"
echo "" echo ""
echo ">> Checking for changes in a pull request ..." echo ">> Checking for changes in a pull request ..."
GIT_DIFF=$(git diff --name-only "${BASE_BRANCH}" | xargs -I {} dirname {} | sort -u)
else else
DIFF_TARGET="${{ github.event.before }}..HEAD"
echo "" echo ""
echo ">> Checking for changes from a push ..." echo ">> Checking for changes from a push ..."
GIT_DIFF=$(git diff --name-only ${{ gitea.event.before }}..HEAD | xargs -I {} dirname {} | sort -u)
fi
if [ -n "${GIT_DIFF}" ]; then
echo ""
echo ">> Changes detected:"
echo "$GIT_DIFF"
for path in $GIT_DIFF; do
if echo "$path" | grep -q -E "hosts/[^/]+/[^/]+"; then
echo ""
echo ">> Adding path: $path"
CHANGED_COMPOSE+=$(echo "$path")
CHANGED_COMPOSE+=$(echo " ")
fi
done
else
echo ""
echo ">> No changes detected"
fi fi
CHANGED_COMPOSE=$(git diff --name-only "${DIFF_TARGET}" | grep -E "^hosts/[^/]+/[^/]+/" | cut -d/ -f1,2,3 | sort -u || true)
if [ -n "${CHANGED_COMPOSE}" ]; then if [ -n "${CHANGED_COMPOSE}" ]; then
echo "" echo ""
echo ">> Compose to Lint:" echo ">> Compose to Lint:"
echo "$(echo "${CHANGED_COMPOSE}" | sort -u)" echo ""
echo "${CHANGED_COMPOSE}"
CHANGED_COMPOSE_CSV=$(echo "$CHANGED_COMPOSE" | paste -sd ',' -)
echo ""
echo "----" echo "----"
echo "changes-detected=true" >> $GITEA_OUTPUT echo "changes-detected=true" >> $GITHUB_OUTPUT
echo "compose-dir<<EOF" >> $GITEA_OUTPUT echo "compose-dir-csv=${CHANGED_COMPOSE_CSV}" >> $GITHUB_OUTPUT
echo "$(echo "${CHANGED_COMPOSE}" | sort -u)" >> $GITEA_OUTPUT echo "compose-dir<<EOF" >> $GITHUB_OUTPUT
echo "EOF" >> $GITEA_OUTPUT echo "${CHANGED_COMPOSE}" >> $GITHUB_OUTPUT
echo "EOF" >> $GITHUB_OUTPUT
else else
echo "" echo ""
echo ">> Did not find any docker compose files to lint" echo ">> Did not find any docker compose files to lint"
echo ""
echo "----" echo "----"
echo "changes-detected=false" >> $GITEA_OUTPUT echo "changes-detected=false" >> $GITHUB_OUTPUT
fi fi
- name: Lint Docker Compose - name: Lint Docker Compose
@@ -117,25 +108,27 @@ jobs:
env: env:
CHANGED_COMPOSE: ${{ steps.check-dir-changes.outputs.compose-dir }} CHANGED_COMPOSE: ${{ steps.check-dir-changes.outputs.compose-dir }}
run: | run: |
echo ">> Running dclint on changed compose files:" echo ">> Running dclint on changed compose files ..."
echo "$CHANGED_COMPOSE"
for COMPOSE in $CHANGED_COMPOSE; do
echo ">> Linting ${COMPOSE} ..."
npx dclint ${COMPOSE}
for compose in $CHANGED_COMPOSE; do
echo ">> Linting $compose ..."
npx dclint $compose
done done
echo ""
echo "----"
- name: ntfy Failed - name: ntfy Failed
uses: niniyas/ntfy-action@master uses: niniyas/ntfy-action@master
if: failure() if: failure()
with: with:
url: '${{ secrets.NTFY_URL }}' url: '${{ secrets.NTFY_URL }}'
topic: '${{ secrets.NTFY_TOPIC }}' topic: '${{ secrets.NTFY_TOPIC }}'
title: 'Test Failure - Infrastructure' title: 'Docker Compose Test Failure'
priority: 3 priority: 3
headers: '{"Authorization": "Bearer ${{ secrets.NTFY_CRED }}"}' headers: '{"Authorization": "Bearer ${{ secrets.NTFY_CRED }}"}'
tags: action,failed tags: action,failed
details: 'Docker linting on Pull Request for Infrastructure has failed!' details: "Docker linting for compose dirs: ${{ steps.check-dir-changes.outputs.compose-dir-csv }}"
icon: 'https://cdn.jsdelivr.net/gh/selfhst/icons/png/gitea.png' icon: 'https://cdn.jsdelivr.net/gh/selfhst/icons/png/gitea.png'
actions: '[{"action": "view", "label": "Open Gitea", "url": "https://gitea.alexlebens.dev/alexlebens/infrastructure/actions?workflow=lint-test-docker-pull.yaml", "clear": true}]' actions: '[{"action": "view", "label": "View Logs", "url": "${{ vars.USER_URL }}/${{ github.repository }}/actions/runs/${{ github.run_id }}", "clear": true}]'
image: true

View File

@@ -15,11 +15,17 @@ on:
env: env:
CLUSTER: cl01tl CLUSTER: cl01tl
BASE_BRANCH: "origin/${{ gitea.base_ref }}" BASE_BRANCH: "origin/${{ github.base_ref }}"
# renovate: datasource=github-releases depName=yannh/kubeconform
KUBECONFORM_VERSION: "v0.6.7"
jobs: jobs:
lint-helm: lint-helm:
runs-on: ubuntu-js runs-on: ubuntu-js
outputs:
chart-dir: ${{ steps.check-dir-changes.outputs.chart-dir }}
chart-dir-csv: ${{ steps.check-dir-changes.outputs.chart-dir-csv }}
changes-detected: ${{ steps.check-dir-changes.outputs.changes-detected }}
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v6 uses: actions/checkout@v6
@@ -31,88 +37,91 @@ jobs:
if: github.event_name == 'pull_request' if: github.event_name == 'pull_request'
uses: GuillaumeFalourd/branch-exists@v1.1 uses: GuillaumeFalourd/branch-exists@v1.1
with: with:
branch: ${{ gitea.base_ref }} branch: ${{ github.base_ref }}
- name: Report Branch Exists - name: Report Branch Exists
id: branch-exists id: branch-exists
if: github.event_name == 'push' || steps.check-branch-exists.outputs.exists == 'true' && github.event_name == 'pull_request' if: github.event_name == 'push' || steps.check-branch-exists.outputs.exists == 'true' && github.event_name == 'pull_request'
run: | run: |
if [ ${{ github.event_name == 'push' }} ]; then if [ "${{ github.event_name }}" == "push" ]; then
echo ">> Action is from a push event, will continue with linting" echo ">> Action is from a push event, will continue with linting"
else else
echo ">> Branch ${{ gitea.base_ref }} exists, will continue with linting" echo ">> Branch ${{ github.base_ref }} exists, will continue with linting"
fi fi
echo ""
echo "----" echo "----"
echo "exists=true" >> $GITEA_OUTPUT echo "exists=true" >> $GITHUB_OUTPUT
- name: Set up Helm - name: Set Up Helm
if: steps.branch-exists.outputs.exists == 'true' if: steps.branch-exists.outputs.exists == 'true'
uses: azure/setup-helm@v4 uses: azure/setup-helm@v4
with: with:
token: ${{ secrets.GITEA_TOKEN }} token: ${{ secrets.GITEA_TOKEN }}
version: v3.19.2 # renovate: datasource=github-releases depName=helm/helm
version: v4.1.3
cache: true cache: true
- name: Cache Helm Dependencies
if: steps.branch-exists.outputs.exists == 'true'
uses: actions/cache@v5
with:
path: |
~/.cache/helm
~/.config/helm
key: helm-cache-${{ runner.os }}-${{ hashFiles('infrastructure/clusters/cl01tl/helm/**/Chart.yaml', 'infrastructure/clusters/cl01tl/helm/**/Chart.lock') }}
restore-keys: |
helm-cache-${{ runner.os }}-
- name: Check Directories for Changes - name: Check Directories for Changes
id: check-dir-changes id: check-dir-changes
if: steps.branch-exists.outputs.exists == 'true' if: steps.branch-exists.outputs.exists == 'true'
run: | run: |
CHANGED_CHARTS=()
echo ">> Target branch for diff is: ${BASE_BRANCH}" echo ">> Target branch for diff is: ${BASE_BRANCH}"
if [ "${{ github.event_name }}" == "pull_request" ]; then if [ "${{ github.event_name }}" == "pull_request" ]; then
DIFF_TARGET="${BASE_BRANCH}"
echo "" echo ""
echo ">> Checking for changes in a pull request ..." echo ">> Checking for changes in a pull request ..."
GIT_DIFF=$(git diff --name-only "${BASE_BRANCH}" | xargs -I {} dirname {} | sort -u)
else else
DIFF_TARGET="${{ github.event.before }}..HEAD"
echo "" echo ""
echo ">> Checking for changes from a push ..." echo ">> Checking for changes from a push ..."
GIT_DIFF=$(git diff --name-only ${{ gitea.event.before }}..HEAD | xargs -I {} dirname {} | sort -u)
fi
if [ -n "${GIT_DIFF}" ]; then
echo ""
echo ">> Changes detected:"
echo "$GIT_DIFF"
for path in $GIT_DIFF; do
if echo "$path" | grep -q -E "clusters/[^/]+/helm/[^/]+"; then
echo ""
echo ">> Adding path: $path"
CHANGED_CHARTS+=$(echo "$path" | awk -F '/' '{print $4}')
CHANGED_CHARTS+=$(echo "\n")
fi
done
else
echo ""
echo ">> No changes detected"
fi fi
CHANGED_CHARTS=$(git diff --name-only "${DIFF_TARGET}" | grep -E "^clusters/${CLUSTER}/helm/" | awk -F '/' '{print $4}' | sort -u || true)
if [ -n "${CHANGED_CHARTS}" ]; then if [ -n "${CHANGED_CHARTS}" ]; then
echo "" echo ""
echo ">> Chart to Lint:" echo ">> Chart to Lint:"
echo "$(echo "${CHANGED_CHARTS}" | sort -u)" echo ""
echo "${CHANGED_CHARTS}"
CHANGED_CHARTS_CSV=$(echo "$CHANGED_CHARTS" | paste -sd ',' -)
echo ""
echo "----" echo "----"
echo "changes-detected=true" >> $GITEA_OUTPUT echo "changes-detected=true" >> $GITHUB_OUTPUT
echo "chart-dir<<EOF" >> $GITEA_OUTPUT echo "chart-dir-csv=${CHANGED_CHARTS_CSV}" >> $GITHUB_OUTPUT
echo "$(echo "${CHANGED_CHARTS}" | sort -u)" >> $GITEA_OUTPUT echo "chart-dir<<EOF" >> $GITHUB_OUTPUT
echo "EOF" >> $GITEA_OUTPUT echo "${CHANGED_CHARTS}" >> $GITHUB_OUTPUT
echo "EOF" >> $GITHUB_OUTPUT
else else
echo "" echo ""
echo ">> Did not find any helm charts files to lint" echo ">> Did not find any helm charts files to lint"
echo ""
echo "----" echo "----"
echo "changes-detected=false" >> $GITEA_OUTPUT echo "changes-detected=false" >> $GITHUB_OUTPUT
fi fi
- name: Add Repositories - name: Add Repositories
@@ -121,68 +130,238 @@ jobs:
CHANGED_CHARTS: ${{ steps.check-dir-changes.outputs.chart-dir }} CHANGED_CHARTS: ${{ steps.check-dir-changes.outputs.chart-dir }}
run: | run: |
echo ">> Adding repositories for chart dependencies ..." echo ">> Adding repositories for chart dependencies ..."
for dir in ${CHANGED_CHARTS}; do echo ""
helm dependency list --max-col-width 120 clusters/${CLUSTER}/helm/$dir 2> /dev/null \
| tail +2 | head -n -1 \ for DIR in ${CHANGED_CHARTS}; do
| awk '{ print "helm repo add " $1 " " $3 }' \ helm dependency list --max-col-width 120 clusters/${CLUSTER}/helm/${DIR} 2> /dev/null \
| while read cmd; do | tail -n +2 \
if [[ "$cmd" == "*oci://*" ]]; then | awk 'NF > 0 { print $1, $3 }' \
echo ">> Ignoring OCI repo" | while read -r REPO_NAME REPO_URL; do
else if [[ "${REPO_URL}" == oci://* ]]; then
echo ">> Command: $cmd" echo ">> Ignoring OCI repo: ${REPO_URL}"
echo "$cmd" | sh;
elif [[ -n "${REPO_NAME}" && -n "${REPO_URL}" ]]; then
helm repo add "${REPO_NAME}" "${REPO_URL}"
fi fi
done || true done || true
done done
if helm repo list | tail +2 | read -r; then if helm repo list > /dev/null 2>&1; then
echo "" echo ""
echo ">> Update repository cache ..." echo ">> Update repository cache ..."
helm repo update helm repo update
fi fi
echo ""
echo "----" echo "----"
- name: Lint Helm Chart - name: Lint Helm Chart
id: lint
if: steps.check-dir-changes.outputs.changes-detected == 'true' if: steps.check-dir-changes.outputs.changes-detected == 'true'
env: env:
CHANGED_CHARTS: ${{ steps.check-dir-changes.outputs.chart-dir }} CHANGED_CHARTS: ${{ steps.check-dir-changes.outputs.chart-dir }}
run: | run: |
EXIT_CODE=0
FAILED_CHARTS=""
echo ">> Running linting on changed charts ..." echo ">> Running linting on changed charts ..."
for dir in ${CHANGED_CHARTS}; do for DIR in ${CHANGED_CHARTS}; do
chart_path=clusters/${CLUSTER}/helm/$dir CHART_PATH="clusters/${CLUSTER}/helm/${DIR}"
chart_name=$(basename "$chart_path") CHART_NAME=$(basename "${CHART_PATH}")
if [ -f "$chart_path/Chart.yaml" ]; then if [ -f "${CHART_PATH}/Chart.yaml" ]; then
cd $chart_path echo ""
echo ">> Building helm dependency for ${CHART_NAME} ..."
helm dependency build "${CHART_PATH}" --skip-refresh
echo "" echo ""
echo ">> Building helm dependency ..." echo ">> Linting helm chart ${CHART_NAME} ..."
helm dependency build --skip-refresh
echo "" if ! helm lint "${CHART_PATH}" --namespace "default"; then
echo ">> Linting helm ..." EXIT_CODE=1
helm lint --namespace "$chart_name"
if [ -z "${FAILED_CHARTS}" ]; then
FAILED_CHARTS="${DIR}"
else
FAILED_CHARTS="${FAILED_CHARTS}, ${DIR}"
fi
fi
else else
echo "" echo ""
echo ">> Directory $chart_path does not contain a Chart.yaml. Skipping ..." echo ">> Directory ${CHART_PATH} does not contain a Chart.yaml. Skipping ..."
echo ""
fi fi
done done
echo ""
echo "----"
echo "failed-charts=${FAILED_CHARTS}" >> "$GITHUB_OUTPUT"
exit $EXIT_CODE
- name: ntfy Failed - name: ntfy Failed
uses: niniyas/ntfy-action@master uses: niniyas/ntfy-action@master
if: failure() if: failure()
with: with:
url: '${{ secrets.NTFY_URL }}' url: '${{ secrets.NTFY_URL }}'
topic: '${{ secrets.NTFY_TOPIC }}' topic: '${{ secrets.NTFY_TOPIC }}'
title: 'Test Failure - Infrastructure' title: 'Helm Test Failure'
priority: 3 priority: 3
headers: '{"Authorization": "Bearer ${{ secrets.NTFY_CRED }}"}' headers: '{"Authorization": "Bearer ${{ secrets.NTFY_CRED }}"}'
tags: action,failed tags: action,failed
details: 'Helm linting on Pull Request for Infrastructure has failed!' details: "Helm linting for cluster '${{ env.CLUSTER }}' failed on charts: ${{ steps.lint.outputs.failed-charts }}"
icon: 'https://cdn.jsdelivr.net/gh/selfhst/icons/png/gitea.png' icon: 'https://cdn.jsdelivr.net/gh/selfhst/icons/png/gitea.png'
actions: '[{"action": "view", "label": "Open Gitea", "url": "https://gitea.alexlebens.dev/alexlebens/infrastructure/actions?workflow=lint-test-helm-pull.yaml", "clear": true}]' actions: '[{"action": "view", "label": "View Run", "url": "${{ vars.USER_URL }}/${{ github.repository }}/actions/runs/${{ github.run_id }}", "clear": true}]'
image: true
validate-kubeconform:
needs: lint-helm
runs-on: ubuntu-js
if: |
needs.lint-helm.result == 'success' &&
needs.lint-helm.outputs.changes-detected == 'true' &&
github.event_name == 'pull_request'
steps:
- name: Checkout
uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Install Kubeconform
run: |
echo ">> Downloading Kubeconform ${{ env.KUBECONFORM_VERSION }} ..."
wget -q https://github.com/yannh/kubeconform/releases/download/${{ env.KUBECONFORM_VERSION }}/kubeconform-linux-amd64.tar.gz
echo ""
echo ">> Extracting Kubeconform ..."
tar xf kubeconform-linux-amd64.tar.gz
echo ""
echo ">> Installing Kubeconform ..."
sudo mv kubeconform /usr/local/bin/
echo ""
echo ">> Verifying installation ..."
kubeconform -v
echo ""
echo "----"
- name: Set Up Helm
uses: azure/setup-helm@v4
with:
token: ${{ secrets.GITEA_TOKEN }}
# renovate: datasource=github-releases depName=helm/helm
version: v4.1.3
cache: true
- name: Cache Helm Dependencies
uses: actions/cache@v5
with:
path: |
~/.cache/helm
~/.config/helm
key: helm-cache-${{ runner.os }}-${{ hashFiles('infrastructure/clusters/cl01tl/helm/**/Chart.yaml', 'infrastructure/clusters/cl01tl/helm/**/Chart.lock') }}
restore-keys: |
helm-cache-${{ runner.os }}-
- name: Add Repositories
env:
CHANGED_CHARTS: ${{ needs.lint-helm.outputs.chart-dir }}
run: |
echo ">> Adding repositories for chart dependencies ..."
echo ""
for DIR in ${CHANGED_CHARTS}; do
helm dependency list --max-col-width 120 clusters/${CLUSTER}/helm/${DIR} 2> /dev/null \
| tail -n +2 \
| awk 'NF > 0 { print $1, $3 }' \
| while read -r REPO_NAME REPO_URL; do
if [[ "${REPO_URL}" == oci://* ]]; then
echo ">> Ignoring OCI repo: ${REPO_URL}"
elif [[ -n "${REPO_NAME}" && -n "${REPO_URL}" ]]; then
helm repo add "${REPO_NAME}" "${REPO_URL}"
fi
done || true
done
if helm repo list > /dev/null 2>&1; then
echo ""
echo ">> Update repository cache ..."
helm repo update
fi
echo ""
echo "----"
- name: Validate Rendered Templates
id: validate
env:
CHANGED_CHARTS: ${{ needs.lint-helm.outputs.chart-dir }}
run: |
SCHEMA_LOCATIONS="-schema-location default -schema-location https://raw.githubusercontent.com/datreeio/CRDs-catalog/main/{{.Group}}/{{.ResourceKind}}_{{.ResourceAPIVersion}}.json"
EXIT_CODE=0
FAILED_CHARTS=""
for DIR in ${CHANGED_CHARTS}; do
CHART_PATH="clusters/${CLUSTER}/helm/${DIR}"
echo ""
echo ">> Validating: ${DIR}"
helm dependency build "${CHART_PATH}" --skip-refresh
if ! helm template "${DIR}" "${CHART_PATH}" --include-crds --namespace default --api-versions "gateway.networking.k8s.io/v1/HTTPRoute" | \
kubeconform \
${SCHEMA_LOCATIONS} \
-ignore-missing-schemas \
-strict \
-summary; then
EXIT_CODE=1
if [ -z "${FAILED_CHARTS}" ]; then
FAILED_CHARTS="${DIR}"
else
FAILED_CHARTS="${FAILED_CHARTS}, ${DIR}"
fi
fi
done
echo ""
echo "----"
echo "failed-charts=${FAILED_CHARTS}" >> "$GITHUB_OUTPUT"
exit $EXIT_CODE
- name: ntfy Failed
uses: niniyas/ntfy-action@master
if: failure()
with:
url: '${{ secrets.NTFY_URL }}'
topic: '${{ secrets.NTFY_TOPIC }}'
title: 'Kubeconform Test Failure'
priority: 3
headers: '{"Authorization": "Bearer ${{ secrets.NTFY_CRED }}"}'
tags: action,failed
details: "Kubeconform for cluster '${{ env.CLUSTER }}' failed on charts: ${{ steps.validate.outputs.failed-charts }}"
icon: 'https://cdn.jsdelivr.net/gh/selfhst/icons/png/gitea.png'
actions: '[{"action": "view", "label": "View Run", "url": "${{ vars.USER_URL }}/${{ github.repository }}/actions/runs/${{ github.run_id }}", "clear": true}]'
image: true image: true

View File

@@ -1,13 +1,14 @@
name: render-manifests-automerge name: render-manifests-automerge
on: on:
pull_request: workflow_dispatch:
branches: # pull_request:
- main # branches:
paths: # - main
- 'clusters/cl01tl/helm/**' # paths:
types: # - 'clusters/cl01tl/helm/**'
- closed # types:
# - closed
env: env:
CLUSTER: cl01tl CLUSTER: cl01tl
@@ -46,6 +47,16 @@ jobs:
method: kubeconfig method: kubeconfig
kubeconfig: ${{ secrets.KUBECONFIG }} kubeconfig: ${{ secrets.KUBECONFIG }}
- name: Cache Helm Dependencies
uses: actions/cache@v5
with:
path: |
~/.cache/helm
~/.config/helm
key: helm-cache-${{ runner.os }}-${{ hashFiles('infrastructure/clusters/cl01tl/helm/**/Chart.yaml', 'infrastructure/clusters/cl01tl/helm/**/Chart.lock') }}
restore-keys: |
helm-cache-${{ runner.os }}-
- name: Prepare Manifest Branch - name: Prepare Manifest Branch
id: prepare-manifest-branch id: prepare-manifest-branch
run: | run: |
@@ -53,10 +64,12 @@ jobs:
BRANCH_NAME="${BRANCH_NAME_BASE}-$(date +%Y%m%d%H%M%S)" BRANCH_NAME="${BRANCH_NAME_BASE}-$(date +%Y%m%d%H%M%S)"
echo ""
echo ">> Configure git to use gitea-bot as user ..." echo ">> Configure git to use gitea-bot as user ..."
git config user.name "gitea-bot" git config user.name "gitea-bot"
git config user.email "gitea-bot@alexlebens.net" git config user.email "gitea-bot@alexlebens.net"
echo ""
echo ">> Creating branch ..." echo ">> Creating branch ..."
git checkout -b $BRANCH_NAME git checkout -b $BRANCH_NAME
@@ -67,38 +80,31 @@ jobs:
- name: Check which Directories have Changes - name: Check which Directories have Changes
id: check-dir-changes id: check-dir-changes
run: | run: |
cd ${MAIN_DIR} cd "${MAIN_DIR}"
RENDER_DIR=()
echo ""
echo ">> Checking for changes from HEAD^..HEAD ..." echo ">> Checking for changes from HEAD^..HEAD ..."
GIT_DIFF=$(git diff --name-only HEAD^..HEAD | xargs -I {} dirname {} | sort -u | grep -E "clusters/[^/]+/helm/[^/]+")
if [ -n "${GIT_DIFF}" ]; then # Extract the chart names from the git diff
echo ">> Changes detected:" RENDER_DIR=$(git diff --name-only HEAD^..HEAD | grep -E "^clusters/${CLUSTER}/helm/" | awk -F '/' '{print $4}' | sort -u || true)
echo "$GIT_DIFF"
for path in $GIT_DIFF; do
RENDER_DIR+=$(echo "$path" | awk -F '/' '{print $4}')
RENDER_DIR+=$(echo " ")
done
else
echo ">> No changes detected"
fi
if [ -n "${RENDER_DIR}" ]; then if [ -n "${RENDER_DIR}" ]; then
echo ""
echo ">> Directories to Render:" echo ">> Directories to Render:"
echo "$(echo "${RENDER_DIR}" | sort -u)" echo "${RENDER_DIR}"
echo "----" echo "----"
echo "changes-detected=true" >> $GITEA_OUTPUT echo "changes-detected=true" >> "$GITEA_OUTPUT"
echo "render-dir<<EOF" >> $GITEA_OUTPUT echo "render-dir<<EOF" >> "$GITEA_OUTPUT"
echo "$(echo "${RENDER_DIR}" | sort -u)" >> $GITEA_OUTPUT echo "${RENDER_DIR}" >> "$GITEA_OUTPUT"
echo "EOF" >> $GITEA_OUTPUT echo "EOF" >> "$GITEA_OUTPUT"
else else
echo "changes-detected=false" >> $GITEA_OUTPUT echo ""
echo ">> No chart changes detected"
echo "changes-detected=false" >> "$GITEA_OUTPUT"
fi fi
- name: Add Repositories - name: Add Repositories
@@ -106,25 +112,31 @@ jobs:
env: env:
RENDER_DIR: ${{ steps.check-dir-changes.outputs.render-dir }} RENDER_DIR: ${{ steps.check-dir-changes.outputs.render-dir }}
run: | run: |
cd ${MAIN_DIR} cd "${MAIN_DIR}"
echo ""
echo ">> Adding repositories for chart dependencies ..." echo ">> Adding repositories for chart dependencies ..."
for dir in ${RENDER_DIR}; do for DIR in ${RENDER_DIR}; do
helm dependency list --max-col-width 120 ${MAIN_DIR}/clusters/${CLUSTER}/helm/$dir 2> /dev/null \ helm dependency list --max-col-width 120 "${MAIN_DIR}/clusters/${CLUSTER}/helm/${DIR}" 2> /dev/null \
| tail +2 | head -n -1 \ | tail -n +2 \
| awk '{ print "helm repo add " $1 " " $3 }' \ | awk 'NF > 0 { print $1, $3 }' \
| while read cmd; do | while read -r REPO_NAME REPO_URL; do
if [[ "$cmd" == "*oci://*" ]]; then if [[ "${REPO_URL}" == oci://* ]]; then
echo ">> Ignoring OCI repo" echo ""
else echo ">> Ignoring OCI repo: ${REPO_URL}"
echo "$cmd" | sh;
elif [[ -n "${REPO_NAME}" && -n "${REPO_URL}" ]]; then
helm repo add "${REPO_NAME}" "${REPO_URL}"
fi fi
done || true done || true
done done
if helm repo list | tail +2 | read -r; then if helm repo list > /dev/null 2>&1; then
echo ""
echo ">> Update repository cache ..." echo ">> Update repository cache ..."
helm repo update helm repo update
fi fi
echo "----" echo "----"
@@ -134,15 +146,16 @@ jobs:
env: env:
RENDER_DIR: ${{ steps.check-dir-changes.outputs.render-dir }} RENDER_DIR: ${{ steps.check-dir-changes.outputs.render-dir }}
run: | run: |
cd ${MANIFEST_DIR} cd "${MANIFEST_DIR}"
echo ""
echo ">> Remove manfiest files and rebuild from source ..." echo ">> Remove manfiest files and rebuild from source ..."
for dir in ${RENDER_DIR}; do for DIR in ${RENDER_DIR}; do
chart_path=${MANIFEST_DIR}/clusters/${CLUSTER}/manifests/$dir CHART_PATH=${MANIFEST_DIR}/clusters/${CLUSTER}/manifests/${DIR}
echo "$chart_path" echo "${CHART_PATH}"
rm -rf $chart_path/* rm -rf ${CHART_PATH}/*
done done
echo "----" echo "----"
@@ -155,60 +168,57 @@ jobs:
run: | run: |
cd ${MAIN_DIR} cd ${MAIN_DIR}
echo ""
echo ">> Rendering Manifests ..." echo ">> Rendering Manifests ..."
for dir in ${RENDER_DIR}; do render_chart() {
chart_path=${MAIN_DIR}/clusters/${CLUSTER}/helm/$dir local DIR="$1"
chart_name=$(basename "$chart_path") local CHART_PATH="${MAIN_DIR}/clusters/${CLUSTER}/helm/${DIR}"
local CHART_NAME=$(basename "${CHART_PATH}")
echo "" echo ""
echo "" echo ">> Rendering ..."
echo ">> Rendering chart: $chart_name" echo ">> Chart: ${CHART_NAME}"
echo ">> Chart path $chart_path" echo ">> Path: ${CHART_PATH}"
if [ -f "$chart_path/Chart.yaml" ]; then if [ -f "${CHART_PATH}/Chart.yaml" ]; then
OUTPUT_FOLDER="${MANIFEST_DIR}/clusters/${CLUSTER}/manifests/$chart_name/" local OUTPUT_FOLDER="${MANIFEST_DIR}/clusters/${CLUSTER}/manifests/${CHART_NAME}/"
TEMPLATE=""
mkdir -p ${MANIFEST_DIR}/clusters/${CLUSTER}/manifests/$chart_name mkdir -p "${OUTPUT_FOLDER}"
cd "${CHART_PATH}"
cd $chart_path
echo "" echo ""
echo ">> Updating helm dependency ..." echo ">> Updating helm dependencies ..."
helm dependency update --skip-refresh helm dependency update --skip-refresh > /dev/null
echo "" echo ""
echo ">> Building helm dependency ..." echo ">> Linting helm chart ..."
helm dependency build --skip-refresh helm lint --namespace "${CHART_NAME}" --quiet
echo "" local NAMESPACE="${CHART_NAME}"
echo ">> Linting helm ..." case "${CHART_NAME}" in
helm lint --namespace "$chart_name"
echo ""
echo ">> Rendering templates ..."
case "$chart_name" in
"stack") "stack")
NAMESPACE="argocd"
echo "" echo ""
echo ">> Special Rendering for stack into argocd namespace ..." echo ">> Special Rendering into 'argocd' namespace ..."
TEMPLATE=$(helm template $chart_name ./ --namespace argocd --include-crds --dry-run=server --api-versions "gateway.networking.k8s.io/v1/HTTPRoute")
;; ;;
"cilium" | "coredns" | "metrics-server" |"prometheus-operator-crds") "cilium" | "coredns" | "metrics-server" | "prometheus-operator-crds")
NAMESPACE="kube-system"
echo "" echo ""
echo ">> Special Rendering for $chart_name into kube-system namespace ..." echo ">> Special Rendering for ${CHART_NAME} into 'kube-system' namespace ..."
TEMPLATE=$(helm template $chart_name ./ --namespace kube-system --include-crds --dry-run=server --api-versions "gateway.networking.k8s.io/v1/HTTPRoute")
;; ;;
*) *)
echo "" echo ""
echo ">> Standard Rendering for $chart_name ..." echo ">> Standard Rendering for ${CHART_NAME} ..."
TEMPLATE=$(helm template "$chart_name" ./ --namespace "$chart_name" --include-crds --dry-run=server --api-versions "gateway.networking.k8s.io/v1/HTTPRoute")
;;
esac esac
echo "" echo ""
echo ">> Formating rendered template ..." echo ">> Formating rendered template ..."
echo "$TEMPLATE" | yq '... comments=""' | yq 'select(. != null)' | yq -s '"'"$OUTPUT_FOLDER"'" + .kind + "-" + .metadata.name + ".yaml"' local TEMPLATE
TEMPLATE=$(helm template "${CHART_NAME}" ./ --namespace "${NAMESPACE}" --include-crds --dry-run=server --api-versions "gateway.networking.k8s.io/v1/HTTPRoute")
# Format and split rendered template
echo "${TEMPLATE}" | yq '... comments=""' | yq 'select(. != null)' | yq -s '"'"${OUTPUT_FOLDER}"'" + .kind + "-" + .metadata.name + ".yaml"'
# Strip comments again to ensure formatting correctness # Strip comments again to ensure formatting correctness
for file in "$OUTPUT_FOLDER"/*; do for file in "$OUTPUT_FOLDER"/*; do
@@ -216,15 +226,23 @@ jobs:
done done
echo "" echo ""
echo ">> Manifests for $chart_name rendered to $OUTPUT_FOLDER" echo ">> Manifests for ${CHART_NAME} rendered to ${OUTPUT_FOLDER}:"
ls $OUTPUT_FOLDER ls $OUTPUT_FOLDER
echo "" echo ""
else else
echo "" echo ""
echo ">> Directory $chart_path does not contain a Chart.yaml. Skipping ..." echo ">> Directory ${CHART_PATH} does not contain a Chart.yaml. Skipping ..."
echo "" echo ""
fi fi
done }
export -f render_chart
export MAIN_DIR CLUSTER MANIFEST_DIR
# Run rendering in parallel
for DIR in ${RENDER_DIR}; do
echo "${DIR}"
done | xargs -n 1 -P 4 -I {} bash -c 'render_chart "$@"' _ {}
echo "----" echo "----"
@@ -232,16 +250,18 @@ jobs:
id: check-changes id: check-changes
if: steps.check-dir-changes.outputs.changes-detected == 'true' if: steps.check-dir-changes.outputs.changes-detected == 'true'
run: | run: |
cd ${MANIFEST_DIR} cd "${MANIFEST_DIR}"
GIT_CHANGES=$(git status --porcelain) GIT_CHANGES=$(git status --porcelain)
if [ -n "$GIT_CHANGES" ]; then if [ -n "${GIT_CHANGES}" ]; then
echo ""
echo ">> Changes detected" echo ">> Changes detected"
git status --porcelain git status --porcelain
echo "changes-detected=true" >> $GITEA_OUTPUT echo "changes-detected=true" >> $GITEA_OUTPUT
else else
echo ""
echo ">> No changes detected, skipping PR creation" echo ">> No changes detected, skipping PR creation"
fi fi
@@ -254,19 +274,22 @@ jobs:
env: env:
BRANCH_NAME: ${{ steps.prepare-manifest-branch.outputs.BRANCH_NAME }} BRANCH_NAME: ${{ steps.prepare-manifest-branch.outputs.BRANCH_NAME }}
run: | run: |
cd ${MANIFEST_DIR} cd "${MANIFEST_DIR}"
echo ""
echo ">> Commiting changes to ${BRANCH_NAME} ..." echo ">> Commiting changes to ${BRANCH_NAME} ..."
git add . git add .
git commit -m "chore: Update manifests after automerge" git commit -m "chore: Update manifests after automerge"
REPO_URL="${{ secrets.REPO_URL }}/${{ gitea.repository }}" REPO_URL="${{ secrets.REPO_URL }}/${{ gitea.repository }}"
echo ">> Pushing changes to $REPO_URL ..." echo ""
git push -u "https://oauth2:${{ secrets.BOT_TOKEN }}@$(echo $REPO_URL | sed -e 's|https://||')" ${BRANCH_NAME} echo ">> Pushing changes to ${REPO_URL} ..."
git push -u "https://oauth2:${{ secrets.BOT_TOKEN }}@${REPO_URL#*://}" "${BRANCH_NAME}"
echo "----" echo "----"
echo "push=true" >> $GITEA_OUTPUT echo "push=true" >> "$GITEA_OUTPUT"
- name: Create Pull Request - name: Create Pull Request
id: create-pull-request id: create-pull-request

View File

@@ -1,10 +1,11 @@
name: render-manifests-dispatch name: render-manifests-dispatch
on: on:
schedule:
- cron: '0 3 * * *'
workflow_dispatch: workflow_dispatch:
# schedule:
# - cron: '0 15 * * *'
# workflow_dispatch:
env: env:
CLUSTER: cl01tl CLUSTER: cl01tl
@@ -43,24 +44,39 @@ jobs:
method: kubeconfig method: kubeconfig
kubeconfig: ${{ secrets.KUBECONFIG }} kubeconfig: ${{ secrets.KUBECONFIG }}
- name: Cache Helm Dependencies
uses: actions/cache@v5
with:
path: |
~/.cache/helm
~/.config/helm
key: helm-cache-${{ runner.os }}-${{ hashFiles('infrastructure/clusters/cl01tl/helm/**/Chart.yaml', 'infrastructure/clusters/cl01tl/helm/**/Chart.lock') }}
restore-keys: |
helm-cache-${{ runner.os }}-
- name: Prepare Manifest Branch - name: Prepare Manifest Branch
run: | run: |
cd ${MANIFEST_DIR} cd "${MANIFEST_DIR}"
echo ""
echo ">> Configure git to use gitea-bot as user ..." echo ">> Configure git to use gitea-bot as user ..."
git config user.name "gitea-bot" git config user.name "gitea-bot"
git config user.email "gitea-bot@alexlebens.net" git config user.email "gitea-bot@alexlebens.net"
echo ""
echo ">> Checking if PR branch exists ..." echo ">> Checking if PR branch exists ..."
if [[ $(git ls-remote --heads origin "${BRANCH_NAME}" | wc -l) -gt 0 ]]; then if git ls-remote --exit-code --heads origin "${BRANCH_NAME}" > /dev/null 2>&1; then
echo ""
echo ">> Branch '${BRANCH_NAME}' exists, pulling changes ..." echo ">> Branch '${BRANCH_NAME}' exists, pulling changes ..."
git fetch origin "${BRANCH_NAME}" git fetch origin "${BRANCH_NAME}"
git checkout "${BRANCH_NAME}" git checkout "${BRANCH_NAME}"
git pull --rebase git pull --rebase
else else
echo ""
echo ">> Branch '${BRANCH_NAME}' does not exist, creating ..." echo ">> Branch '${BRANCH_NAME}' does not exist, creating ..."
git checkout -b $BRANCH_NAME git checkout -b "${BRANCH_NAME}"
fi fi
echo "----" echo "----"
@@ -68,25 +84,29 @@ jobs:
- name: Check which Directories have Changes - name: Check which Directories have Changes
id: check-dir-changes id: check-dir-changes
run: | run: |
cd ${MAIN_DIR} cd "${MAIN_DIR}"
RENDER_DIR=()
echo ""
echo ">> Triggered on dispatch, will check all paths ..." echo ">> Triggered on dispatch, will check all paths ..."
RENDER_DIR+=$(ls clusters/cl01tl/helm/)
# Extract names of charts
RENDER_DIR=$(find "clusters/${CLUSTER}/helm" -mindepth 1 -maxdepth 1 -type d -exec basename {} \; | sort -u)
if [ -n "${RENDER_DIR}" ]; then if [ -n "${RENDER_DIR}" ]; then
echo ""
echo ">> Directories to Render:" echo ">> Directories to Render:"
echo "$(echo "${RENDER_DIR}" | sort -u)" echo "${RENDER_DIR}"
echo "----" echo "----"
echo "changes-detected=true" >> $GITEA_OUTPUT echo "changes-detected=true" >> "$GITEA_OUTPUT"
echo "render-dir<<EOF" >> $GITEA_OUTPUT echo "render-dir<<EOF" >> "$GITEA_OUTPUT"
echo "$(echo "${RENDER_DIR}" | sort -u)" >> $GITEA_OUTPUT echo "${RENDER_DIR}" >> "$GITEA_OUTPUT"
echo "EOF" >> $GITEA_OUTPUT echo "EOF" >> "$GITEA_OUTPUT"
else else
echo "changes-detected=false" >> $GITEA_OUTPUT echo ">> No directories found"
echo "changes-detected=false" >> "$GITEA_OUTPUT"
fi fi
- name: Add Repositories - name: Add Repositories
@@ -94,29 +114,54 @@ jobs:
env: env:
RENDER_DIR: ${{ steps.check-dir-changes.outputs.render-dir }} RENDER_DIR: ${{ steps.check-dir-changes.outputs.render-dir }}
run: | run: |
cd ${MAIN_DIR} cd "${MAIN_DIR}"
echo ""
echo ">> Adding repositories for chart dependencies ..." echo ">> Adding repositories for chart dependencies ..."
for dir in ${RENDER_DIR}; do for DIR in ${RENDER_DIR}; do
helm dependency list --max-col-width 120 ${MAIN_DIR}/clusters/${CLUSTER}/helm/$dir 2> /dev/null \ helm dependency list --max-col-width 120 "${MAIN_DIR}/clusters/${CLUSTER}/helm/${DIR}" 2> /dev/null \
| tail +2 | head -n -1 \ | tail -n +2 \
| awk '{ print "helm repo add " $1 " " $3 }' \ | awk 'NF > 0 { print $1, $3 }' \
| while read cmd; do | while read -r REPO_NAME REPO_URL; do
if [[ "$cmd" == "*oci://*" ]]; then if [[ "${REPO_URL}" == oci://* ]]; then
echo ">> Ignoring OCI repo" echo ""
else echo ">> Ignoring OCI repo: ${REPO_URL}"
echo "$cmd" | sh;
elif [[ -n "${REPO_NAME}" && -n "${REPO_URL}" ]]; then
helm repo add "${REPO_NAME}" "${REPO_URL}"
fi fi
done || true done || true
done done
if helm repo list | tail +2 | read -r; then if helm repo list > /dev/null 2>&1; then
echo ""
echo ">> Update repository cache ..." echo ">> Update repository cache ..."
helm repo update helm repo update
fi fi
echo "----" echo "----"
- name: Remove Changed Manifest Files
if: steps.check-dir-changes.outputs.changes-detected == 'true'
env:
RENDER_DIR: ${{ steps.check-dir-changes.outputs.render-dir }}
run: |
cd "${MANIFEST_DIR}"
echo ""
echo ">> Remove manfiest files and rebuild from source ..."
for DIR in ${RENDER_DIR}; do
CHART_PATH=${MANIFEST_DIR}/clusters/${CLUSTER}/manifests/${DIR}
echo "${CHART_PATH}"
rm -rf ${CHART_PATH}/*
done
echo "----"
- name: Render Helm Manifests - name: Render Helm Manifests
id: render-manifests id: render-manifests
if: steps.check-dir-changes.outputs.changes-detected == 'true' if: steps.check-dir-changes.outputs.changes-detected == 'true'
@@ -125,60 +170,57 @@ jobs:
run: | run: |
cd ${MAIN_DIR} cd ${MAIN_DIR}
echo ""
echo ">> Rendering Manifests ..." echo ">> Rendering Manifests ..."
for dir in ${RENDER_DIR}; do render_chart() {
chart_path=${MAIN_DIR}/clusters/${CLUSTER}/helm/$dir local DIR="$1"
chart_name=$(basename "$chart_path") local CHART_PATH="${MAIN_DIR}/clusters/${CLUSTER}/helm/${DIR}"
local CHART_NAME=$(basename "${CHART_PATH}")
echo "" echo ""
echo "" echo ">> Rendering ..."
echo ">> Rendering chart: $chart_name" echo ">> Chart: ${CHART_NAME}"
echo ">> Chart path $chart_path" echo ">> Path: ${CHART_PATH}"
if [ -f "$chart_path/Chart.yaml" ]; then if [ -f "${CHART_PATH}/Chart.yaml" ]; then
OUTPUT_FOLDER="${MANIFEST_DIR}/clusters/${CLUSTER}/manifests/$chart_name/" local OUTPUT_FOLDER="${MANIFEST_DIR}/clusters/${CLUSTER}/manifests/${CHART_NAME}/"
TEMPLATE=""
mkdir -p ${MANIFEST_DIR}/clusters/${CLUSTER}/manifests/$chart_name mkdir -p "${OUTPUT_FOLDER}"
cd "${CHART_PATH}"
cd $chart_path
echo "" echo ""
echo ">> Updating helm dependency ..." echo ">> Updating helm dependencies ..."
helm dependency update --skip-refresh helm dependency update --skip-refresh > /dev/null
echo "" echo ""
echo ">> Building helm dependency ..." echo ">> Linting helm chart ..."
helm dependency build --skip-refresh helm lint --namespace "${CHART_NAME}" --quiet
echo "" local NAMESPACE="${CHART_NAME}"
echo ">> Linting helm ..." case "${CHART_NAME}" in
helm lint --namespace "$chart_name"
echo ""
echo ">> Rendering templates ..."
case "$chart_name" in
"stack") "stack")
NAMESPACE="argocd"
echo "" echo ""
echo ">> Special Rendering for stack into argocd namespace ..." echo ">> Special Rendering into 'argocd' namespace ..."
TEMPLATE=$(helm template $chart_name ./ --namespace argocd --include-crds --dry-run=server --api-versions "gateway.networking.k8s.io/v1/HTTPRoute")
;; ;;
"cilium" | "coredns" | "metrics-server" |"prometheus-operator-crds") "cilium" | "coredns" | "metrics-server" | "prometheus-operator-crds")
NAMESPACE="kube-system"
echo "" echo ""
echo ">> Special Rendering for $chart_name into kube-system namespace ..." echo ">> Special Rendering for ${CHART_NAME} into 'kube-system' namespace ..."
TEMPLATE=$(helm template $chart_name ./ --namespace kube-system --include-crds --dry-run=server --api-versions "gateway.networking.k8s.io/v1/HTTPRoute")
;; ;;
*) *)
echo "" echo ""
echo ">> Standard Rendering for $chart_name ..." echo ">> Standard Rendering for ${CHART_NAME} ..."
TEMPLATE=$(helm template "$chart_name" ./ --namespace "$chart_name" --include-crds --dry-run=server --api-versions "gateway.networking.k8s.io/v1/HTTPRoute")
;;
esac esac
echo "" echo ""
echo ">> Formating rendered template ..." echo ">> Formating rendered template ..."
echo "$TEMPLATE" | yq '... comments=""' | yq 'select(. != null)' | yq -s '"'"$OUTPUT_FOLDER"'" + .kind + "-" + .metadata.name + ".yaml"' local TEMPLATE
TEMPLATE=$(helm template "${CHART_NAME}" ./ --namespace "${NAMESPACE}" --include-crds --dry-run=server --api-versions "gateway.networking.k8s.io/v1/HTTPRoute")
# Format and split rendered template
echo "${TEMPLATE}" | yq '... comments=""' | yq 'select(. != null)' | yq -s '"'"${OUTPUT_FOLDER}"'" + .kind + "-" + .metadata.name + ".yaml"'
# Strip comments again to ensure formatting correctness # Strip comments again to ensure formatting correctness
for file in "$OUTPUT_FOLDER"/*; do for file in "$OUTPUT_FOLDER"/*; do
@@ -186,15 +228,23 @@ jobs:
done done
echo "" echo ""
echo ">> Manifests for $chart_name rendered to $OUTPUT_FOLDER" echo ">> Manifests for ${CHART_NAME} rendered to ${OUTPUT_FOLDER}:"
ls $OUTPUT_FOLDER ls $OUTPUT_FOLDER
echo "" echo ""
else else
echo "" echo ""
echo ">> Directory $chart_path does not contain a Chart.yaml. Skipping ..." echo ">> Directory ${CHART_PATH} does not contain a Chart.yaml. Skipping ..."
echo "" echo ""
fi fi
done }
export -f render_chart
export MAIN_DIR CLUSTER MANIFEST_DIR
# Run rendering in parallel
for DIR in ${RENDER_DIR}; do
echo "${DIR}"
done | xargs -n 1 -P 4 -I {} bash -c 'render_chart "$@"' _ {}
echo "----" echo "----"
@@ -202,16 +252,18 @@ jobs:
id: check-changes id: check-changes
if: steps.check-dir-changes.outputs.changes-detected == 'true' if: steps.check-dir-changes.outputs.changes-detected == 'true'
run: | run: |
cd ${MANIFEST_DIR} cd "${MANIFEST_DIR}"
GIT_CHANGES=$(git status --porcelain) GIT_CHANGES=$(git status --porcelain)
if [ -n "$GIT_CHANGES" ]; then if [ -n "${GIT_CHANGES}" ]; then
echo ""
echo ">> Changes detected" echo ">> Changes detected"
git status --porcelain git status --porcelain
echo "changes-detected=true" >> $GITEA_OUTPUT echo "changes-detected=true" >> $GITEA_OUTPUT
else else
echo ""
echo ">> No changes detected, skipping PR creation" echo ">> No changes detected, skipping PR creation"
fi fi
@@ -222,20 +274,23 @@ jobs:
id: commit-push id: commit-push
if: steps.check-changes.outputs.changes-detected == 'true' if: steps.check-changes.outputs.changes-detected == 'true'
run: | run: |
cd ${MANIFEST_DIR} cd "${MANIFEST_DIR}"
echo ""
echo ">> Commiting changes to ${BRANCH_NAME} ..." echo ">> Commiting changes to ${BRANCH_NAME} ..."
git add . git add .
git commit -m "chore: Update manifests after change" git commit -m "chore: Update manifests after change"
REPO_URL="${{ secrets.REPO_URL }}/${{ gitea.repository }}" REPO_URL="${{ secrets.REPO_URL }}/${{ gitea.repository }}"
echo ">> Pushing changes to $REPO_URL ..." echo ""
git push -u "https://oauth2:${{ secrets.BOT_TOKEN }}@$(echo $REPO_URL | sed -e 's|https://||')" ${BRANCH_NAME} echo ">> Pushing changes to ${REPO_URL} ..."
git push -u "https://oauth2:${{ secrets.BOT_TOKEN }}@${REPO_URL#*://}" "${BRANCH_NAME}"
echo "----" echo "----"
echo "HEAD_BRANCH=${BRANCH_NAME}" >> $GITEA_OUTPUT echo "HEAD_BRANCH=${BRANCH_NAME}" >> "$GITEA_OUTPUT"
echo "push=true" >> $GITEA_OUTPUT echo "push=true" >> "$GITEA_OUTPUT"
- name: Check for Pull Request - name: Check for Pull Request
id: check-for-pull-requst id: check-for-pull-requst

View File

@@ -1,13 +1,14 @@
name: render-manifests-merge name: render-manifests-merge
on: on:
pull_request: workflow_dispatch:
branches: # pull_request:
- main # branches:
paths: # - main
- 'clusters/cl01tl/helm/**' # paths:
types: # - 'clusters/cl01tl/helm/**'
- closed # types:
# - closed
env: env:
CLUSTER: cl01tl CLUSTER: cl01tl
@@ -47,24 +48,39 @@ jobs:
method: kubeconfig method: kubeconfig
kubeconfig: ${{ secrets.KUBECONFIG }} kubeconfig: ${{ secrets.KUBECONFIG }}
- name: Cache Helm Dependencies
uses: actions/cache@v5
with:
path: |
~/.cache/helm
~/.config/helm
key: helm-cache-${{ runner.os }}-${{ hashFiles('infrastructure/clusters/cl01tl/helm/**/Chart.yaml', 'infrastructure/clusters/cl01tl/helm/**/Chart.lock') }}
restore-keys: |
helm-cache-${{ runner.os }}-
- name: Prepare Manifest Branch - name: Prepare Manifest Branch
run: | run: |
cd ${MANIFEST_DIR} cd "${MANIFEST_DIR}"
echo ""
echo ">> Configure git to use gitea-bot as user ..." echo ">> Configure git to use gitea-bot as user ..."
git config user.name "gitea-bot" git config user.name "gitea-bot"
git config user.email "gitea-bot@alexlebens.net" git config user.email "gitea-bot@alexlebens.net"
echo ""
echo ">> Checking if PR branch exists ..." echo ">> Checking if PR branch exists ..."
if [[ $(git ls-remote --heads origin "${BRANCH_NAME}" | wc -l) -gt 0 ]]; then if git ls-remote --exit-code --heads origin "${BRANCH_NAME}" > /dev/null 2>&1; then
echo ""
echo ">> Branch '${BRANCH_NAME}' exists, pulling changes ..." echo ">> Branch '${BRANCH_NAME}' exists, pulling changes ..."
git fetch origin "${BRANCH_NAME}" git fetch origin "${BRANCH_NAME}"
git checkout "${BRANCH_NAME}" git checkout "${BRANCH_NAME}"
git pull --rebase git pull --rebase
else else
echo ""
echo ">> Branch '${BRANCH_NAME}' does not exist, creating ..." echo ">> Branch '${BRANCH_NAME}' does not exist, creating ..."
git checkout -b $BRANCH_NAME git checkout -b "${BRANCH_NAME}"
fi fi
echo "----" echo "----"
@@ -72,38 +88,31 @@ jobs:
- name: Check which Directories have Changes - name: Check which Directories have Changes
id: check-dir-changes id: check-dir-changes
run: | run: |
cd ${MAIN_DIR} cd "${MAIN_DIR}"
RENDER_DIR=()
echo ""
echo ">> Checking for changes from HEAD^..HEAD ..." echo ">> Checking for changes from HEAD^..HEAD ..."
GIT_DIFF=$(git diff --name-only HEAD^..HEAD | xargs -I {} dirname {} | sort -u | grep -E "clusters/[^/]+/helm/[^/]+")
if [ -n "${GIT_DIFF}" ]; then # Extract the chart names from the git diff
echo ">> Changes detected:" RENDER_DIR=$(git diff --name-only HEAD^..HEAD | grep -E "^clusters/${CLUSTER}/helm/" | awk -F '/' '{print $4}' | sort -u || true)
echo "$GIT_DIFF"
for path in $GIT_DIFF; do
RENDER_DIR+=$(echo "$path" | awk -F '/' '{print $4}')
RENDER_DIR+=$(echo " ")
done
else
echo ">> No changes detected"
fi
if [ -n "${RENDER_DIR}" ]; then if [ -n "${RENDER_DIR}" ]; then
echo ""
echo ">> Directories to Render:" echo ">> Directories to Render:"
echo "$(echo "${RENDER_DIR}" | sort -u)" echo "${RENDER_DIR}"
echo "----" echo "----"
echo "changes-detected=true" >> $GITEA_OUTPUT echo "changes-detected=true" >> "$GITEA_OUTPUT"
echo "render-dir<<EOF" >> $GITEA_OUTPUT echo "render-dir<<EOF" >> "$GITEA_OUTPUT"
echo "$(echo "${RENDER_DIR}" | sort -u)" >> $GITEA_OUTPUT echo "${RENDER_DIR}" >> "$GITEA_OUTPUT"
echo "EOF" >> $GITEA_OUTPUT echo "EOF" >> "$GITEA_OUTPUT"
else else
echo "changes-detected=false" >> $GITEA_OUTPUT echo ""
echo ">> No chart changes detected"
echo "changes-detected=false" >> "$GITEA_OUTPUT"
fi fi
- name: Add Repositories - name: Add Repositories
@@ -111,25 +120,31 @@ jobs:
env: env:
RENDER_DIR: ${{ steps.check-dir-changes.outputs.render-dir }} RENDER_DIR: ${{ steps.check-dir-changes.outputs.render-dir }}
run: | run: |
cd ${MAIN_DIR} cd "${MAIN_DIR}"
echo ""
echo ">> Adding repositories for chart dependencies ..." echo ">> Adding repositories for chart dependencies ..."
for dir in ${RENDER_DIR}; do for DIR in ${RENDER_DIR}; do
helm dependency list --max-col-width 120 ${MAIN_DIR}/clusters/${CLUSTER}/helm/$dir 2> /dev/null \ helm dependency list --max-col-width 120 "${MAIN_DIR}/clusters/${CLUSTER}/helm/${DIR}" 2> /dev/null \
| tail +2 | head -n -1 \ | tail -n +2 \
| awk '{ print "helm repo add " $1 " " $3 }' \ | awk 'NF > 0 { print $1, $3 }' \
| while read cmd; do | while read -r REPO_NAME REPO_URL; do
if [[ "$cmd" == "*oci://*" ]]; then if [[ "${REPO_URL}" == oci://* ]]; then
echo ">> Ignoring OCI repo" echo ""
else echo ">> Ignoring OCI repo: ${REPO_URL}"
echo "$cmd" | sh;
elif [[ -n "${REPO_NAME}" && -n "${REPO_URL}" ]]; then
helm repo add "${REPO_NAME}" "${REPO_URL}"
fi fi
done || true done || true
done done
if helm repo list | tail +2 | read -r; then if helm repo list > /dev/null 2>&1; then
echo ""
echo ">> Update repository cache ..." echo ">> Update repository cache ..."
helm repo update helm repo update
fi fi
echo "----" echo "----"
@@ -139,15 +154,16 @@ jobs:
env: env:
RENDER_DIR: ${{ steps.check-dir-changes.outputs.render-dir }} RENDER_DIR: ${{ steps.check-dir-changes.outputs.render-dir }}
run: | run: |
cd ${MANIFEST_DIR} cd "${MANIFEST_DIR}"
echo ""
echo ">> Remove manfiest files and rebuild from source ..." echo ">> Remove manfiest files and rebuild from source ..."
for dir in ${RENDER_DIR}; do for DIR in ${RENDER_DIR}; do
chart_path=${MANIFEST_DIR}/clusters/${CLUSTER}/manifests/$dir CHART_PATH=${MANIFEST_DIR}/clusters/${CLUSTER}/manifests/${DIR}
echo "$chart_path" echo "${CHART_PATH}"
rm -rf $chart_path/* rm -rf ${CHART_PATH}/*
done done
echo "----" echo "----"
@@ -160,60 +176,57 @@ jobs:
run: | run: |
cd ${MAIN_DIR} cd ${MAIN_DIR}
echo ""
echo ">> Rendering Manifests ..." echo ">> Rendering Manifests ..."
for dir in ${RENDER_DIR}; do render_chart() {
chart_path=${MAIN_DIR}/clusters/${CLUSTER}/helm/$dir local DIR="$1"
chart_name=$(basename "$chart_path") local CHART_PATH="${MAIN_DIR}/clusters/${CLUSTER}/helm/${DIR}"
local CHART_NAME=$(basename "${CHART_PATH}")
echo "" echo ""
echo "" echo ">> Rendering ..."
echo ">> Rendering chart: $chart_name" echo ">> Chart: ${CHART_NAME}"
echo ">> Chart path $chart_path" echo ">> Path: ${CHART_PATH}"
if [ -f "$chart_path/Chart.yaml" ]; then if [ -f "${CHART_PATH}/Chart.yaml" ]; then
OUTPUT_FOLDER="${MANIFEST_DIR}/clusters/${CLUSTER}/manifests/$chart_name/" local OUTPUT_FOLDER="${MANIFEST_DIR}/clusters/${CLUSTER}/manifests/${CHART_NAME}/"
TEMPLATE=""
mkdir -p ${MANIFEST_DIR}/clusters/${CLUSTER}/manifests/$chart_name mkdir -p "${OUTPUT_FOLDER}"
cd "${CHART_PATH}"
cd $chart_path
echo "" echo ""
echo ">> Updating helm dependency ..." echo ">> Updating helm dependencies ..."
helm dependency update --skip-refresh helm dependency update --skip-refresh > /dev/null
echo "" echo ""
echo ">> Building helm dependency ..." echo ">> Linting helm chart ..."
helm dependency build --skip-refresh helm lint --namespace "${CHART_NAME}" --quiet
echo "" local NAMESPACE="${CHART_NAME}"
echo ">> Linting helm ..." case "${CHART_NAME}" in
helm lint --namespace "$chart_name"
echo ""
echo ">> Rendering templates ..."
case "$chart_name" in
"stack") "stack")
NAMESPACE="argocd"
echo "" echo ""
echo ">> Special Rendering for stack into argocd namespace ..." echo ">> Special Rendering into 'argocd' namespace ..."
TEMPLATE=$(helm template $chart_name ./ --namespace argocd --include-crds --dry-run=server --api-versions "gateway.networking.k8s.io/v1/HTTPRoute")
;; ;;
"cilium" | "coredns" | "metrics-server" |"prometheus-operator-crds") "cilium" | "coredns" | "metrics-server" | "prometheus-operator-crds")
NAMESPACE="kube-system"
echo "" echo ""
echo ">> Special Rendering for $chart_name into kube-system namespace ..." echo ">> Special Rendering for ${CHART_NAME} into 'kube-system' namespace ..."
TEMPLATE=$(helm template $chart_name ./ --namespace kube-system --include-crds --dry-run=server --api-versions "gateway.networking.k8s.io/v1/HTTPRoute")
;; ;;
*) *)
echo "" echo ""
echo ">> Standard Rendering for $chart_name ..." echo ">> Standard Rendering for ${CHART_NAME} ..."
TEMPLATE=$(helm template "$chart_name" ./ --namespace "$chart_name" --include-crds --dry-run=server --api-versions "gateway.networking.k8s.io/v1/HTTPRoute")
;;
esac esac
echo "" echo ""
echo ">> Formating rendered template ..." echo ">> Formating rendered template ..."
echo "$TEMPLATE" | yq '... comments=""' | yq 'select(. != null)' | yq -s '"'"$OUTPUT_FOLDER"'" + .kind + "-" + .metadata.name + ".yaml"' local TEMPLATE
TEMPLATE=$(helm template "${CHART_NAME}" ./ --namespace "${NAMESPACE}" --include-crds --dry-run=server --api-versions "gateway.networking.k8s.io/v1/HTTPRoute")
# Format and split rendered template
echo "${TEMPLATE}" | yq '... comments=""' | yq 'select(. != null)' | yq -s '"'"${OUTPUT_FOLDER}"'" + .kind + "-" + .metadata.name + ".yaml"'
# Strip comments again to ensure formatting correctness # Strip comments again to ensure formatting correctness
for file in "$OUTPUT_FOLDER"/*; do for file in "$OUTPUT_FOLDER"/*; do
@@ -221,15 +234,23 @@ jobs:
done done
echo "" echo ""
echo ">> Manifests for $chart_name rendered to $OUTPUT_FOLDER" echo ">> Manifests for ${CHART_NAME} rendered to ${OUTPUT_FOLDER}:"
ls $OUTPUT_FOLDER ls $OUTPUT_FOLDER
echo "" echo ""
else else
echo "" echo ""
echo ">> Directory $chart_path does not contain a Chart.yaml. Skipping ..." echo ">> Directory ${CHART_PATH} does not contain a Chart.yaml. Skipping ..."
echo "" echo ""
fi fi
done }
export -f render_chart
export MAIN_DIR CLUSTER MANIFEST_DIR
# Run rendering in parallel
for DIR in ${RENDER_DIR}; do
echo "${DIR}"
done | xargs -n 1 -P 4 -I {} bash -c 'render_chart "$@"' _ {}
echo "----" echo "----"
@@ -237,16 +258,18 @@ jobs:
id: check-changes id: check-changes
if: steps.check-dir-changes.outputs.changes-detected == 'true' if: steps.check-dir-changes.outputs.changes-detected == 'true'
run: | run: |
cd ${MANIFEST_DIR} cd "${MANIFEST_DIR}"
GIT_CHANGES=$(git status --porcelain) GIT_CHANGES=$(git status --porcelain)
if [ -n "$GIT_CHANGES" ]; then if [ -n "${GIT_CHANGES}" ]; then
echo ""
echo ">> Changes detected" echo ">> Changes detected"
git status --porcelain git status --porcelain
echo "changes-detected=true" >> $GITEA_OUTPUT echo "changes-detected=true" >> $GITEA_OUTPUT
else else
echo ""
echo ">> No changes detected, skipping PR creation" echo ">> No changes detected, skipping PR creation"
fi fi
@@ -257,20 +280,23 @@ jobs:
id: commit-push id: commit-push
if: steps.check-changes.outputs.changes-detected == 'true' if: steps.check-changes.outputs.changes-detected == 'true'
run: | run: |
cd ${MANIFEST_DIR} cd "${MANIFEST_DIR}"
echo ""
echo ">> Commiting changes to ${BRANCH_NAME} ..." echo ">> Commiting changes to ${BRANCH_NAME} ..."
git add . git add .
git commit -m "chore: Update manifests after change" git commit -m "chore: Update manifests after change"
REPO_URL="${{ secrets.REPO_URL }}/${{ gitea.repository }}" REPO_URL="${{ secrets.REPO_URL }}/${{ gitea.repository }}"
echo ">> Pushing changes to $REPO_URL ..." echo ""
git push -u "https://oauth2:${{ secrets.BOT_TOKEN }}@$(echo $REPO_URL | sed -e 's|https://||')" ${BRANCH_NAME} echo ">> Pushing changes to ${REPO_URL} ..."
git push -u "https://oauth2:${{ secrets.BOT_TOKEN }}@${REPO_URL#*://}" "${BRANCH_NAME}"
echo "----" echo "----"
echo "HEAD_BRANCH=${BRANCH_NAME}" >> $GITEA_OUTPUT echo "HEAD_BRANCH=${BRANCH_NAME}" >> "$GITEA_OUTPUT"
echo "push=true" >> $GITEA_OUTPUT echo "push=true" >> "$GITEA_OUTPUT"
- name: Check for Pull Request - name: Check for Pull Request
id: check-for-pull-requst id: check-for-pull-requst

View File

@@ -1,11 +1,12 @@
name: render-manifests-push name: render-manifests-push
on: on:
push: workflow_dispatch:
branches: # push:
- main # branches:
paths: # - main
- 'clusters/cl01tl/helm/**' # paths:
# - 'clusters/cl01tl/helm/**'
env: env:
CLUSTER: cl01tl CLUSTER: cl01tl
@@ -45,24 +46,38 @@ jobs:
method: kubeconfig method: kubeconfig
kubeconfig: ${{ secrets.KUBECONFIG }} kubeconfig: ${{ secrets.KUBECONFIG }}
- name: Cache Helm Dependencies
uses: actions/cache@v5
with:
path: |
~/.cache/helm
~/.config/helm
key: helm-cache-${{ runner.os }}-${{ hashFiles('infrastructure/clusters/cl01tl/helm/**/Chart.yaml', 'infrastructure/clusters/cl01tl/helm/**/Chart.lock') }}
restore-keys: |
helm-cache-${{ runner.os }}-
- name: Prepare Manifest Branch - name: Prepare Manifest Branch
run: | run: |
cd ${MANIFEST_DIR} cd "${MANIFEST_DIR}"
echo ""
echo ">> Configure git to use gitea-bot as user ..." echo ">> Configure git to use gitea-bot as user ..."
git config user.name "gitea-bot" git config user.name "gitea-bot"
git config user.email "gitea-bot@alexlebens.net" git config user.email "gitea-bot@alexlebens.net"
echo ">> Checking if PR branch exists ..." echo ">> Checking if PR branch exists ..."
if [[ $(git ls-remote --heads origin "${BRANCH_NAME}" | wc -l) -gt 0 ]]; then if git ls-remote --exit-code --heads origin "${BRANCH_NAME}" > /dev/null 2>&1; then
echo ""
echo ">> Branch '${BRANCH_NAME}' exists, pulling changes ..." echo ">> Branch '${BRANCH_NAME}' exists, pulling changes ..."
git fetch origin "${BRANCH_NAME}" git fetch origin "${BRANCH_NAME}"
git checkout "${BRANCH_NAME}" git checkout "${BRANCH_NAME}"
git pull --rebase git pull --rebase
else else
echo ""
echo ">> Branch '${BRANCH_NAME}' does not exist, creating ..." echo ">> Branch '${BRANCH_NAME}' does not exist, creating ..."
git checkout -b $BRANCH_NAME git checkout -b "${BRANCH_NAME}"
fi fi
echo "----" echo "----"
@@ -70,38 +85,31 @@ jobs:
- name: Check which Directories have Changes - name: Check which Directories have Changes
id: check-dir-changes id: check-dir-changes
run: | run: |
cd ${MAIN_DIR} cd "${MAIN_DIR}"
RENDER_DIR=()
echo ""
echo ">> Checking for changes ..." echo ">> Checking for changes ..."
GIT_DIFF=$(git diff --name-only ${{ gitea.event.before }}..HEAD | xargs -I {} dirname {} | sort -u | grep -E "clusters/[^/]+/helm/[^/]+")
if [ -n "${GIT_DIFF}" ]; then # Extract the chart names from the git diff
echo ">> Changes detected:" RENDER_DIR=$(git diff --name-only ${{ gitea.event.before }}..HEAD | grep -E "^clusters/${CLUSTER}/helm/" | awk -F '/' '{print $4}' | sort -u || true)
echo "$GIT_DIFF"
for path in $GIT_DIFF; do
RENDER_DIR+=$(echo "$path" | awk -F '/' '{print $4}')
RENDER_DIR+=$(echo " ")
done
else
echo ">> No changes detected"
fi
if [ -n "${RENDER_DIR}" ]; then if [ -n "${RENDER_DIR}" ]; then
echo ""
echo ">> Directories to Render:" echo ">> Directories to Render:"
echo "$(echo "${RENDER_DIR}" | sort -u)" echo "${RENDER_DIR}"
echo "----" echo "----"
echo "changes-detected=true" >> $GITEA_OUTPUT echo "changes-detected=true" >> "$GITEA_OUTPUT"
echo "render-dir<<EOF" >> $GITEA_OUTPUT echo "render-dir<<EOF" >> "$GITEA_OUTPUT"
echo "$(echo "${RENDER_DIR}" | sort -u)" >> $GITEA_OUTPUT echo "${RENDER_DIR}" >> "$GITEA_OUTPUT"
echo "EOF" >> $GITEA_OUTPUT echo "EOF" >> "$GITEA_OUTPUT"
else else
echo "changes-detected=false" >> $GITEA_OUTPUT echo ""
echo ">> No chart changes detected"
echo "changes-detected=false" >> "$GITEA_OUTPUT"
fi fi
- name: Add Repositories - name: Add Repositories
@@ -109,25 +117,31 @@ jobs:
env: env:
RENDER_DIR: ${{ steps.check-dir-changes.outputs.render-dir }} RENDER_DIR: ${{ steps.check-dir-changes.outputs.render-dir }}
run: | run: |
cd ${MAIN_DIR} cd "${MAIN_DIR}"
echo ""
echo ">> Adding repositories for chart dependencies ..." echo ">> Adding repositories for chart dependencies ..."
for dir in ${RENDER_DIR}; do for DIR in ${RENDER_DIR}; do
helm dependency list --max-col-width 120 ${MAIN_DIR}/clusters/${CLUSTER}/helm/$dir 2> /dev/null \ helm dependency list --max-col-width 120 "${MAIN_DIR}/clusters/${CLUSTER}/helm/${DIR}" 2> /dev/null \
| tail +2 | head -n -1 \ | tail -n +2 \
| awk '{ print "helm repo add " $1 " " $3 }' \ | awk 'NF > 0 { print $1, $3 }' \
| while read cmd; do | while read -r REPO_NAME REPO_URL; do
if [[ "$cmd" == "*oci://*" ]]; then if [[ "${REPO_URL}" == oci://* ]]; then
echo ">> Ignoring OCI repo" echo ""
else echo ">> Ignoring OCI repo: ${REPO_URL}"
echo "$cmd" | sh;
elif [[ -n "${REPO_NAME}" && -n "${REPO_URL}" ]]; then
helm repo add "${REPO_NAME}" "${REPO_URL}"
fi fi
done || true done || true
done done
if helm repo list | tail +2 | read -r; then if helm repo list > /dev/null 2>&1; then
echo ""
echo ">> Update repository cache ..." echo ">> Update repository cache ..."
helm repo update helm repo update
fi fi
echo "----" echo "----"
@@ -137,15 +151,17 @@ jobs:
env: env:
RENDER_DIR: ${{ steps.check-dir-changes.outputs.render-dir }} RENDER_DIR: ${{ steps.check-dir-changes.outputs.render-dir }}
run: | run: |
cd ${MANIFEST_DIR} cd "${MANIFEST_DIR}"
echo ""
echo ">> Remove manfiest files and rebuild from source ..." echo ">> Remove manfiest files and rebuild from source ..."
for dir in ${RENDER_DIR}; do for DIR in ${RENDER_DIR}; do
chart_path=${MANIFEST_DIR}/clusters/${CLUSTER}/manifests/$dir CHART_PATH=${MANIFEST_DIR}/clusters/${CLUSTER}/manifests/${DIR}
echo "$chart_path" echo ""
rm -rf $chart_path/* echo "${CHART_PATH}"
rm -rf ${CHART_PATH}/*
done done
echo "----" echo "----"
@@ -158,60 +174,57 @@ jobs:
run: | run: |
cd ${MAIN_DIR} cd ${MAIN_DIR}
echo ""
echo ">> Rendering Manifests ..." echo ">> Rendering Manifests ..."
for dir in ${RENDER_DIR}; do render_chart() {
chart_path=${MAIN_DIR}/clusters/${CLUSTER}/helm/$dir local DIR="$1"
chart_name=$(basename "$chart_path") local CHART_PATH="${MAIN_DIR}/clusters/${CLUSTER}/helm/${DIR}"
local CHART_NAME=$(basename "${CHART_PATH}")
echo "" echo ""
echo "" echo ">> Rendering ..."
echo ">> Rendering chart: $chart_name" echo ">> Chart: ${CHART_NAME}"
echo ">> Chart path $chart_path" echo ">> Path: ${CHART_PATH}"
if [ -f "$chart_path/Chart.yaml" ]; then if [ -f "${CHART_PATH}/Chart.yaml" ]; then
OUTPUT_FOLDER="${MANIFEST_DIR}/clusters/${CLUSTER}/manifests/$chart_name/" local OUTPUT_FOLDER="${MANIFEST_DIR}/clusters/${CLUSTER}/manifests/${CHART_NAME}/"
TEMPLATE=""
mkdir -p ${MANIFEST_DIR}/clusters/${CLUSTER}/manifests/$chart_name mkdir -p "${OUTPUT_FOLDER}"
cd "${CHART_PATH}"
cd $chart_path
echo "" echo ""
echo ">> Updating helm dependency ..." echo ">> Updating helm dependencies ..."
helm dependency update --skip-refresh helm dependency update --skip-refresh > /dev/null
echo "" echo ""
echo ">> Building helm dependency ..." echo ">> Linting helm chart ..."
helm dependency build --skip-refresh helm lint --namespace "${CHART_NAME}" --quiet
echo "" local NAMESPACE="${CHART_NAME}"
echo ">> Linting helm ..." case "${CHART_NAME}" in
helm lint --namespace "$chart_name"
echo ""
echo ">> Rendering templates ..."
case "$chart_name" in
"stack") "stack")
NAMESPACE="argocd"
echo "" echo ""
echo ">> Special Rendering for stack into argocd namespace ..." echo ">> Special Rendering into 'argocd' namespace ..."
TEMPLATE=$(helm template $chart_name ./ --namespace argocd --include-crds --dry-run=server --api-versions "gateway.networking.k8s.io/v1/HTTPRoute")
;; ;;
"cilium" | "coredns" | "metrics-server" |"prometheus-operator-crds") "cilium" | "coredns" | "metrics-server" | "prometheus-operator-crds")
NAMESPACE="kube-system"
echo "" echo ""
echo ">> Special Rendering for $chart_name into kube-system namespace ..." echo ">> Special Rendering for ${CHART_NAME} into 'kube-system' namespace ..."
TEMPLATE=$(helm template $chart_name ./ --namespace kube-system --include-crds --dry-run=server --api-versions "gateway.networking.k8s.io/v1/HTTPRoute")
;; ;;
*) *)
echo "" echo ""
echo ">> Standard Rendering for $chart_name ..." echo ">> Standard Rendering for ${CHART_NAME} ..."
TEMPLATE=$(helm template "$chart_name" ./ --namespace "$chart_name" --include-crds --dry-run=server --api-versions "gateway.networking.k8s.io/v1/HTTPRoute")
;;
esac esac
echo "" echo ""
echo ">> Formating rendered template ..." echo ">> Formating rendered template ..."
echo "$TEMPLATE" | yq '... comments=""' | yq 'select(. != null)' | yq -s '"'"$OUTPUT_FOLDER"'" + .kind + "-" + .metadata.name + ".yaml"' local TEMPLATE
TEMPLATE=$(helm template "${CHART_NAME}" ./ --namespace "${NAMESPACE}" --include-crds --dry-run=server --api-versions "gateway.networking.k8s.io/v1/HTTPRoute")
# Format and split rendered template
echo "${TEMPLATE}" | yq '... comments=""' | yq 'select(. != null)' | yq -s '"'"${OUTPUT_FOLDER}"'" + .kind + "-" + .metadata.name + ".yaml"'
# Strip comments again to ensure formatting correctness # Strip comments again to ensure formatting correctness
for file in "$OUTPUT_FOLDER"/*; do for file in "$OUTPUT_FOLDER"/*; do
@@ -219,15 +232,23 @@ jobs:
done done
echo "" echo ""
echo ">> Manifests for $chart_name rendered to $OUTPUT_FOLDER" echo ">> Manifests for ${CHART_NAME} rendered to ${OUTPUT_FOLDER}:"
ls $OUTPUT_FOLDER ls $OUTPUT_FOLDER
echo "" echo ""
else else
echo "" echo ""
echo ">> Directory $chart_path does not contain a Chart.yaml. Skipping ..." echo ">> Directory ${CHART_PATH} does not contain a Chart.yaml. Skipping ..."
echo "" echo ""
fi fi
done }
export -f render_chart
export MAIN_DIR CLUSTER MANIFEST_DIR
# Run rendering in parallel
for DIR in ${RENDER_DIR}; do
echo "${DIR}"
done | xargs -n 1 -P 4 -I {} bash -c 'render_chart "$@"' _ {}
echo "----" echo "----"
@@ -235,16 +256,18 @@ jobs:
id: check-changes id: check-changes
if: steps.check-dir-changes.outputs.changes-detected == 'true' if: steps.check-dir-changes.outputs.changes-detected == 'true'
run: | run: |
cd ${MANIFEST_DIR} cd "${MANIFEST_DIR}"
GIT_CHANGES=$(git status --porcelain) GIT_CHANGES=$(git status --porcelain)
if [ -n "$GIT_CHANGES" ]; then if [ -n "${GIT_CHANGES}" ]; then
echo ""
echo ">> Changes detected" echo ">> Changes detected"
git status --porcelain git status --porcelain
echo "changes-detected=true" >> $GITEA_OUTPUT echo "changes-detected=true" >> $GITEA_OUTPUT
else else
echo ""
echo ">> No changes detected, skipping PR creation" echo ">> No changes detected, skipping PR creation"
fi fi
@@ -255,20 +278,23 @@ jobs:
id: commit-push id: commit-push
if: steps.check-changes.outputs.changes-detected == 'true' if: steps.check-changes.outputs.changes-detected == 'true'
run: | run: |
cd ${MANIFEST_DIR} cd "${MANIFEST_DIR}"
echo ""
echo ">> Commiting changes to ${BRANCH_NAME} ..." echo ">> Commiting changes to ${BRANCH_NAME} ..."
git add . git add .
git commit -m "chore: Update manifests after change" git commit -m "chore: Update manifests after change"
REPO_URL="${{ secrets.REPO_URL }}/${{ gitea.repository }}" REPO_URL="${{ secrets.REPO_URL }}/${{ gitea.repository }}"
echo ">> Pushing changes to $REPO_URL ..." echo ""
git push -u "https://oauth2:${{ secrets.BOT_TOKEN }}@$(echo $REPO_URL | sed -e 's|https://||')" ${BRANCH_NAME} echo ">> Pushing changes to ${REPO_URL} ..."
git push -u "https://oauth2:${{ secrets.BOT_TOKEN }}@${REPO_URL#*://}" "${BRANCH_NAME}"
echo "----" echo "----"
echo "HEAD_BRANCH=${BRANCH_NAME}" >> $GITEA_OUTPUT echo "HEAD_BRANCH=${BRANCH_NAME}" >> "$GITEA_OUTPUT"
echo "push=true" >> $GITEA_OUTPUT echo "push=true" >> "$GITEA_OUTPUT"
- name: Check for Pull Request - name: Check for Pull Request
id: check-for-pull-requst id: check-for-pull-requst

View File

@@ -0,0 +1,624 @@
name: render-manifests
on:
schedule:
- cron: '0 15 * * *'
workflow_dispatch:
pull_request:
branches:
- main
paths:
- 'clusters/cl01tl/helm/**'
types:
- closed
env:
CLUSTER: cl01tl
BASE_BRANCH: manifests
BRANCH_NAME_BASE: auto/update-manifests
ASSIGNEE: alexlebens
MAIN_DIR: /workspace/alexlebens/infrastructure/infrastructure
MANIFEST_DIR: /workspace/alexlebens/infrastructure/infrastructure-manifests
jobs:
render-manifests:
runs-on: ubuntu-js
if: >-
github.event_name == 'schedule' ||
github.event_name == 'workflow_dispatch' ||
(github.event_name == 'pull_request' && github.event.pull_request.merged == true)
steps:
- name: Checkout Main
uses: actions/checkout@v6
with:
path: infrastructure
fetch-depth: 0
- name: Checkout Manifests
uses: actions/checkout@v6
with:
ref: manifests
path: infrastructure-manifests
- name: Set Up Helm
uses: azure/setup-helm@v4
with:
token: ${{ secrets.GITEA_TOKEN }}
version: v3.17.2 # Pending https://github.com/helm/helm/pull/30743
cache: true
- name: Configure Kubeconfig
uses: azure/k8s-set-context@v4
with:
method: kubeconfig
kubeconfig: ${{ secrets.KUBECONFIG }}
- name: Cache Helm Dependencies
uses: actions/cache@v5
with:
path: |
~/.cache/helm
~/.config/helm
key: helm-cache-${{ runner.os }}-${{ hashFiles('infrastructure/clusters/cl01tl/helm/**/Chart.yaml', 'infrastructure/clusters/cl01tl/helm/**/Chart.lock') }}
restore-keys: |
helm-cache-${{ runner.os }}-
- name: Determine Workflow Mode
id: mode
run: |
IS_AUTOMERGE="false"
RENDER_ALL="false"
DIFF_TARGET=""
if [[ "${{ github.event_name }}" == "schedule" || "${{ github.event_name }}" == "workflow_dispatch" ]]; then
echo ">> Mode: Dispatch/Schedule (Render All)"
RENDER_ALL="true"
elif [[ "${{ github.event_name }}" == "pull_request" ]]; then
if [[ "${{ contains(github.event.pull_request.labels.*.name, 'automerge') }}" == "true" ]]; then
echo ">> Mode: PR Merged (Automerge)"
IS_AUTOMERGE="true"
else
echo ">> Mode: PR Merged (Standard)"
fi
DIFF_TARGET="HEAD^..HEAD"
fi
echo ""
echo "----"
echo "is-automerge=${IS_AUTOMERGE}" >> "$GITHUB_OUTPUT"
echo "render-all=${RENDER_ALL}" >> "$GITHUB_OUTPUT"
echo "diff-target=${DIFF_TARGET}" >> "$GITHUB_OUTPUT"
- name: Prepare Manifest Branch
id: prepare-manifest-branch
env:
PR_NUMBER: ${{ github.event.pull_request.number }}
IS_AUTOMERGE: ${{ steps.mode.outputs.is-automerge }}
run: |
cd "${MANIFEST_DIR}"
echo ">> Configure git to use gitea-bot as user ..."
git config user.name "gitea-bot"
git config user.email "gitea-bot@alexlebens.net"
if [[ "$IS_AUTOMERGE" == "true" ]]; then
BRANCH_NAME="${BRANCH_NAME_BASE}-automerge-${PR_NUMBER}"
echo ""
echo ">> Creating branch ${BRANCH_NAME} ..."
git checkout -B "$BRANCH_NAME"
else
echo ""
echo ">> Checking if PR branch exists ..."
BRANCH_NAME="${BRANCH_NAME_BASE}"
if git ls-remote --exit-code --heads origin "${BRANCH_NAME}" > /dev/null 2>&1; then
echo ""
echo ">> Branch '${BRANCH_NAME}' exists, pulling changes ..."
git fetch origin "${BRANCH_NAME}"
git checkout "${BRANCH_NAME}"
git pull --rebase
else
echo ""
echo ">> Branch '${BRANCH_NAME}' does not exist, creating ..."
git checkout -b "${BRANCH_NAME}"
fi
fi
echo ""
echo "----"
echo "branch-name=${BRANCH_NAME}" >> "$GITHUB_OUTPUT"
- name: Check Which Directories Have Changes
id: check-dir-changes
env:
RENDER_ALL: ${{ steps.mode.outputs.render-all }}
DIFF_TARGET: ${{ steps.mode.outputs.diff-target }}
run: |
cd "${MAIN_DIR}"
if [[ "$RENDER_ALL" == "true" ]]; then
echo ">> Triggered on dispatch, will check all paths ..."
RENDER_DIR=$(find "clusters/${CLUSTER}/helm" -mindepth 1 -maxdepth 1 -type d -exec basename {} \; | sort -u)
else
echo ">> Checking for changes from ${DIFF_TARGET} ..."
RENDER_DIR=$(git diff --name-only "${DIFF_TARGET}" | grep -E "^clusters/${CLUSTER}/helm/" | awk -F '/' '{print $4}' | sort -u || true)
fi
if [ -n "${RENDER_DIR}" ]; then
echo ""
echo ">> Directories to Render:"
echo ""
echo "${RENDER_DIR}"
echo ""
echo "----"
echo "changes-detected=true" >> "$GITHUB_OUTPUT"
echo "render-dir<<EOF" >> "$GITHUB_OUTPUT"
echo "${RENDER_DIR}" >> "$GITHUB_OUTPUT"
echo "EOF" >> "$GITHUB_OUTPUT"
else
echo ""
echo ">> No chart changes detected"
echo ""
echo "----"
echo "changes-detected=false" >> "$GITHUB_OUTPUT"
fi
- name: Add Repositories
if: steps.check-dir-changes.outputs.changes-detected == 'true'
env:
RENDER_DIR: ${{ steps.check-dir-changes.outputs.render-dir }}
run: |
cd "${MAIN_DIR}"
echo ">> Adding repositories for chart dependencies ..."
echo ""
for DIR in ${RENDER_DIR}; do
helm dependency list --max-col-width 120 "${MAIN_DIR}/clusters/${CLUSTER}/helm/${DIR}" 2> /dev/null \
| tail -n +2 \
| awk 'NF > 0 { print $1, $3 }' \
| while read -r REPO_NAME REPO_URL; do
if [[ "${REPO_URL}" == oci://* ]]; then
echo ">> Ignoring OCI repo: ${REPO_URL}"
elif [[ -n "${REPO_NAME}" && -n "${REPO_URL}" ]]; then
helm repo add "${REPO_NAME}" "${REPO_URL}"
fi
done || true
done
if helm repo list > /dev/null 2>&1; then
echo ""
echo ">> Update repository cache ..."
helm repo update
fi
echo ""
echo "----"
- name: Remove Changed Manifest Files
if: steps.check-dir-changes.outputs.changes-detected == 'true'
env:
RENDER_DIR: ${{ steps.check-dir-changes.outputs.render-dir }}
run: |
cd "${MANIFEST_DIR}"
echo ">> Remove manifest files and rebuild from source ..."
echo ""
for DIR in ${RENDER_DIR}; do
CHART_PATH="${MANIFEST_DIR}/clusters/${CLUSTER}/manifests/${DIR}"
echo "${CHART_PATH}"
rm -rf "${CHART_PATH}"/*
done
echo ""
echo "----"
- name: Render Helm Manifests
id: render-manifests
if: steps.check-dir-changes.outputs.changes-detected == 'true'
env:
RENDER_DIR: ${{ steps.check-dir-changes.outputs.render-dir }}
run: |
cd "${MAIN_DIR}"
echo ">> Rendering Manifests ..."
render_chart() {
local DIR="$1"
local CHART_PATH="${MAIN_DIR}/clusters/${CLUSTER}/helm/${DIR}"
local CHART_NAME=$(basename "${CHART_PATH}")
echo ""
echo ">> Rendering chart: ${CHART_NAME}"
if [ -f "${CHART_PATH}/Chart.yaml" ]; then
local OUTPUT_FOLDER="${MANIFEST_DIR}/clusters/${CLUSTER}/manifests/${CHART_NAME}/"
mkdir -p "${OUTPUT_FOLDER}"
cd "${CHART_PATH}"
helm dependency update --skip-refresh > /dev/null
helm lint --namespace "${CHART_NAME}" --quiet
local NAMESPACE="${CHART_NAME}"
case "${CHART_NAME}" in
"stack")
NAMESPACE="argocd"
echo ">> Special Rendering into 'argocd' namespace ..."
;;
"cilium" | "coredns" | "metrics-server" | "prometheus-operator-crds")
NAMESPACE="kube-system"
echo ">> Special Rendering for ${CHART_NAME} into 'kube-system' namespace ..."
;;
*)
echo ">> Standard Rendering ..."
esac
echo ">> Formating rendered template ..."
local TEMPLATE
TEMPLATE=$(helm template "${CHART_NAME}" ./ --namespace "${NAMESPACE}" --include-crds --dry-run=server --api-versions "gateway.networking.k8s.io/v1/HTTPRoute")
# Format and split rendered template
echo "${TEMPLATE}" | yq '... comments=""' | yq 'select(. != null)' | yq -s '"'"${OUTPUT_FOLDER}"'" + .kind + "-" + .metadata.name + ".yaml"'
# Strip comments again to ensure formatting correctness
for file in "$OUTPUT_FOLDER"/*; do
yq -i '... comments=""' $file
done
echo ">> Manifests for ${CHART_NAME} rendered successfully to $OUTPUT_FOLDER:"
echo ""
ls $OUTPUT_FOLDER
echo ""
else
echo ""
echo ">> Directory ${CHART_PATH} does not contain a Chart.yaml. Skipping ..."
fi
}
export -f render_chart
export MAIN_DIR CLUSTER MANIFEST_DIR
# Run rendering in parallel
for DIR in ${RENDER_DIR}; do
echo "${DIR}"
done | xargs -P 4 -I {} bash -c 'OUT=$(render_chart "$@" 2>&1); printf "%s\n" "$OUT"' _ {}
echo ""
echo "----"
- name: Check for Changes
id: check-changes
if: steps.check-dir-changes.outputs.changes-detected == 'true'
run: |
cd "${MANIFEST_DIR}"
GIT_CHANGES=$(git status --porcelain)
if [ -n "${GIT_CHANGES}" ]; then
echo ">> Changes detected"
git status --porcelain
CHANGED_CHARTS=$(echo "$GIT_CHANGES" | grep -oE "clusters/${CLUSTER}/manifests/[^/]+" | awk -F '/' '{print $4}' | sort -u | paste -sd ',' -)
echo ""
echo "----"
echo "changes-detected=true" >> "$GITHUB_OUTPUT"
echo "changed-charts-csv=${CHANGED_CHARTS}" >> "$GITHUB_OUTPUT"
else
echo ">> No changes detected, skipping PR creation"
echo ""
echo "----"
fi
- name: Commit and Push Changes
id: commit-push
if: steps.check-changes.outputs.changes-detected == 'true'
env:
BRANCH_NAME: ${{ steps.prepare-manifest-branch.outputs.branch-name }}
IS_AUTOMERGE: ${{ steps.mode.outputs.is-automerge }}
run: |
cd "${MANIFEST_DIR}"
MSG="chore: Update manifests after change"
if [[ "$IS_AUTOMERGE" == "true" ]]; then
MSG="chore: Update manifests after automerge"
fi
echo ">> Commiting changes to ${BRANCH_NAME} ..."
git add .
git commit -m "${MSG}"
REPO_URL="${{ secrets.REPO_URL }}/${{ gitea.repository }}"
echo ""
echo ">> Pushing changes to ${REPO_URL} ..."
git push -u "https://oauth2:${{ secrets.BOT_TOKEN }}@${REPO_URL#*://}" "${BRANCH_NAME}"
echo ""
echo "----"
echo "push=true" >> "$GITHUB_OUTPUT"
echo "head-branch=${BRANCH_NAME}" >> "$GITHUB_OUTPUT"
- name: Check for Pull Request
id: check-for-pull-request
if: steps.commit-push.outputs.push == 'true' && steps.mode.outputs.is-automerge == 'false'
env:
GITEA_TOKEN: ${{ secrets.BOT_TOKEN }}
GITEA_URL: ${{ secrets.REPO_URL }}
HEAD_BRANCH: ${{ steps.commit-push.outputs.head-branch }}
run: |
cd "${MANIFEST_DIR}"
API_ENDPOINT="${GITEA_URL}/api/v1/repos/${{ gitea.repository }}/pulls?base_branch=${BASE_BRANCH}&state=open&page=1"
echo ">> Checking if PR from branch ${HEAD_BRANCH} into ${BASE_BRANCH}"
echo ">> With Endpoint of:"
echo "$API_ENDPOINT"
HTTP_STATUS=$(curl -X GET -s -w '%{http_code}' -o response_body.json -H "Authorization: token ${GITEA_TOKEN}" -H "Content-Type: application/json" "$API_ENDPOINT")
if [ "$HTTP_STATUS" == "200" ] && [ "$(cat response_body.json | jq -r .[0].state)" == "open" ]; then
echo ""
echo ">> Pull Request has been found open, will update"
echo ""
echo "----"
echo "pull-request-exists=$(cat response_body.json | jq -r .[0].number)" >> "$GITHUB_OUTPUT"
else
echo ""
echo ">> Pull Request not found"
echo ""
echo "----"
echo "pull-request-exists=false" >> "$GITHUB_OUTPUT"
fi
- name: Create Pull Request
id: create-pull-request
if: steps.commit-push.outputs.push == 'true' && (steps.mode.outputs.is-automerge == 'true' || steps.check-for-pull-request.outputs.pull-request-exists == 'false')
env:
IS_AUTOMERGE: ${{ steps.mode.outputs.is-automerge }}
GITEA_TOKEN: ${{ secrets.BOT_TOKEN }}
GITEA_URL: ${{ secrets.REPO_URL }}
HEAD_BRANCH: ${{ steps.commit-push.outputs.head-branch }}
CHARTS: ${{ steps.check-changes.outputs.changed-charts-csv }}
EVENT_NAME: ${{ github.event_name }}
ACTOR: ${{ github.actor }}
SHA: ${{ github.sha }}
REF: ${{ github.ref_name }}
run: |
cd "${MANIFEST_DIR}"
API_ENDPOINT="${GITEA_URL}/api/v1/repos/${{ gitea.repository }}/pulls"
BODY=$(printf "This PR contains newly rendered Kubernetes manifests automatically generated by the CI workflow.\n\n### Details\n- **Trigger**: \`%s\` by \`@%s\`\n- **Commit**: \`%s\` (on \`%s\`)\n- **Charts Updated**: \`%s\`" "${EVENT_NAME}" "${ACTOR}" "${SHA:0:7}" "${REF}" "${CHARTS}")
if [[ "$IS_AUTOMERGE" == "true" ]]; then
TITLE="Automated Manifest Update - Automerge"
BODY=$(printf "%s\n\n_This PR is expected to be automerged._" "${BODY}")
else
TITLE="Automated Manifest Update"
fi
PAYLOAD=$(jq -n --arg head "${HEAD_BRANCH}" --arg base "${BASE_BRANCH}" --arg assignee "${ASSIGNEE}" --arg title "${TITLE}" --arg body "${BODY}" '{head: $head, base: $base, assignee: $assignee, title: $title, body: $body}')
HTTP_STATUS=$(curl -X POST -s -w '%{http_code}' -o response_body.json --data "$PAYLOAD" -H "Authorization: token ${GITEA_TOKEN}" -H "Content-Type: application/json" "$API_ENDPOINT")
if [ "$HTTP_STATUS" == "201" ]; then
echo ">> Pull Request created successfully!"
echo ""
echo "----"
echo "pull-request-id=$(jq -r .id response_body.json)" >> "$GITHUB_OUTPUT"
echo "pull-request-number=$(jq -r .number response_body.json)" >> "$GITHUB_OUTPUT"
echo "pull-request-operation=created" >> "$GITHUB_OUTPUT"
elif [[ "$HTTP_STATUS" == "422" || "$HTTP_STATUS" == "409" ]]; then
echo ""
echo ">> Failed to create PR (Already exists)"
echo ""
echo "----"
else
echo ""
echo ">> Failed to create PR, HTTP status code: $HTTP_STATUS"
echo ""
echo "----"
exit 1
fi
- name: Update Pull Request
id: update-pull-request
if: steps.commit-push.outputs.push == 'true' && steps.check-for-pull-request.outputs.pull-request-exists != 'false' && steps.mode.outputs.is-automerge == 'false'
env:
GITEA_TOKEN: ${{ secrets.BOT_TOKEN }}
GITEA_URL: ${{ secrets.REPO_URL }}
PR_NUMBER: ${{ steps.check-for-pull-request.outputs.pull-request-exists }}
CHARTS: ${{ steps.check-changes.outputs.changed-charts-csv }}
EVENT_NAME: ${{ github.event_name }}
ACTOR: ${{ github.actor }}
SHA: ${{ github.sha }}
REF: ${{ github.ref_name }}
run: |
cd "${MANIFEST_DIR}"
API_ENDPOINT="${GITEA_URL}/api/v1/repos/${{ gitea.repository }}/pulls/${PR_NUMBER}"
EXISTING_BODY=$(jq -r '.[0].body' response_body.json)
NEW_DETAILS=$(printf "### Update Details (%s)\n- **Trigger**: \`%s\` by \`@%s\`\n- **Commit**: \`%s\` (on \`%s\`)\n- **Charts Updated**: \`%s\`" "$(date -u +'%Y-%m-%d %H:%M UTC')" "${EVENT_NAME}" "${ACTOR}" "${SHA:0:7}" "${REF}" "${CHARTS}")
UPDATED_BODY=$(printf "%s\n\n%s" "${EXISTING_BODY}" "${NEW_DETAILS}")
PAYLOAD=$(jq -n --arg body "${UPDATED_BODY}" '{body: $body}')
HTTP_STATUS=$(curl -X PATCH -s -w '%{http_code}' -o update_response.json --data "$PAYLOAD" -H "Authorization: token ${GITEA_TOKEN}" -H "Content-Type: application/json" "$API_ENDPOINT")
if [ "$HTTP_STATUS" == "201" ] || [ "$HTTP_STATUS" == "200" ]; then
echo ">> Pull Request updated successfully!"
echo ""
echo "----"
echo "pull-request-operation=updated" >> "$GITHUB_OUTPUT"
else
echo ">> Failed to update PR, HTTP status code: $HTTP_STATUS"; exit 1
echo ""
echo "----"
fi
- name: Merge Changes
id: merge-changes
if: steps.commit-push.outputs.push == 'true' && steps.mode.outputs.is-automerge == 'true'
env:
GITEA_TOKEN: ${{ secrets.BOT_TOKEN }}
GITEA_URL: ${{ secrets.REPO_URL }}
PR_NUMBER: ${{ steps.create-pull-request.outputs.pull-request-number }}
run: |
cd "${MANIFEST_DIR}"
API_ENDPOINT="${GITEA_URL}/api/v1/repos/${{ gitea.repository }}/pulls/${PR_NUMBER}/merge"
PAYLOAD=$(jq -n --arg Do "merge" '{Do: $Do}')
HTTP_STATUS=$(curl -X POST -s -w '%{http_code}' -o response_body.json --data "$PAYLOAD" -H "Authorization: token ${GITEA_TOKEN}" -H "Content-Type: application/json" "$API_ENDPOINT")
if [ "$HTTP_STATUS" == "200" ]; then
echo ">> Pull Request merged successfully!"
echo ""
echo "----"
echo "pull-request-operation=merged" >> "$GITHUB_OUTPUT"
else
echo ">> Failed to merge PR, HTTP status code: $HTTP_STATUS"; exit 1
echo ""
echo "----"
fi
- name: Cleanup Branch
if: failure() && steps.mode.outputs.is-automerge == 'true'
env:
BRANCH_NAME: ${{ steps.prepare-manifest-branch.outputs.branch-name }}
run: |
cd "${MANIFEST_DIR}"
echo ">> Removing branch: ${BRANCH_NAME}"
git push origin --delete "${BRANCH_NAME}" || true
echo ""
echo "----"
- name: ntfy Created
uses: niniyas/ntfy-action@master
if: steps.create-pull-request.outputs.pull-request-operation == 'created' && steps.mode.outputs.is-automerge == 'false'
with:
url: "${{ secrets.NTFY_URL }}"
topic: "${{ secrets.NTFY_TOPIC }}"
title: "Manifest Render - Open PR"
priority: 3
headers: '{"Authorization": "Bearer ${{ secrets.NTFY_CRED }}"}'
tags: action,successfully,completed
details: "Created renderd manifests for cluster '${{ env.CLUSTER }}' with charts: ${{ steps.check-changes.outputs.changed-charts-csv }}"
icon: "https://cdn.jsdelivr.net/gh/selfhst/icons/png/gitea.png"
actions: '[{"action": "view", "label": "View PR", "url": "${{ vars.USER_URL }}/${{ github.repository }}/pulls/${{ steps.create-pull-request.outputs.pull-request-number }}", "clear": true}]'
- name: ntfy Updated
uses: niniyas/ntfy-action@master
if: steps.commit-push.outputs.push == 'true' && steps.check-for-pull-request.outputs.pull-request-exists != 'false' && steps.mode.outputs.is-automerge == 'false'
with:
url: "${{ secrets.NTFY_URL }}"
topic: "${{ secrets.NTFY_TOPIC }}"
title: "Manifest Render - PR Updated"
priority: 3
headers: '{"Authorization": "Bearer ${{ secrets.NTFY_CRED }}"}'
tags: action,successfully,completed
details: "Updated rendered manifests PR for cluster '${{ env.CLUSTER }}' with charts: ${{ steps.check-changes.outputs.changed-charts-csv }}"
icon: "https://cdn.jsdelivr.net/gh/selfhst/icons/png/gitea.png"
actions: '[{"action": "view", "label": "View PR", "url": "${{ vars.USER_URL }}/${{ github.repository }}/pulls/${{ steps.create-pull-request.outputs.pull-request-number }}", "clear": true}]'
- name: ntfy Merged
uses: niniyas/ntfy-action@master
if: steps.merge-changes.outputs.pull-request-operation == 'merged'
with:
url: "${{ secrets.NTFY_URL }}"
topic: "${{ secrets.NTFY_TOPIC }}"
title: "Manifest Render - Automerged"
priority: 3
headers: '{"Authorization": "Bearer ${{ secrets.NTFY_CRED }}"}'
tags: action,successfully,completed
details: "Automerged manifest rendering for cluster '${{ env.CLUSTER }}' with charts: ${{ steps.check-changes.outputs.changed-charts-csv }}"
icon: "https://cdn.jsdelivr.net/gh/selfhst/icons/png/gitea.png"
actions: '[{"action": "view", "label": "View PR", "url": "${{ vars.USER_URL }}/${{ github.repository }}/pulls/${{ steps.create-pull-request.outputs.pull-request-number }}", "clear": true}]'
- name: ntfy Failed
uses: niniyas/ntfy-action@master
if: failure()
with:
url: "${{ secrets.NTFY_URL }}"
topic: "${{ secrets.NTFY_TOPIC }}"
title: "Manifest Render Failure"
priority: 4
headers: '{"Authorization": "Bearer ${{ secrets.NTFY_CRED }}"}'
tags: action,failed
details: "Manifest rendering for Infrastructure has failed!"
icon: "https://cdn.jsdelivr.net/gh/selfhst/icons/png/gitea.png"
actions: '[{"action": "view", "label": "View Logs", "url": "${{ vars.USER_URL }}/${{ github.repository }}/actions/runs/${{ github.run_id }}", "clear": true}]'

View File

@@ -1,12 +1,12 @@
dependencies: dependencies:
- name: argo-workflows - name: argo-workflows
repository: https://argoproj.github.io/argo-helm repository: https://argoproj.github.io/argo-helm
version: 0.47.5 version: 1.0.2
- name: argo-events - name: argo-events
repository: https://argoproj.github.io/argo-helm repository: https://argoproj.github.io/argo-helm
version: 2.4.20 version: 2.4.20
- name: postgres-cluster - name: postgres-cluster
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
version: 7.9.1 version: 7.10.0
digest: sha256:5b7f498040dd93f99a00c708c80fcefdb64dcdf473cfd3edcf8a94255b80b3b4 digest: sha256:8d1c2dd011a360d930ed5ff186462f163407077d36ae633898ec5d6ba30a4e8d
generated: "2026-03-12T13:02:52.109982708Z" generated: "2026-03-15T20:04:18.080966008Z"

View File

@@ -18,14 +18,14 @@ maintainers:
- name: alexlebens - name: alexlebens
dependencies: dependencies:
- name: argo-workflows - name: argo-workflows
version: 0.47.5 version: 1.0.2
repository: https://argoproj.github.io/argo-helm repository: https://argoproj.github.io/argo-helm
- name: argo-events - name: argo-events
version: 2.4.20 version: 2.4.20
repository: https://argoproj.github.io/argo-helm repository: https://argoproj.github.io/argo-helm
- name: postgres-cluster - name: postgres-cluster
alias: postgres-18-cluster alias: postgres-18-cluster
version: 7.9.1 version: 7.10.0
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
icon: https://cdn.jsdelivr.net/gh/selfhst/icons/png/argo-cd.png icon: https://cdn.jsdelivr.net/gh/selfhst/icons/png/argo-cd.png
# renovate: datasource=github-releases depName=argoproj/argo-workflows # renovate: datasource=github-releases depName=argoproj/argo-workflows

View File

@@ -1,4 +1,14 @@
argo-workflows: argo-workflows:
crds:
install: true
keep: true
# -- Use full CRDs with complete OpenAPI schemas. When false, uses minified CRDs with x-kubernetes-preserve-unknown-fields.
# Full CRDs are very large and are installed via a pre-install/pre-upgrade hook Job that uses server-side apply.
full: true
upgradeJob:
image:
repository: registry.k8s.io/kubectl
tag: v1.35.2
controller: controller:
metricsConfig: metricsConfig:
enabled: true enabled: true

View File

@@ -7,9 +7,9 @@ dependencies:
version: 2.4.0 version: 2.4.0
- name: postgres-cluster - name: postgres-cluster
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
version: 7.9.1 version: 7.10.0
- name: valkey - name: valkey
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
version: 0.4.0 version: 0.4.0
digest: sha256:abb34b7bb54393236e695453aa1940497cb4def3d3a56a45ca004a22f8e05648 digest: sha256:8c353c5dad4c3d04d518c1445497f0d1cb64261a4201ae17a2c0874454b807a7
generated: "2026-03-11T22:55:49.936164674Z" generated: "2026-03-15T20:04:35.99407071Z"

View File

@@ -28,7 +28,7 @@ dependencies:
version: 2.4.0 version: 2.4.0
- name: postgres-cluster - name: postgres-cluster
alias: postgres-18-cluster alias: postgres-18-cluster
version: 7.9.1 version: 7.10.0
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
- name: valkey - name: valkey
alias: valkey alias: valkey

View File

@@ -6,7 +6,7 @@ keywords:
- bazarr - bazarr
- servarr - servarr
- subtitles - subtitles
home: https://wiki.alexlebens.dev/s/92784d53-1d43-42fd-b509-f42c73454226 home: https://wiki.alexlebens.dev/s/
sources: sources:
- https://github.com/morpheus65535/bazarr - https://github.com/morpheus65535/bazarr
- https://github.com/linuxserver/docker-bazarr - https://github.com/linuxserver/docker-bazarr

View File

@@ -4,12 +4,12 @@ dependencies:
version: 4.6.2 version: 4.6.2
- name: mariadb-cluster - name: mariadb-cluster
repository: https://helm.mariadb.com/mariadb-operator repository: https://helm.mariadb.com/mariadb-operator
version: 25.10.4 version: 26.3.0
- name: volsync-target - name: volsync-target
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
version: 0.8.0 version: 0.8.0
- name: volsync-target - name: volsync-target
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
version: 0.8.0 version: 0.8.0
digest: sha256:d4c7bf75f72f7eab4ad968bf9f55daac9392c9b2df08f8a27c5dc4f8fffb5f57 digest: sha256:e65fa008c652092da5431e9780eb2a87c944298a12e58e432efad61c9e826da5
generated: "2026-03-06T01:06:05.696573273Z" generated: "2026-03-14T23:57:22.721295098Z"

View File

@@ -18,7 +18,7 @@ dependencies:
repository: https://bjw-s-labs.github.io/helm-charts/ repository: https://bjw-s-labs.github.io/helm-charts/
version: 4.6.2 version: 4.6.2
- name: mariadb-cluster - name: mariadb-cluster
version: 25.10.4 version: 26.3.0
repository: https://helm.mariadb.com/mariadb-operator repository: https://helm.mariadb.com/mariadb-operator
- name: volsync-target - name: volsync-target
alias: volsync-target-config alias: volsync-target-config
@@ -30,4 +30,4 @@ dependencies:
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
icon: https://cdn.jsdelivr.net/gh/selfhst/icons/png/booklore.png icon: https://cdn.jsdelivr.net/gh/selfhst/icons/png/booklore.png
# renovate: datasource=github-releases depName=booklore-app/BookLore # renovate: datasource=github-releases depName=booklore-app/BookLore
appVersion: v2.2.0 appVersion: v2.2.1

View File

@@ -9,7 +9,7 @@ booklore:
main: main:
image: image:
repository: ghcr.io/booklore-app/booklore repository: ghcr.io/booklore-app/booklore
tag: v2.2.0 tag: v2.2.1
pullPolicy: IfNotPresent pullPolicy: IfNotPresent
env: env:
- name: TZ - name: TZ

View File

@@ -7,7 +7,7 @@ keywords:
- dns - dns
- network - network
- kubernetes - kubernetes
home: https://wiki.alexlebens.dev/s/43947ec6-a034-449f-8c76-982ac493b072 home: https://wiki.alexlebens.dev/s/
sources: sources:
- https://github.com/coredns/coredns - https://github.com/coredns/coredns
- https://github.com/coredns/helm - https://github.com/coredns/helm

View File

@@ -1,7 +1,7 @@
coredns: coredns:
image: image:
repository: registry.k8s.io/coredns/coredns repository: registry.k8s.io/coredns/coredns
tag: v1.14.1 tag: v1.14.2
replicaCount: 3 replicaCount: 3
resources: resources:
requests: requests:

View File

@@ -4,9 +4,9 @@ dependencies:
version: 4.6.2 version: 4.6.2
- name: postgres-cluster - name: postgres-cluster
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
version: 7.9.1 version: 7.10.0
- name: valkey - name: valkey
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
version: 0.4.0 version: 0.4.0
digest: sha256:9524709cf393c01f28b0d073ef6870a2f1afd46f3bc5f564e73c55450aba8dd0 digest: sha256:7584c2a1613454bbd83b66df46170fd0157df5186842844d483e2dd131398574
generated: "2026-03-11T22:56:11.749729235Z" generated: "2026-03-15T20:04:49.68456485Z"

View File

@@ -18,7 +18,7 @@ dependencies:
version: 4.6.2 version: 4.6.2
- name: postgres-cluster - name: postgres-cluster
alias: postgres-18-cluster alias: postgres-18-cluster
version: 7.9.1 version: 7.10.0
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
- name: valkey - name: valkey
alias: valkey alias: valkey
@@ -26,4 +26,4 @@ dependencies:
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
icon: https://cdn.jsdelivr.net/gh/selfhst/icons@main/png/dawarich.png icon: https://cdn.jsdelivr.net/gh/selfhst/icons@main/png/dawarich.png
# renovate: datasource=github-releases depName=Freika/dawarich # renovate: datasource=github-releases depName=Freika/dawarich
appVersion: 1.3.3 appVersion: 1.3.4

View File

@@ -9,7 +9,7 @@ dawarich:
main: main:
image: image:
repository: freikin/dawarich repository: freikin/dawarich
tag: 1.3.3 tag: 1.3.4
pullPolicy: IfNotPresent pullPolicy: IfNotPresent
command: ["web-entrypoint.sh"] command: ["web-entrypoint.sh"]
args: ["bin/rails", "server", "-p", "3000", "-b", "::"] args: ["bin/rails", "server", "-p", "3000", "-b", "::"]
@@ -106,7 +106,7 @@ dawarich:
sidekiq: sidekiq:
image: image:
repository: freikin/dawarich repository: freikin/dawarich
tag: 1.3.3 tag: 1.3.4
pullPolicy: IfNotPresent pullPolicy: IfNotPresent
command: ["sidekiq-entrypoint.sh"] command: ["sidekiq-entrypoint.sh"]
args: ["sidekiq"] args: ["sidekiq"]

View File

@@ -4,9 +4,9 @@ dependencies:
version: 4.6.2 version: 4.6.2
- name: postgres-cluster - name: postgres-cluster
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
version: 7.9.1 version: 7.10.0
- name: valkey - name: valkey
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
version: 0.4.0 version: 0.4.0
digest: sha256:0b50b4938669a7210930d6ee86a9602611b54cd13774f3386dbad04b4771e7f4 digest: sha256:dfcb5d35e03ecdc4206227d206d36509319f0dcdaed54363840d71337debb3f7
generated: "2026-03-11T22:56:26.818980186Z" generated: "2026-03-15T20:05:03.156596646Z"

View File

@@ -23,7 +23,7 @@ dependencies:
version: 4.6.2 version: 4.6.2
- name: postgres-cluster - name: postgres-cluster
alias: postgres-18-cluster alias: postgres-18-cluster
version: 7.9.1 version: 7.10.0
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
- name: valkey - name: valkey
alias: valkey alias: valkey

View File

@@ -7,9 +7,9 @@ dependencies:
version: 2.4.0 version: 2.4.0
- name: postgres-cluster - name: postgres-cluster
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
version: 7.9.1 version: 7.10.0
- name: volsync-target - name: volsync-target
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
version: 0.8.0 version: 0.8.0
digest: sha256:a3703e245881145524304af8a03c89d309c602479be3f7f8953c2fba120bf341 digest: sha256:a7bdbecd50433fedd65d3043102fe3c9e366dc98953c37eb0cfe762bce833e8e
generated: "2026-03-11T22:56:41.856429843Z" generated: "2026-03-15T20:05:14.085780861Z"

View File

@@ -26,7 +26,7 @@ dependencies:
version: 2.4.0 version: 2.4.0
- name: postgres-cluster - name: postgres-cluster
alias: postgres-18-cluster alias: postgres-18-cluster
version: 7.9.1 version: 7.10.0
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
- name: volsync-target - name: volsync-target
alias: volsync-target-data alias: volsync-target-data

View File

@@ -4,9 +4,9 @@ dependencies:
version: 1.5.0 version: 1.5.0
- name: postgres-cluster - name: postgres-cluster
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
version: 7.9.1 version: 7.10.0
- name: volsync-target - name: volsync-target
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
version: 0.8.0 version: 0.8.0
digest: sha256:2fe7c088e99a11e0c6dd09fe48bb1e292eb58e22d9f8ff681bb6c6790945d54e digest: sha256:83ec84774e0cc708f1cb5d83d657180159bfb75c9928784ebf0280e224b1cbca
generated: "2026-03-11T22:56:56.957400817Z" generated: "2026-03-15T20:05:27.625292422Z"

View File

@@ -22,7 +22,7 @@ dependencies:
version: 1.5.0 version: 1.5.0
- name: postgres-cluster - name: postgres-cluster
alias: postgres-18-cluster alias: postgres-18-cluster
version: 7.9.1 version: 7.10.0
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
- name: volsync-target - name: volsync-target
alias: volsync-target-data alias: volsync-target-data

View File

@@ -1,6 +1,6 @@
dependencies: dependencies:
- name: generic-device-plugin - name: generic-device-plugin
repository: https://gitea.alexlebens.dev/api/packages/alexlebens/helm repository: https://gitea.alexlebens.dev/api/packages/alexlebens/helm
version: 0.20.21 version: 0.20.22
digest: sha256:4f1359a01b8b85722ab1805426a86f3ea64d0134513ce14fe9c55f3f918a21fb digest: sha256:14e5aa3f02ce6a1271dadc3f76997c739fc9434e669b05655c079d0b873c56ca
generated: "2026-03-09T23:02:42.799515974Z" generated: "2026-03-15T20:35:40.676997293Z"

View File

@@ -15,6 +15,6 @@ maintainers:
dependencies: dependencies:
- name: generic-device-plugin - name: generic-device-plugin
repository: https://gitea.alexlebens.dev/api/packages/alexlebens/helm repository: https://gitea.alexlebens.dev/api/packages/alexlebens/helm
version: 0.20.21 version: 0.20.22
icon: https://cdn.jsdelivr.net/gh/selfhst/icons/png/kubernetes.png icon: https://cdn.jsdelivr.net/gh/selfhst/icons/png/kubernetes.png
appVersion: 1.0.0 appVersion: 1.0.0

View File

@@ -13,7 +13,7 @@ dependencies:
version: 2.4.0 version: 2.4.0
- name: postgres-cluster - name: postgres-cluster
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
version: 7.9.1 version: 7.10.0
- name: valkey - name: valkey
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
version: 0.4.0 version: 0.4.0
@@ -23,5 +23,5 @@ dependencies:
- name: volsync-target - name: volsync-target
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
version: 0.8.0 version: 0.8.0
digest: sha256:8f243465537fe443e97a8813e23e95d3608a6a2898b93209d03cf43f4ca8cc5d digest: sha256:095caf06888cd4663eb5d389399ebad167861007b604016fc4907308474558ab
generated: "2026-03-11T22:57:17.026946319Z" generated: "2026-03-15T20:05:41.388335307Z"

View File

@@ -40,7 +40,7 @@ dependencies:
version: 2.4.0 version: 2.4.0
- name: postgres-cluster - name: postgres-cluster
alias: postgres-18-cluster alias: postgres-18-cluster
version: 7.9.1 version: 7.10.0
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
- name: valkey - name: valkey
alias: valkey-gitea alias: valkey-gitea

View File

@@ -57,6 +57,7 @@ gitea:
ROOT_URL: https://gitea.alexlebens.dev ROOT_URL: https://gitea.alexlebens.dev
LOCAL_ROOT_URL: http://gitea-http.gitea.svc.cluster.local:3000 LOCAL_ROOT_URL: http://gitea-http.gitea.svc.cluster.local:3000
START_SSH_SERVER: true START_SSH_SERVER: true
HTTP_PORT: 3000
SSH_DOMAIN: gitea.alexlebens.net SSH_DOMAIN: gitea.alexlebens.net
SSH_PORT: 22 SSH_PORT: 22
SSH_LISTEN_PORT: 22 SSH_LISTEN_PORT: 22

View File

@@ -4,12 +4,12 @@ dependencies:
version: 5.22.1 version: 5.22.1
- name: postgres-cluster - name: postgres-cluster
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
version: 7.9.1 version: 7.10.0
- name: valkey - name: valkey
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
version: 0.4.0 version: 0.4.0
- name: valkey - name: valkey
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
version: 0.4.0 version: 0.4.0
digest: sha256:932d9b24ad52ab2a28311f522714ecbad2bedea512ce48d26fcb95cc74b51af9 digest: sha256:9cbba52d093e40b20917af87263e1fb0e478912440f660543f3527e70452edc7
generated: "2026-03-14T19:50:53.708173087Z" generated: "2026-03-15T20:05:59.855514102Z"

View File

@@ -21,7 +21,7 @@ dependencies:
repository: https://grafana.github.io/helm-charts repository: https://grafana.github.io/helm-charts
- name: postgres-cluster - name: postgres-cluster
alias: postgres-18-cluster alias: postgres-18-cluster
version: 7.9.1 version: 7.10.0
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
- name: valkey - name: valkey
alias: valkey-unified-alerting alias: valkey-unified-alerting

View File

@@ -4,9 +4,9 @@ dependencies:
version: 1.18.2 version: 1.18.2
- name: postgres-cluster - name: postgres-cluster
repository: https://gitea.alexlebens.net/api/packages/alexlebens/helm repository: https://gitea.alexlebens.net/api/packages/alexlebens/helm
version: 7.9.1 version: 7.10.0
- name: valkey - name: valkey
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
version: 0.4.0 version: 0.4.0
digest: sha256:898f51eabee5959b9e7ebe90640cb915cb2dee446e6a6649a29499fecab8b6c7 digest: sha256:14c2b7d09631dbb573e9c9d4613ebe52e330146662da0da15f74c31ec519ed15
generated: "2026-03-11T22:58:00.955579445Z" generated: "2026-03-15T20:06:13.615175051Z"

View File

@@ -21,7 +21,7 @@ dependencies:
repository: https://helm.goharbor.io repository: https://helm.goharbor.io
- name: postgres-cluster - name: postgres-cluster
alias: postgres-18-cluster alias: postgres-18-cluster
version: 7.9.1 version: 7.10.0
repository: https://gitea.alexlebens.net/api/packages/alexlebens/helm repository: https://gitea.alexlebens.net/api/packages/alexlebens/helm
- name: valkey - name: valkey
alias: valkey alias: valkey

View File

@@ -4,12 +4,12 @@ dependencies:
version: 4.6.2 version: 4.6.2
- name: postgres-cluster - name: postgres-cluster
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
version: 7.9.1 version: 7.10.0
- name: valkey - name: valkey
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
version: 0.4.0 version: 0.4.0
- name: volsync-target - name: volsync-target
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
version: 0.8.0 version: 0.8.0
digest: sha256:b886b0a1555ea75fbff52a58ccbf1659acbda20e933107bcbab9b00192aa25bd digest: sha256:b79ea8c506f0172deed820247a33c79329f34426435c8b5eb27b206ac8831b13
generated: "2026-03-11T22:58:20.294240859Z" generated: "2026-03-15T20:06:27.091094433Z"

View File

@@ -20,7 +20,7 @@ dependencies:
version: 4.6.2 version: 4.6.2
- name: postgres-cluster - name: postgres-cluster
alias: postgres-18-cluster alias: postgres-18-cluster
version: 7.9.1 version: 7.10.0
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
- name: valkey - name: valkey
alias: valkey alias: valkey

View File

@@ -4,9 +4,9 @@ dependencies:
version: 4.6.2 version: 4.6.2
- name: postgres-cluster - name: postgres-cluster
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
version: 7.9.1 version: 7.10.0
- name: volsync-target - name: volsync-target
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
version: 0.8.0 version: 0.8.0
digest: sha256:29b92b08c230d5f3abc13949b299acccd1e9f8ff7df1f691a5dec41df5405595 digest: sha256:f779185ce82045b47fc75bf95c4a8215acbd387f44a4bdb764486406d9b03748
generated: "2026-03-11T22:58:35.766813121Z" generated: "2026-03-15T20:06:38.720993367Z"

View File

@@ -21,7 +21,7 @@ dependencies:
version: 4.6.2 version: 4.6.2
- name: postgres-cluster - name: postgres-cluster
alias: postgres-18-cluster alias: postgres-18-cluster
version: 7.9.1 version: 7.10.0
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
- name: volsync-target - name: volsync-target
alias: volsync-target-data alias: volsync-target-data

View File

@@ -4,6 +4,6 @@ dependencies:
version: 4.6.2 version: 4.6.2
- name: postgres-cluster - name: postgres-cluster
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
version: 7.9.1 version: 7.10.0
digest: sha256:833a88f82c14f78d63abea99244f2473bee2f5124a533a898a34844956f62b27 digest: sha256:a6f33512d929c5a1b70bde6c3294902f5d707855aabbaa815f32e23aa54b266f
generated: "2026-03-11T22:58:51.287064579Z" generated: "2026-03-15T20:06:49.233053802Z"

View File

@@ -23,7 +23,7 @@ dependencies:
version: 4.6.2 version: 4.6.2
- name: postgres-cluster - name: postgres-cluster
alias: postgresql-17-fdb-cluster alias: postgresql-17-fdb-cluster
version: 7.9.1 version: 7.10.0
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
icon: https://cdn.jsdelivr.net/gh/selfhst/icons/png/komodo.png icon: https://cdn.jsdelivr.net/gh/selfhst/icons/png/komodo.png
# renovate: datasource=github-releases depName=moghtech/komodo # renovate: datasource=github-releases depName=moghtech/komodo

View File

@@ -1,12 +1,12 @@
dependencies: dependencies:
- name: kube-prometheus-stack - name: kube-prometheus-stack
repository: oci://ghcr.io/prometheus-community/charts repository: oci://ghcr.io/prometheus-community/charts
version: 82.10.3 version: 82.10.4
- name: app-template - name: app-template
repository: https://bjw-s-labs.github.io/helm-charts/ repository: https://bjw-s-labs.github.io/helm-charts/
version: 4.6.2 version: 4.6.2
- name: valkey - name: valkey
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
version: 0.4.0 version: 0.4.0
digest: sha256:37ffa4a21ed29703cae9c9f3fb029566a1dd6af6e0fe8cc3862a2226d6644114 digest: sha256:d6bbbfdd1a781b5eb82c2dc8571836a43d23bf8526eac1bcd40f38030be642db
generated: "2026-03-10T19:02:41.11005238Z" generated: "2026-03-15T20:38:11.961621853Z"

View File

@@ -20,7 +20,7 @@ maintainers:
- name: alexlebens - name: alexlebens
dependencies: dependencies:
- name: kube-prometheus-stack - name: kube-prometheus-stack
version: 82.10.3 version: 82.10.4
repository: oci://ghcr.io/prometheus-community/charts repository: oci://ghcr.io/prometheus-community/charts
- name: app-template - name: app-template
alias: ntfy-alertmanager alias: ntfy-alertmanager

View File

@@ -4,9 +4,9 @@ dependencies:
version: 4.6.2 version: 4.6.2
- name: postgres-cluster - name: postgres-cluster
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
version: 7.9.1 version: 7.10.0
- name: volsync-target - name: volsync-target
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
version: 0.8.0 version: 0.8.0
digest: sha256:d43b95fa1fc70c93541b9d73180406b31059c6cc45aa57a0cc8d9386c64833c3 digest: sha256:0f1a2923a7042b364a817edc64729d5e1c18b0552555c035d974de626f372692
generated: "2026-03-11T22:59:07.151659257Z" generated: "2026-03-15T20:07:00.750754951Z"

View File

@@ -24,7 +24,7 @@ dependencies:
version: 4.6.2 version: 4.6.2
- name: postgres-cluster - name: postgres-cluster
alias: postgres-18-cluster alias: postgres-18-cluster
version: 7.9.1 version: 7.10.0
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
- name: volsync-target - name: volsync-target
alias: volsync-target-config alias: volsync-target-config

View File

@@ -1,9 +1,9 @@
dependencies: dependencies:
- name: mariadb-operator - name: mariadb-operator
repository: https://helm.mariadb.com/mariadb-operator repository: https://helm.mariadb.com/mariadb-operator
version: 25.10.4 version: 26.3.0
- name: mariadb-operator-crds - name: mariadb-operator-crds
repository: https://helm.mariadb.com/mariadb-operator repository: https://helm.mariadb.com/mariadb-operator
version: 26.3.0 version: 26.3.0
digest: sha256:a159f646b8f7501cc5285a508e21dcc96ced71722a3c911b1ee0c73ef7fc0e3a digest: sha256:95f9484c385d08f9b15f55cbb0f8d82c55b8c1a055a4c7697335d4ca51c35d7e
generated: "2026-03-14T18:39:29.639188669Z" generated: "2026-03-14T23:23:02.743862932Z"

View File

@@ -15,11 +15,11 @@ maintainers:
- name: alexlebens - name: alexlebens
dependencies: dependencies:
- name: mariadb-operator - name: mariadb-operator
version: 25.10.4 version: 26.3.0
repository: https://helm.mariadb.com/mariadb-operator repository: https://helm.mariadb.com/mariadb-operator
- name: mariadb-operator-crds - name: mariadb-operator-crds
version: 26.3.0 version: 26.3.0
repository: https://helm.mariadb.com/mariadb-operator repository: https://helm.mariadb.com/mariadb-operator
icon: https://mariadb-operator.github.io/mariadb-operator/assets/mariadb_profile.svg icon: https://mariadb-operator.github.io/mariadb-operator/assets/mariadb_profile.svg
# renovate: datasource=github-releases depName=mariadb-operator/mariadb-operator # renovate: datasource=github-releases depName=mariadb-operator/mariadb-operator
appVersion: 25.10.4 appVersion: 26.3.0

View File

@@ -19,7 +19,7 @@ dependencies:
version: 2.4.0 version: 2.4.0
- name: postgres-cluster - name: postgres-cluster
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
version: 7.9.1 version: 7.10.0
- name: valkey - name: valkey
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
version: 0.4.0 version: 0.4.0
@@ -38,5 +38,5 @@ dependencies:
- name: volsync-target - name: volsync-target
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
version: 0.8.0 version: 0.8.0
digest: sha256:fb87880d3de281064519117d8046d7de14f41450ec8ff8c3c603f0179004768e digest: sha256:1578e2c48447f217e72bffb3afcb6f1f15c427a4acce5dbca830cdd7045b1348
generated: "2026-03-12T11:03:45.232564538Z" generated: "2026-03-15T20:07:12.751000922Z"

View File

@@ -53,7 +53,7 @@ dependencies:
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
- name: postgres-cluster - name: postgres-cluster
alias: postgres-18-cluster alias: postgres-18-cluster
version: 7.9.1 version: 7.10.0
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
- name: valkey - name: valkey
alias: valkey-matrix-synapse alias: valkey-matrix-synapse

View File

@@ -20,4 +20,4 @@ dependencies:
version: 4.6.2 version: 4.6.2
icon: https://cdn.jsdelivr.net/gh/selfhst/icons/png/ntfy.png icon: https://cdn.jsdelivr.net/gh/selfhst/icons/png/ntfy.png
# renovate: datasource=github-releases depName=binwiederhier/ntfy # renovate: datasource=github-releases depName=binwiederhier/ntfy
appVersion: 2.18.0 appVersion: 2.19.0

View File

@@ -9,7 +9,7 @@ ntfy:
main: main:
image: image:
repository: binwiederhier/ntfy repository: binwiederhier/ntfy
tag: v2.18.0 tag: v2.19.0
pullPolicy: IfNotPresent pullPolicy: IfNotPresent
args: ["serve"] args: ["serve"]
env: env:

View File

@@ -4,9 +4,9 @@ dependencies:
version: 4.6.2 version: 4.6.2
- name: postgres-cluster - name: postgres-cluster
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
version: 7.9.1 version: 7.10.0
- name: volsync-target - name: volsync-target
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
version: 0.8.0 version: 0.8.0
digest: sha256:a3201fc53ddfbaeb5a81d08e9d20135fb59174879e20f0b4986b1b8540011e03 digest: sha256:d0f47712bf5d2bab8136c43f1d5bac41860f067b53c741282a4647ce93a7cd93
generated: "2026-03-11T22:59:44.389634096Z" generated: "2026-03-15T20:07:27.179378683Z"

View File

@@ -23,7 +23,7 @@ dependencies:
version: 4.6.2 version: 4.6.2
- name: postgres-cluster - name: postgres-cluster
alias: postgres-18-cluster alias: postgres-18-cluster
version: 7.9.1 version: 7.10.0
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
- name: volsync-target - name: volsync-target
alias: volsync-target-data alias: volsync-target-data

View File

@@ -7,12 +7,12 @@ dependencies:
version: 2.4.0 version: 2.4.0
- name: postgres-cluster - name: postgres-cluster
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
version: 7.9.1 version: 7.10.0
- name: valkey - name: valkey
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
version: 0.4.0 version: 0.4.0
- name: volsync-target - name: volsync-target
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
version: 0.8.0 version: 0.8.0
digest: sha256:1f2e4e46e3ae2985ff3e7708c7d75a36f506f0402e02921d95f797ea0403db93 digest: sha256:02780454fad48c10e95851e73e45e8a98091596d9dce8ada9e361e7212e581df
generated: "2026-03-11T23:00:00.871137498Z" generated: "2026-03-15T20:07:38.818063491Z"

View File

@@ -27,7 +27,7 @@ dependencies:
version: 2.4.0 version: 2.4.0
- name: postgres-cluster - name: postgres-cluster
alias: postgres-18-cluster alias: postgres-18-cluster
version: 7.9.1 version: 7.10.0
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
- name: valkey - name: valkey
alias: valkey alias: valkey
@@ -39,4 +39,4 @@ dependencies:
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
icon: https://cdn.jsdelivr.net/gh/selfhst/icons/png/outline.png icon: https://cdn.jsdelivr.net/gh/selfhst/icons/png/outline.png
# renovate: datasource=github-releases depName=outline/outline # renovate: datasource=github-releases depName=outline/outline
appVersion: 1.5.0 appVersion: 1.6.0

View File

@@ -12,7 +12,7 @@ outline:
main: main:
image: image:
repository: outlinewiki/outline repository: outlinewiki/outline
tag: 1.5.0 tag: 1.6.0
pullPolicy: IfNotPresent pullPolicy: IfNotPresent
env: env:
- name: NODE_ENV - name: NODE_ENV

View File

@@ -4,6 +4,6 @@ dependencies:
version: 4.6.2 version: 4.6.2
- name: postgres-cluster - name: postgres-cluster
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
version: 7.9.1 version: 7.10.0
digest: sha256:e9b0673f31b8309beb326635e784964c41bafc10f3bde7eb17ea316d83076854 digest: sha256:fe266f506edd672979091e0ad12379d6ad7dddd2c982e196e602dcda268d6f76
generated: "2026-03-11T23:00:19.541959816Z" generated: "2026-03-15T20:07:52.831926834Z"

View File

@@ -20,7 +20,7 @@ dependencies:
version: 4.6.2 version: 4.6.2
- name: postgres-cluster - name: postgres-cluster
alias: postgres-18-cluster alias: postgres-18-cluster
version: 7.9.1 version: 7.10.0
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
icon: https://cdn.jsdelivr.net/gh/selfhst/icons/png/photoview.png icon: https://cdn.jsdelivr.net/gh/selfhst/icons/png/photoview.png
# renovate: datasource=github-releases depName=photoview/photoview # renovate: datasource=github-releases depName=photoview/photoview

View File

@@ -7,7 +7,7 @@ dependencies:
version: 2.4.0 version: 2.4.0
- name: postgres-cluster - name: postgres-cluster
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
version: 7.9.1 version: 7.10.0
- name: valkey - name: valkey
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
version: 0.4.0 version: 0.4.0
@@ -17,5 +17,5 @@ dependencies:
- name: volsync-target - name: volsync-target
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
version: 0.8.0 version: 0.8.0
digest: sha256:cf9b71f29450c69550b0f59d792193788f9dd7ffa2c623db27eb423c0f6e3109 digest: sha256:de3fb540df1cf7385a19316741854d01e002740c0bf346f3da0ff3a809b1fc3d
generated: "2026-03-11T23:00:37.739141183Z" generated: "2026-03-15T20:08:06.855136249Z"

View File

@@ -26,7 +26,7 @@ dependencies:
version: 2.4.0 version: 2.4.0
- name: postgres-cluster - name: postgres-cluster
alias: postgres-18-cluster alias: postgres-18-cluster
version: 7.9.1 version: 7.10.0
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
- name: valkey - name: valkey
alias: valkey alias: valkey

View File

@@ -28,7 +28,7 @@ qbittorrent:
qbittorrent: qbittorrent:
image: image:
repository: ghcr.io/linuxserver/qbittorrent repository: ghcr.io/linuxserver/qbittorrent
tag: 5.1.4@sha256:6a7ffbfff04dd109bff37c474bfee00aa08dea5edb78c670439be3ed242b70fa tag: 5.1.4@sha256:855e5f4805ac218f406a5ae989a62a77e03f7e5f70128335b7970550a58c96e1
pullPolicy: IfNotPresent pullPolicy: IfNotPresent
env: env:
- name: TZ - name: TZ

View File

@@ -4,9 +4,9 @@ dependencies:
version: 4.6.2 version: 4.6.2
- name: postgres-cluster - name: postgres-cluster
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
version: 7.9.1 version: 7.10.0
- name: volsync-target - name: volsync-target
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
version: 0.8.0 version: 0.8.0
digest: sha256:7e873c90668a70b423efb04d4f2683d25022e8982248ba32a8e5820e323f9b7d digest: sha256:d76563fe1a7a9f8ceaf6937831bd0c5511eb7369abb8eb54110dfb69e6dce224
generated: "2026-03-11T23:00:55.780623797Z" generated: "2026-03-15T20:08:21.236792423Z"

View File

@@ -27,7 +27,7 @@ dependencies:
version: 4.6.2 version: 4.6.2
- name: postgres-cluster - name: postgres-cluster
alias: postgres-18-cluster alias: postgres-18-cluster
version: 7.9.1 version: 7.10.0
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
- name: volsync-target - name: volsync-target
alias: volsync-target-config alias: volsync-target-config

View File

@@ -4,9 +4,9 @@ dependencies:
version: 4.6.2 version: 4.6.2
- name: postgres-cluster - name: postgres-cluster
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
version: 7.9.1 version: 7.10.0
- name: volsync-target - name: volsync-target
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
version: 0.8.0 version: 0.8.0
digest: sha256:0a7ae6aa3062beedc4b4bcba61edb9f70d441dab0146e5b9559583fa12a319a8 digest: sha256:21bde3a8778fb94e40f2177383ca418123e69f3f3f463b31d35e9f9bf83dfa9d
generated: "2026-03-11T23:01:12.399079707Z" generated: "2026-03-15T20:08:35.497440433Z"

View File

@@ -27,7 +27,7 @@ dependencies:
version: 4.6.2 version: 4.6.2
- name: postgres-cluster - name: postgres-cluster
alias: postgres-18-cluster alias: postgres-18-cluster
version: 7.9.1 version: 7.10.0
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
- name: volsync-target - name: volsync-target
alias: volsync-target-config alias: volsync-target-config

View File

@@ -4,9 +4,9 @@ dependencies:
version: 4.6.2 version: 4.6.2
- name: postgres-cluster - name: postgres-cluster
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
version: 7.9.1 version: 7.10.0
- name: volsync-target - name: volsync-target
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
version: 0.8.0 version: 0.8.0
digest: sha256:600685215060deb3d8bb6530fa0df437c0ed3d9d6bad2792cedcce959207c7e6 digest: sha256:ebd25d2a12ca1924b66c62d6dd2c69476ae4526825020796198b65c2ebd2c6eb
generated: "2026-03-11T23:01:28.449666027Z" generated: "2026-03-15T20:08:49.811429784Z"

View File

@@ -26,7 +26,7 @@ dependencies:
version: 4.6.2 version: 4.6.2
- name: postgres-cluster - name: postgres-cluster
alias: postgres-18-cluster alias: postgres-18-cluster
version: 7.9.1 version: 7.10.0
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
- name: volsync-target - name: volsync-target
alias: volsync-target-config alias: volsync-target-config

View File

@@ -4,9 +4,9 @@ dependencies:
version: 4.6.2 version: 4.6.2
- name: postgres-cluster - name: postgres-cluster
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
version: 7.9.1 version: 7.10.0
- name: volsync-target - name: volsync-target
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
version: 0.8.0 version: 0.8.0
digest: sha256:fdad6659ae4ef46c46d62b4213d7fcf85dbb478809e094bbe7de4a86a98589f2 digest: sha256:05ce0d746d9c42a00338df5e6673fde8baeefa6f598ef8c85a32e6bc393b94ca
generated: "2026-03-11T23:01:46.420629722Z" generated: "2026-03-15T20:09:03.538226001Z"

View File

@@ -26,7 +26,7 @@ dependencies:
version: 4.6.2 version: 4.6.2
- name: postgres-cluster - name: postgres-cluster
alias: postgres-18-cluster alias: postgres-18-cluster
version: 7.9.1 version: 7.10.0
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
- name: volsync-target - name: volsync-target
alias: volsync-target-config alias: volsync-target-config

View File

@@ -4,9 +4,9 @@ dependencies:
version: 4.6.2 version: 4.6.2
- name: postgres-cluster - name: postgres-cluster
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
version: 7.9.1 version: 7.10.0
- name: volsync-target - name: volsync-target
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
version: 0.8.0 version: 0.8.0
digest: sha256:5cfad7a46f5671378adac77c3e39df224430a7481aeb16f7d3713f134e5d1dab digest: sha256:755aa4db5c7142d46af4a80c9fce49c3c558cc81042c9a00a0bdcd607276e856
generated: "2026-03-11T23:02:03.844844518Z" generated: "2026-03-15T20:09:18.053504671Z"

View File

@@ -21,7 +21,7 @@ dependencies:
version: 4.6.2 version: 4.6.2
- name: postgres-cluster - name: postgres-cluster
alias: postgres-18-cluster alias: postgres-18-cluster
version: 7.9.1 version: 7.10.0
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
- name: volsync-target - name: volsync-target
alias: volsync-target-data alias: volsync-target-data

View File

@@ -7,9 +7,9 @@ dependencies:
version: 2.4.0 version: 2.4.0
- name: postgres-cluster - name: postgres-cluster
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
version: 7.9.1 version: 7.10.0
- name: volsync-target - name: volsync-target
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
version: 0.8.0 version: 0.8.0
digest: sha256:4cc27a45f60df729db0cff4780bfb49655db739fdd35f6a46eb3a0489efdc88f digest: sha256:9342eb966ec3e8020aa6b1d6d2ac72d2c4a46c4ed70c5cf52c16ff25d2f2b0fa
generated: "2026-03-11T23:02:21.670318334Z" generated: "2026-03-15T20:09:33.800790437Z"

View File

@@ -23,7 +23,7 @@ dependencies:
version: 2.4.0 version: 2.4.0
- name: postgres-cluster - name: postgres-cluster
alias: postgres-18-cluster alias: postgres-18-cluster
version: 7.9.1 version: 7.10.0
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
- name: volsync-target - name: volsync-target
alias: volsync-target-clickhouse-data alias: volsync-target-clickhouse-data

View File

@@ -4,9 +4,9 @@ dependencies:
version: 4.6.2 version: 4.6.2
- name: postgres-cluster - name: postgres-cluster
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
version: 7.9.1 version: 7.10.0
- name: volsync-target - name: volsync-target
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
version: 0.8.0 version: 0.8.0
digest: sha256:487799d20d30d26443b4b7ffdd31dcba61e27e01067a6a0d7f3f265097a9d9af digest: sha256:27cc019786592c0e7fce9509543792c9f281a4e676c463ce5d6ba2a6df05e3b2
generated: "2026-03-11T23:02:43.378419214Z" generated: "2026-03-15T20:09:49.767646568Z"

View File

@@ -27,7 +27,7 @@ dependencies:
version: 4.6.2 version: 4.6.2
- name: postgres-cluster - name: postgres-cluster
alias: postgres-18-cluster alias: postgres-18-cluster
version: 7.9.1 version: 7.10.0
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
- name: volsync-target - name: volsync-target
alias: volsync-target-config alias: volsync-target-config

View File

@@ -4,9 +4,9 @@ dependencies:
version: 4.6.2 version: 4.6.2
- name: postgres-cluster - name: postgres-cluster
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
version: 7.9.1 version: 7.10.0
- name: volsync-target - name: volsync-target
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
version: 0.8.0 version: 0.8.0
digest: sha256:b2899ddbca96333330da52c7819c54d010691894d085b9f21a8ebd8d679a9823 digest: sha256:0f8016577e9fedaf8e5bd36688da2bf19b51185bc8100b817b64ce48ec87433b
generated: "2026-03-11T23:03:04.501966653Z" generated: "2026-03-15T20:10:04.000906771Z"

View File

@@ -26,7 +26,7 @@ dependencies:
version: 4.6.2 version: 4.6.2
- name: postgres-cluster - name: postgres-cluster
alias: postgres-18-cluster alias: postgres-18-cluster
version: 7.9.1 version: 7.10.0
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
- name: volsync-target - name: volsync-target
alias: volsync-target-config alias: volsync-target-config

View File

@@ -4,9 +4,9 @@ dependencies:
version: 4.6.2 version: 4.6.2
- name: postgres-cluster - name: postgres-cluster
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
version: 7.9.1 version: 7.10.0
- name: volsync-target - name: volsync-target
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
version: 0.8.0 version: 0.8.0
digest: sha256:828d3934111d24f54e39bb433da9d8a3aeeec21dcd8228737a6e496852fb6b5f digest: sha256:a20b4dd7e2f0c8777ed2be1bd2c702bc4d7cfeb51e4a29d781c041c555821aa1
generated: "2026-03-11T23:03:21.968129945Z" generated: "2026-03-15T20:10:17.242764683Z"

View File

@@ -26,7 +26,7 @@ dependencies:
version: 4.6.2 version: 4.6.2
- name: postgres-cluster - name: postgres-cluster
alias: postgres-18-cluster alias: postgres-18-cluster
version: 7.9.1 version: 7.10.0
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
- name: volsync-target - name: volsync-target
alias: volsync-target-config alias: volsync-target-config

View File

@@ -4,12 +4,12 @@ dependencies:
version: 4.6.2 version: 4.6.2
- name: postgres-cluster - name: postgres-cluster
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
version: 7.9.1 version: 7.10.0
- name: valkey - name: valkey
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
version: 0.4.0 version: 0.4.0
- name: volsync-target - name: volsync-target
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
version: 0.8.0 version: 0.8.0
digest: sha256:aef9a2c62df9bf44adf02d84b032ccd198c34cee56ff8d86d7200e9f5b21a5c1 digest: sha256:6ffe4bd6af377f2ba5134389027e86085928d5e1108bb5ecf0d4b1e4cc908b67
generated: "2026-03-11T23:03:39.658857007Z" generated: "2026-03-15T20:10:31.966910173Z"

View File

@@ -23,7 +23,7 @@ dependencies:
repository: https://bjw-s-labs.github.io/helm-charts/ repository: https://bjw-s-labs.github.io/helm-charts/
- name: postgres-cluster - name: postgres-cluster
alias: postgres-18-cluster alias: postgres-18-cluster
version: 7.9.1 version: 7.10.0
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
- name: valkey - name: valkey
alias: valkey alias: valkey

View File

@@ -11,4 +11,5 @@ spec:
nameserver: nameserver:
image: image:
repo: tailscale/k8s-nameserver repo: tailscale/k8s-nameserver
tag: unstable-v1.93.44 # renovate: datasource=docker depName=tailscale/k8s-nameserver
tag: v1.94.2

View File

@@ -48,7 +48,7 @@ tdarr:
main: main:
image: image:
repository: ghcr.io/haveagitgat/tdarr_node repository: ghcr.io/haveagitgat/tdarr_node
tag: 2.62.01 tag: 2.63.01
pullPolicy: IfNotPresent pullPolicy: IfNotPresent
env: env:
- name: TZ - name: TZ

View File

@@ -7,9 +7,9 @@ dependencies:
version: 2.4.0 version: 2.4.0
- name: postgres-cluster - name: postgres-cluster
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
version: 7.9.1 version: 7.10.0
- name: volsync-target - name: volsync-target
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
version: 0.8.0 version: 0.8.0
digest: sha256:1d6f670bfe76dbc3d59a2ff762cb5536be8d1f5ce0ed12b44bd9792076607bed digest: sha256:6f78b41937412c1db5e0f612287d29ea81c1d9169b8a0efd98a0dd4be3e532d1
generated: "2026-03-11T23:03:57.367242959Z" generated: "2026-03-15T20:10:47.852109985Z"

View File

@@ -27,7 +27,7 @@ dependencies:
version: 2.4.0 version: 2.4.0
- name: postgres-cluster - name: postgres-cluster
alias: postgres-18-cluster alias: postgres-18-cluster
version: 7.9.1 version: 7.10.0
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
- name: volsync-target - name: volsync-target
alias: volsync-target-data alias: volsync-target-data

View File

@@ -4,9 +4,9 @@ dependencies:
version: 4.6.2 version: 4.6.2
- name: postgres-cluster - name: postgres-cluster
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
version: 7.9.1 version: 7.10.0
- name: valkey - name: valkey
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
version: 0.4.0 version: 0.4.0
digest: sha256:e2398649941bcdbcba86bf8b7fbeaf5187e2ba29c5046d28be62ab9f37494c7e digest: sha256:71da007e1cef75e45b1678caa51b0d2317cb8f4dfdf7df675d534194f03650aa
generated: "2026-03-11T23:04:20.045077529Z" generated: "2026-03-15T20:11:03.591727143Z"

View File

@@ -22,7 +22,7 @@ dependencies:
version: 4.6.2 version: 4.6.2
- name: postgres-cluster - name: postgres-cluster
alias: postgres-18-cluster alias: postgres-18-cluster
version: 7.9.1 version: 7.10.0
repository: oci://harbor.alexlebens.net/helm-charts repository: oci://harbor.alexlebens.net/helm-charts
- name: valkey - name: valkey
alias: valkey alias: valkey

View File

@@ -7,14 +7,50 @@
], ],
"customManagers": [ "customManagers": [
{ {
"description": "Update appVersion in Chart.yaml",
"customType": "regex", "customType": "regex",
"managerFilePatterns": [ "managerFilePatterns": [
"/(^|/)Chart\\.yaml$/" "/(^|/)Chart\\.yaml$/"
], ],
"matchStrings": [ "matchStrings": [
"#\\s*renovate:\\s*datasource=(?<datasource>.*?) depName=(?<depName>.*?)\\s+appVersion:\\s*[\"']?(?<currentValue>[^\"'\\s]+)[\"']?" "#\\s*renovate:\\s*datasource=(?<datasource>.*?) depName=(?<depName>.*?)\\s+appVersion:\\s*[\"']?(?<currentValue>[^\"'\\s]+)[\"']?"
]
},
{
"description": "Update images in templates",
"customType": "regex",
"managerFilePatterns": [
"/(^|/)templates/.*\\.yaml$/"
], ],
"datasourceTemplate": "github-releases" "matchStrings": [
"# renovate: datasource=(?<datasource>.*?) depName=(?<depName>.*?)\\s+tag: (?<currentValue>.*)"
]
},
{
"description": "Update Helm CLI version in GitHub Actions",
"customType": "regex",
"managerFilePatterns": [
"/^\\.github/workflows/.*\\.ya?ml$/"
],
"matchStrings": [
"uses: azure/setup-helm@v4[\\s\\S]*?version: (?<currentValue>v?\\d+\\.\\d+\\.\\d+)"
],
"depNameTemplate": "helm/helm",
"datasourceTemplate": "github-releases",
"versioningTemplate": "semver"
},
{
"description": "Update Kubeconform version in GitHub Actions env",
"customType": "regex",
"managerFilePatterns": [
"/^\\.github/workflows/.*\\.ya?ml$/"
],
"matchStrings": [
"KUBECONFORM_VERSION: \"(?<currentValue>v?\\d+\\.\\d+\\.\\d+)\""
],
"depNameTemplate": "yannh/kubeconform",
"datasourceTemplate": "github-releases",
"versioningTemplate": "semver"
} }
], ],
"timezone": "US/Central", "timezone": "US/Central",
@@ -65,7 +101,8 @@
{ {
"description": "Label images, helm", "description": "Label images, helm",
"matchManagers": [ "matchManagers": [
"custom.regex", "helm-values" "custom.regex",
"helm-values"
], ],
"groupName": "{{#if packageName}}{{{replace 'ghcr.io/' '' (replace 'docker.io/' '' packageName)}}}{{else}}{{{replace 'ghcr.io/' '' (replace 'docker.io/' '' depName)}}}{{/if}}", "groupName": "{{#if packageName}}{{{replace 'ghcr.io/' '' (replace 'docker.io/' '' packageName)}}}{{else}}{{{replace 'ghcr.io/' '' (replace 'docker.io/' '' depName)}}}{{/if}}",
"groupSlug": "unified-{{{groupName}}}", "groupSlug": "unified-{{{groupName}}}",
@@ -91,7 +128,8 @@
"digest" "digest"
], ],
"matchManagers": [ "matchManagers": [
"custom.regex", "helm-values" "custom.regex",
"helm-values"
], ],
"groupName": "{{#if packageName}}{{{replace 'ghcr.io/' '' (replace 'docker.io/' '' packageName)}}}{{else}}{{{replace 'ghcr.io/' '' (replace 'docker.io/' '' depName)}}}{{/if}}", "groupName": "{{#if packageName}}{{{replace 'ghcr.io/' '' (replace 'docker.io/' '' packageName)}}}{{else}}{{{replace 'ghcr.io/' '' (replace 'docker.io/' '' depName)}}}{{/if}}",
"groupSlug": "unified-{{{groupName}}}", "groupSlug": "unified-{{{groupName}}}",