Skip to content

Commit 13f8bfc

Browse files
committed
docs(issue-31): record T+1h observation snapshot
Add ISSUE-31 T+1h evidence with commands, outputs, and interim rollback trigger assessment. Update ISSUE-31 execution status and implementation checklist to reflect completed live apply and captured checkpoints. Refs: #31
1 parent 18688e6 commit 13f8bfc

3 files changed

Lines changed: 240 additions & 5 deletions

File tree

docs/issues/ISSUE-31-reenable-caddy-http3-and-document-rationale.md

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -71,16 +71,21 @@ the rollback in evidence:
7171

7272
- Repository config change completed: Caddy UDP 443 mapping has been re-added in
7373
`server/opt/torrust/docker-compose.yml`.
74-
- Live-server apply, post-change observations, and rollback evaluation are still pending.
74+
- Live-server Caddy recreate completed and UDP 443 listener validation completed.
75+
- Immediate post-change evidence captured in
76+
`docs/issues/evidence/ISSUE-31/00-immediate-post-change-snapshot.md`.
77+
- T+1h checkpoint captured in
78+
`docs/issues/evidence/ISSUE-31/01-t1h-snapshot.md`.
79+
- T+next-day checkpoint and 24h rollback-trigger evaluation are still pending.
7580

7681
## Implementation Plan
7782

7883
- [x] Re-add `"443:443/udp"` for Caddy in `server/opt/torrust/docker-compose.yml`.
79-
- [ ] Apply only that change on the live server and recreate only Caddy.
80-
- [ ] Validate Caddy health and confirm host UDP 443 listener exists after deploy.
81-
- [ ] Capture immediate post-change metrics: `mpstat`, `docker stats`, Prometheus HTTP1/UDP1
84+
- [x] Apply only that change on the live server and recreate only Caddy.
85+
- [x] Validate Caddy health and confirm host UDP 443 listener exists after deploy.
86+
- [x] Capture immediate post-change metrics: `mpstat`, `docker stats`, Prometheus HTTP1/UDP1
8287
rates, and `newtrackon.com/raw` sample.
83-
- [ ] Capture T+1h and T+next-day checkpoints with the same metrics.
88+
- [ ] Capture T+next-day checkpoint with the same metrics.
8489
- [ ] Evaluate rollback triggers; if triggered, revert and record evidence.
8590
- [ ] Update ISSUE-29 text to explain why the earlier disablement is being reversed now.
8691
- [ ] Ensure ISSUE-29 states backend services do not need native HTTP/3 for edge HTTP/3 support.
Lines changed: 228 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,228 @@
1+
# ISSUE-31 Evidence — T+1h Snapshot
2+
3+
**Issue:** [#31 Re-enable Caddy HTTP/3 and Document ISSUE-29 Rationale][issue-31]
4+
**Scope:** Post-change stability checkpoint (T+1h target window)
5+
**Captured:** 2026-05-07 16:29:55 UTC
6+
**Author:** Jose Celano
7+
8+
[issue-31]: https://github.com/torrust/torrust-tracker-demo/issues/31
9+
10+
---
11+
12+
## 1. Context
13+
14+
The T+1h checkpoint was scheduled for approximately 14:17 UTC. This capture was
15+
performed at 16:29 UTC, still valid as a post-change steady-state checkpoint.
16+
17+
Primary objective: verify that re-enabling Caddy edge HTTP/3 (`443:443/udp`)
18+
remains healthy and does not show immediate regression versus the restart-biased
19+
T+0 snapshot.
20+
21+
---
22+
23+
## 2. Commands Executed and Outputs
24+
25+
### 2.1 Full capture command
26+
27+
```bash
28+
cat <<'EOS' | ssh demotracker 'bash -s'
29+
set -euo pipefail
30+
31+
echo '=== ISSUE-31 T+1h snapshot ==='
32+
date -u +"UTC_TIME=%Y-%m-%dT%H:%M:%SZ"
33+
34+
echo
35+
36+
echo '--- caddy ports ---'
37+
docker ps --format 'table {{.Names}}\t{{.Ports}}' | grep caddy || true
38+
39+
echo
40+
41+
echo '--- udp listeners :443 ---'
42+
ss -ulnp | grep ':443' || true
43+
44+
echo
45+
46+
echo '--- caddy health ---'
47+
docker inspect --format='{{.State.Health.Status}}' caddy
48+
49+
echo
50+
51+
echo '--- http tracker health ---'
52+
code=$(curl -s -o /tmp/http1_hc.out -w '%{http_code}' https://http1.torrust-tracker-demo.com:443/health_check || true)
53+
echo "HTTP_CODE=$code"
54+
head -c 400 /tmp/http1_hc.out || true
55+
echo
56+
57+
echo
58+
59+
echo '--- api stats endpoint status (expected pre-existing unauthorized) ---'
60+
code=$(curl -s -o /tmp/api_stats.out -w '%{http_code}' https://http1.torrust-tracker-demo.com/api/v1/stats || true)
61+
echo "HTTP_CODE=$code"
62+
head -c 400 /tmp/api_stats.out || true
63+
echo
64+
65+
echo
66+
67+
echo '--- host uptime/load ---'
68+
uptime
69+
70+
echo
71+
72+
echo '--- mpstat -P ALL 1 1 ---'
73+
mpstat -P ALL 1 1
74+
75+
echo
76+
77+
echo '--- docker stats --no-stream ---'
78+
docker stats --no-stream --format 'table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}'
79+
80+
echo
81+
82+
echo '--- prometheus HTTP1 rate (5m) ---'
83+
curl -sG 'http://localhost:9090/api/v1/query' \
84+
--data-urlencode 'query=sum(rate(http_tracker_core_requests_received_total[5m]))'
85+
86+
echo
87+
88+
echo '--- prometheus UDP1 rate (5m) ---'
89+
curl -sG 'http://localhost:9090/api/v1/query' \
90+
--data-urlencode 'query=sum(rate(udp_tracker_server_requests_received_total[5m]))'
91+
92+
echo
93+
94+
echo '--- newtrackon raw page sample ---'
95+
curl -sL 'https://newtrackon.com/raw' | head -c 800
96+
97+
echo
98+
EOS
99+
```
100+
101+
### 2.2 Key outputs captured
102+
103+
Timestamp:
104+
105+
```text
106+
UTC_TIME=2026-05-07T16:29:55Z
107+
```
108+
109+
Caddy ports:
110+
111+
```text
112+
caddy 0.0.0.0:80->80/tcp, [::]:80->80/tcp,
113+
0.0.0.0:443->443/tcp, [::]:443->443/tcp,
114+
0.0.0.0:443->443/udp, [::]:443->443/udp, 2019/tcp
115+
```
116+
117+
UDP 443 listeners:
118+
119+
```text
120+
UNCONN 0 0 0.0.0.0:443 0.0.0.0:*
121+
UNCONN 0 0 [::]:443 [::]:*
122+
```
123+
124+
Caddy health:
125+
126+
```text
127+
healthy
128+
```
129+
130+
HTTP tracker health:
131+
132+
```text
133+
HTTP_CODE=200
134+
{"status":"Ok"}
135+
```
136+
137+
API stats endpoint:
138+
139+
```text
140+
HTTP_CODE=404
141+
```
142+
143+
Host load:
144+
145+
```text
146+
load average: 11.46, 9.87, 9.73
147+
```
148+
149+
`mpstat -P ALL 1 1` (aggregate):
150+
151+
| Metric | Value |
152+
| ------ | ----- |
153+
| %usr | 34.69 |
154+
| %sys | 14.54 |
155+
| %soft | 30.23 |
156+
| %idle | 20.41 |
157+
158+
`docker stats --no-stream`:
159+
160+
| Container | CPU% | Memory |
161+
| ---------- | ------- | ------------------ |
162+
| caddy | 420.91% | 481.9MiB / 30.6GiB |
163+
| tracker | 120.47% | 795.3MiB / 30.6GiB |
164+
| mysql | 5.94% | 663.3MiB / 30.6GiB |
165+
| grafana | 0.48% | 309.1MiB / 30.6GiB |
166+
| prometheus | 0.00% | 99.62MiB / 30.6GiB |
167+
168+
Prometheus rates (5m):
169+
170+
```text
171+
HTTP1: 1902.150877192982 req/s
172+
UDP1: 2053.5017543859644 req/s
173+
```
174+
175+
newtrackon raw sample:
176+
177+
```text
178+
Returns HTML document content (same behavior as T+0), not a plain tracker status line.
179+
```
180+
181+
---
182+
183+
## 3. Comparison vs T+0 Snapshot
184+
185+
| Signal | T+0 (13:17) | T+1h checkpoint (16:29) | Notes |
186+
| ------------------ | ----------- | ----------------------- | ------------------------ |
187+
| Caddy health | healthy | healthy | Stable |
188+
| UDP 443 published | yes | yes | Stable |
189+
| UDP 443 listeners | yes | yes | Stable |
190+
| HTTP health code | 200 | 200 | Stable |
191+
| HTTP1 rate (req/s) | 2116.38 | 1902.15 | Normal variation |
192+
| UDP1 rate (req/s) | 2238.84 | 2053.50 | Normal variation |
193+
| Caddy CPU% | 717.12 | 420.91 | Lower than restart spike |
194+
| Load avg (1m) | 18.93 | 11.46 | Lower than restart spike |
195+
196+
---
197+
198+
## 4. Rollback Trigger Check (Interim)
199+
200+
Configured rollback triggers require sustained 24h regressions.
201+
202+
1. Caddy CPU > baseline x 1.20 sustained 24h: **not evaluable yet (window incomplete)**
203+
2. Host load > baseline x 1.15 sustained 24h: **not evaluable yet (window incomplete)**
204+
3. External availability regression on HTTP1/UDP1: **not observed in this checkpoint**
205+
206+
Interim conclusion: no rollback action indicated at T+1h checkpoint.
207+
208+
---
209+
210+
## 5. Notes and Open Point
211+
212+
The API stats endpoint returned `404` in this snapshot, while the earlier note
213+
recorded `500 unauthorized`.
214+
215+
This endpoint behavior is not part of ISSUE-31 acceptance criteria and does not
216+
affect the HTTP/3 edge re-enable validation. It should be tracked separately if
217+
API stats exposure is required for operations.
218+
219+
---
220+
221+
## 6. Summary
222+
223+
- Caddy edge HTTP/3 publish mapping remains active and healthy on IPv4 and IPv6.
224+
- Request rates remain in expected operating range.
225+
- T+0 restart artifacts have subsided (lower load and lower Caddy CPU than the
226+
immediate post-restart spike).
227+
- No rollback trigger is met at this checkpoint.
228+
- Next required checkpoint: T+next-day snapshot.

project-words.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ demux
7575
HSTS
7676
nosniff
7777
parseable
78+
pipefail
7879
qdisc
7980
qlen
8081
repomix
@@ -103,5 +104,6 @@ runqueue
103104
overcommitted
104105
cutover
105106
Mbit
107+
CPUPerc
106108
Celano
107109
urlencode

0 commit comments

Comments
 (0)