|
| 1 | +# Re-enable Caddy HTTP/3 and Document ISSUE-29 Rationale |
| 2 | + |
| 3 | +**Issue**: [#31](https://github.com/torrust/torrust-tracker-demo/issues/31) |
| 4 | +**Related**: |
| 5 | +[#29](https://github.com/torrust/torrust-tracker-demo/issues/29), |
| 6 | +[#30](https://github.com/torrust/torrust-tracker-demo/issues/30), |
| 7 | +[ISSUE-29-research-high-cpu-load-after-udp-fix.md](ISSUE-29-research-high-cpu-load-after-udp-fix.md) |
| 8 | + |
| 9 | +## Overview |
| 10 | + |
| 11 | +ISSUE-29 removed Caddy UDP port mapping `443:443/udp` (HTTP/3 over QUIC) during a controlled |
| 12 | +production experiment. The observations showed no measurable CPU improvement after disabling |
| 13 | +HTTP/3, while service availability remained stable. |
| 14 | + |
| 15 | +This follow-up issue proposes re-enabling HTTP/3 at the Caddy edge and documenting why this |
| 16 | +reversal is intentional. The goal is to restore HTTP/3 capability for present and future clients, |
| 17 | +while keeping a controlled rollback path if resource cost or reliability regresses. |
| 18 | + |
| 19 | +This issue also clarifies the protocol boundary in the current architecture: |
| 20 | + |
| 21 | +- Edge protocol (client -> Caddy) can include HTTP/3. |
| 22 | +- Backend protocol (Caddy -> tracker/grafana) remains reverse-proxy HTTP and does not require |
| 23 | + tracker native HTTP/3 support. |
| 24 | + |
| 25 | +## Problem Statement |
| 26 | + |
| 27 | +The current ISSUE-29 wording can be read as "HTTP/3 disabled for hygiene" even though the |
| 28 | +experiment outcome was only that disabling HTTP/3 did not fix CPU pressure. |
| 29 | + |
| 30 | +Keeping HTTP/3 disabled by default may also block automatic support for clients that prefer |
| 31 | +or require HTTP/3 in the future. Since this demo already runs a Caddy edge proxy, re-enabling |
| 32 | +UDP 443 is a low-complexity way to restore HTTP/3 capability without changing backend services. |
| 33 | + |
| 34 | +The change should therefore be treated as a product-capability decision with operational |
| 35 | +guardrails, not as a CPU-remediation tactic. |
| 36 | + |
| 37 | +## Goals |
| 38 | + |
| 39 | +1. Re-enable Caddy UDP 443 publish mapping for HTTP/3 at the edge. |
| 40 | +2. Keep backend application topology unchanged. |
| 41 | +3. Record explicitly that ISSUE-29 did not show CPU benefit from disabling HTTP/3. |
| 42 | +4. Document why re-enable is being done now (future compatibility/capability) and how rollback |
| 43 | + will be handled if needed. |
| 44 | + |
| 45 | +## Proposed Change |
| 46 | + |
| 47 | +1. Re-add `"443:443/udp"` in Caddy service ports in |
| 48 | + `server/opt/torrust/docker-compose.yml`. |
| 49 | +2. Apply the same change on live `/opt/torrust/docker-compose.yml` and recreate only Caddy. |
| 50 | +3. Observe immediate, T+1h, and T+next-day checkpoints with the same metrics used in ISSUE-29. |
| 51 | + |
| 52 | +## Rollback Triggers |
| 53 | + |
| 54 | +If any trigger is met after re-enable, revert by removing `"443:443/udp"` again and record |
| 55 | +the rollback in evidence: |
| 56 | + |
| 57 | +1. Caddy CPU increases by more than 20% sustained for 24h vs pre-change baseline. |
| 58 | +2. Host load average increases by more than 15% sustained for 24h vs pre-change baseline. |
| 59 | +3. New external availability regression appears on tracked HTTP1 or UDP1 endpoints. |
| 60 | + |
| 61 | +## Deliverables |
| 62 | + |
| 63 | +- Compose change that re-enables Caddy UDP 443 publish mapping. |
| 64 | +- Evidence notes for post-change observations (immediate, T+1h, T+next-day). |
| 65 | +- Updated ISSUE-29 wording that clearly separates: |
| 66 | + - measured performance result, |
| 67 | + - capability/product decision, |
| 68 | + - rollback criteria and operational safeguards. |
| 69 | + |
| 70 | +## Implementation Plan |
| 71 | + |
| 72 | +- [ ] Re-add `"443:443/udp"` for Caddy in `server/opt/torrust/docker-compose.yml`. |
| 73 | +- [ ] Apply only that change on the live server and recreate only Caddy. |
| 74 | +- [ ] Validate Caddy health and confirm host UDP 443 listener exists after deploy. |
| 75 | +- [ ] Capture immediate post-change metrics: `mpstat`, `docker stats`, Prometheus HTTP1/UDP1 |
| 76 | + rates, and `newtrackon.com/raw` sample. |
| 77 | +- [ ] Capture T+1h and T+next-day checkpoints with the same metrics. |
| 78 | +- [ ] Evaluate rollback triggers; if triggered, revert and record evidence. |
| 79 | +- [ ] Update ISSUE-29 text to explain why the earlier disablement is being reversed now. |
| 80 | +- [ ] Ensure ISSUE-29 states backend services do not need native HTTP/3 for edge HTTP/3 support. |
| 81 | +- [ ] Run `./scripts/lint.sh` and fix any markdown/cspell issues. |
| 82 | + |
| 83 | +## Acceptance Criteria |
| 84 | + |
| 85 | +- [ ] Caddy HTTP/3 edge capability is re-enabled via `443:443/udp` mapping. |
| 86 | +- [ ] Immediate, T+1h, and T+next-day evidence snapshots are recorded. |
| 87 | +- [ ] No rollback trigger is met during the observation window, or rollback is executed and |
| 88 | + documented if a trigger is met. |
| 89 | +- [ ] ISSUE-29 explicitly states that disabling HTTP/3 did not reduce CPU in prior observations. |
| 90 | +- [ ] ISSUE-29 explicitly states why HTTP/3 was re-enabled and under which conditions it may be |
| 91 | + disabled again. |
| 92 | +- [ ] Documentation clearly states edge HTTP/3 is independent from backend native HTTP/3 support. |
| 93 | +- [ ] All changed files pass `./scripts/lint.sh`. |
0 commit comments