<a id="changelog"></a>

# Changelog

All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).

Each revision is versioned by the date of the revision.

## 2026-10-12

- Fixed Traefik retaining a stale CA trust pool when certificates from an existing
  `receive-ca-cert` relation were restored during Pebble readiness.
- Renamed the misspelled `csr-subject-atttributes` config option to `csr-subject-attributes`.

## 2026-10-07

- Added a scheduled `close_stale.yaml` GitHub Actions workflow to automatically mark inactive
  issues and pull requests as stale and close them after a grace period.

## 2026-10-06

- Fixed certificate signing requests being wiped from `certificates` interface relation data when a hook (e.g. `config-changed`) runs before the traefik Pebble service reports ready, such as right after a charm upgrade.

## 2026-10-05

- Switched the `logging` integration from `LokiPushApiConsumer` to `LogForwarder`, so the
  `loki_push_api` relation now forwards the workload’s logs to related Loki endpoints using
  Pebble log targets instead of only reading the interface.
- Removed the write of the workload’s logs to `/var/log/traefik.log`. The service command used
  to `tee` the output to that file as well as stdout, but `tee` was called without `-a`, so the
  file was truncated on every restart instead of growing without bound. Logs remain available
  through `juju exec --unit traefik/0 -- pebble logs traefik` and `kubectl logs`.
- Fixed CI breakage from dev/docs tooling version bumps: resolved new `pyright` 1.1.414
  findings in the `ingress`, `ingress_per_unit`, and `ingress` v2 charm libraries, silenced
  `sphinx_llm` warnings for unsupported `meta`/`mermaid` nodes, and reworded two docs pages
  to clear `vale` spell-check false positives.

## 2026-10-01

- Set a blocked status that explains how to run `juju trust` when the charm is deployed without
  `--trust`, instead of going into error state.
- Fixed deferred ingress events repeatedly failing hooks when relation data changed before replay.
  Ingress relations are now processed once through the existing reconciliation path, which cleans
  up invalid configuration and reports status without trapping the event in a replay loop.

## 2026-09-28

- Fixed invalid `routing_mode` values putting the unit into error instead of blocked status.

## 2026-09-08

- Replaced some external charms in integration tests with an any-charm as ingress requirer.

## 2026-09-02

- Added `csr-subject-atttributes` config to include configurable CSR subject fields such as `C`, `ST`, `L`, `O`, `OU`, `CN`, and `emailAddress` in certificate requests.

## 2026-08-26

- Added `get-loadbalancer-ip` Juju action to expose the external LoadBalancer address.

## 2026-08-25

- Fixed several documentation issues.
- Fixed typing issue in `TraefikRouteRequirer.__init__`: `relation` parameter is now `Optional[Relation]` with a default of `None`.
- Stabilized the `test_charm_trace_collection` unit test by isolating it from the shared charm tracing buffer file.
- Updated the TLS integration test to verify HTTPS with the self-signed provider’s CA certificate and stronger post-integration waits.

## 2026-08-19

- Updated Sphinx Stack from 1.4.1 to 2.0 with the following changes:
  - Migrated from `.sphinx/` to `_dev/` directory structure
  - Migrated virtual environment from `.sphinx/venv` to `.venv`
  - Added `sphinx-rerediraffe` extension for improved redirects
  - Added `sphinx-llm` extension for LLM documentation support
  - Updated `canonical-sphinx` to 0.6.0
  - Fixed broken Rockcraft documentation link
- Updated the documentation home page to the mature home page pattern, improved the how-to index organization, and reclassified the local-CA TLS page as a how-to guide.

## 2026-08-17

- Fixed charm incorrectly reporting active status when the LoadBalancer Service has no external IP, even with `external_hostname` configured. The charm now reports waiting status until the LB obtains an address.

## 2026-08-14

- Preserved the TLS private key when the `certificates` relation is removed so re-adding the relation reuses the existing key instead of requesting a new certificate.

## 2026-08-12

- Migrated repository CI workflows from observability-owned reusable workflows to operator-workflows, and removed the unused Tiobe scan workflow.

## 2026-07-22

- Updated the Grafana dashboard to the official Traefik Kubernetes dashboard using Traefik v2 metric names (e.g. `traefik_service_requests_total`).
- Added a basic deployment tutorial.

## 2026-07-10

- Changed the unit status to active (from blocked) while a certificate is pending, keeping the “Certificate not available yet” message.

## 2026-07-08

- Added migration logic to handle TLS private key and CSR migration.

## 2026-07-01

- Added a `base` input to the Terraform module to set the OS base the charm is deployed on.

## 2026-06-24

- Fixed Traefik entrypoint `readTimeout` defaults for HTTP and TCP traffic entrypoints so large uploads are not cut off after 60 seconds on Traefik v2.11.2+.
- Added integration tests for Traefik charm upgrade.

## 2026-06-19

- Removed “How to force HTTPS redirect” documentation as it is stale code.

## 2026-06-18

- Migrated the RTD documentation URL under the Canonical domain.

## 2026-06-08

- Added an `expose` input to the Terraform module to make Traefik publicly available over the network.

## 2026-06-05

- Added support for `ubuntu@26.04` on the charm.

## 2026-06-04

- Updated Terraform module Juju provider version constraint to support Juju 4.

## 2026-06-03

- Added the charm architecture documentation page.

## 2026-06-01

- Updated ingress lib to publish new attribute `is_port_opened` on the requirer’s side
  that represents whether the port requested is open or not.

## 2026-06-01

- Update the charm to use 2.11-26.04_edge tag of traefik image.

## 2026-05-28

- Push all dynamic configurations together in the end rather than individual pushes.
- Reduced unnecessary LoadBalancer reconciliations by removing redundant `_reconcile_lb()` calls from CA certificate and configuration paths, and removed per-relation maintenance status churn during ingress processing.

## 2026-05-22

- Fixed `delete_dynamic_configs` and `delete_dynamic_config` to guard against missing directory/file, preventing `ExecError` crash on first container start or after pod churn.

## 2026-05-19

- Added the `resources` variable to the Terraform charm module so users can pin images for Traefik.

## 2026-05-07

- Fixed `_on_remove` to only delete the LoadBalancer resource when the application is fully removed (0 planned units), preventing accidental LB deletion during scale-down.

## 2026-04-20

- Replaced `@property` with `@functools.cached_property` on frequently accessed charm attributes.

## 2025-05-07

- Fixed reading the CA certificates from the `certificate-transfer` relation.

## 2026-05-05

- Ensure hosts ordering in the dynamic configuration files.

## 2026-04-19

- Removed redundant `relation-created` and `relation-joined` event observers from the ingress v1 and v2 libraries; ingress processing now triggers only on `relation-changed`.

## 2026-03-30

- Added support for release notes.

## 2025-03-17

- Changed certificate mode from `UNIT` to `APP` mode.

## 2026-03-13

- Add support for UDP entrypoints in the `traefik-route` relation.

## 2026-03-16

- Add security documentation.

## 2025-03-12

- Updated charm code to trigger certificate refresh conditionally rather than through refresh hooks.

## 2025-02-26

- Add some more logs and unit tests on the `proxied_endpoints` method.

## 2026-01-29

- Removed leader requirement on `TraefikRouteRequirer` to update the stored state.

## 2026-01-27

- Cleaned up the repository to remove stale comments, align `tox.ini` and remove `requirements.txt`.

## 2026-01-19

- Add how to upgrade documentation.

## 2026-01-08

- Migrated documentation to GitHub and set up RTD project.
- Added workflow to check for CLA compliance.

## 2025-11-28

### Changed

- Fixed Traefik accessing Pebble before container is ready.
