From 843a27f3ade36ea41d723f168fb3f8c9c1f7b70c Mon Sep 17 00:00:00 2001 From: Dmitrii <15dnau@gmail.com> Date: Fri, 5 Jun 2026 14:03:50 +0300 Subject: [PATCH 01/11] docs(lab1): start submission Signed-off-by: Dmitrii <15dnau@gmail.com> --- submissions/lab1.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 submissions/lab1.md diff --git a/submissions/lab1.md b/submissions/lab1.md new file mode 100644 index 000000000..38d979193 --- /dev/null +++ b/submissions/lab1.md @@ -0,0 +1 @@ +# Lab 1 submission From 067b59fded7831b29714c140e5c7b1e22be2981a Mon Sep 17 00:00:00 2001 From: Dmitrii <15dnau@gmail.com> Date: Tue, 9 Jun 2026 15:36:21 +0300 Subject: [PATCH 02/11] docs(lab1): finish submission Signed-off-by: Dmitrii <15dnau@gmail.com> --- submissions/lab1.md | 87 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) diff --git a/submissions/lab1.md b/submissions/lab1.md index 38d979193..138dab7f6 100644 --- a/submissions/lab1.md +++ b/submissions/lab1.md @@ -1 +1,88 @@ # Lab 1 submission + +## Task 1 +Request: +``` +curl -s http://localhost:8080/health | python3 -m json.tool +``` + +Answer: +``` +{ + "notes": 5, + "status": "ok" +} +``` + +Request: +``` +curl -s http://localhost:8080/notes | python3 -m json.tool +``` + +Answer: +``` +[ + { + "id": 2, + "title": "Read app/main.go first", + "body": "Start by understanding the entry point \u2014 env vars, signal handling, graceful shutdown.", + "created_at": "2026-01-15T10:05:00Z" + }, + { + "id": 3, + "title": "DevOps mantra", + "body": "If it hurts, do it more often.", + "created_at": "2026-01-15T10:10:00Z" + }, + { + "id": 4, + "title": "Endpoint cheat-sheet", + "body": "GET /notes GET /notes/{id} POST /notes DELETE /notes/{id} GET /health GET /metrics", + "created_at": "2026-01-15T10:15:00Z" + }, + { + "id": 1, + "title": "Welcome to QuickNotes", + "body": "This is the project you'll containerize, deploy, monitor, and harden across all 10 labs.", + "created_at": "2026-01-15T10:00:00Z" + } +] +``` + +Request: +``` +curl -s -X POST http://localhost:8080/notes \ + -H 'Content-Type: application/json' \ + -d '{"title":"hello","body":"first POST"}' | python3 -m json.tool +``` + +Answer: +``` +{ + "id": 5, + "title": "hello", + "body": "first POST", + "created_at": "2026-06-05T10:51:13.503497Z" +}, +``` + +``` +git log --show-signature -1 + +commit 843a27f3ade36ea41d723f168fb3f8c9c1f7b70c (HEAD -> feature/lab1, origin/feature/lab1) +Good "git" signature for 15dnau@gmail.com with ED25519 key SHA256:k0n7/mx/uRX52s/zu9pxaN+h/IKnBJzcnuybJgthVkM +Author: Dmitrii <15dnau@gmail.com> +Date: Fri Jun 5 14:03:50 2026 +0300 + + docs(lab1): start submission + + Signed-off-by: Dmitrii <15dnau@gmail.com> +``` + +### Verified commit + +![Verified commit](verified.png "Verified commit") + +When we work with Github we trust that commit made by Dmitrii was actually made by Dmitrii. However Git itself does not verify commit's author. Anyone can set any name and make a commit, therefore we want commits to be verified. + +### Task 2 From 72471632c4c0fb56f1123df4a220fd0db5bbf8b9 Mon Sep 17 00:00:00 2001 From: Dmitrii <15dnau@gmail.com> Date: Tue, 9 Jun 2026 15:41:07 +0300 Subject: [PATCH 03/11] docs(lab1): task3 Signed-off-by: Dmitrii <15dnau@gmail.com> --- submissions/lab1.md | 7 ++++++- submissions/verified.png | Bin 0 -> 89492 bytes 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 submissions/verified.png diff --git a/submissions/lab1.md b/submissions/lab1.md index 138dab7f6..33da79068 100644 --- a/submissions/lab1.md +++ b/submissions/lab1.md @@ -85,4 +85,9 @@ Date: Fri Jun 5 14:03:50 2026 +0300 When we work with Github we trust that commit made by Dmitrii was actually made by Dmitrii. However Git itself does not verify commit's author. Anyone can set any name and make a commit, therefore we want commits to be verified. -### Task 2 +### GitHub Community +Why starring repositories matters in open source +For a project, stars are a signal of trust and relevance. Moreover, starring is something like bookmarking a repository. + +How following developers helps in team projects and professional growth +Following your colleagues on GitHub gives you a low-noise feed of their activity \ No newline at end of file diff --git a/submissions/verified.png b/submissions/verified.png new file mode 100644 index 0000000000000000000000000000000000000000..e7f1e43dd7516508483f8ef0929d371b8a81c072 GIT binary patch literal 89492 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 literal 0 HcmV?d00001 From c2789ae9fd9a9c271b9f4ad1635faa77096e59bb Mon Sep 17 00:00:00 2001 From: Dmitrii <15dnau@gmail.com> Date: Tue, 9 Jun 2026 16:04:21 +0300 Subject: [PATCH 04/11] docs: add PR template Signed-off-by: Dmitrii <15dnau@gmail.com> --- .github/pull_request_template.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 .github/pull_request_template.md diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 000000000..1a68db5e5 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,13 @@ +## Goal + + +## Changes +- + +## Testing + + +## Checklist +- [ ] Title is a clear sentence (≤ 70 chars) +- [ ] Commits are signed (`git log --show-signature`) +- [ ] `submissions/labN.md` updated From 272a4d82c5e3137594576a273834e5b994ed34f1 Mon Sep 17 00:00:00 2001 From: Dmitrii <15dnau@gmail.com> Date: Tue, 9 Jun 2026 17:41:34 +0300 Subject: [PATCH 05/11] test: unsigned commit (should fail) Signed-off-by: Dmitrii <15dnau@gmail.com> From 5a5f5df0d8d6cbb1f7c901eff0e576804f49a718 Mon Sep 17 00:00:00 2001 From: Dmitrii <15dnau@gmail.com> Date: Tue, 9 Jun 2026 18:52:08 +0300 Subject: [PATCH 06/11] docs: upstream moved while you worked Signed-off-by: Dmitrii <15dnau@gmail.com> From fcadd99a3b53a8a833b7375965e17c4e0b9cbb85 Mon Sep 17 00:00:00 2001 From: Dmitrii Creed Date: Thu, 11 Jun 2026 23:14:25 +0400 Subject: [PATCH 07/11] docs(lab1,lab2): clarify GitHub auth vs signing SSH key roles; add publickey-denied pitfalls Signed-off-by: Dmitrii Creed --- labs/lab1.md | 20 ++++++++++++++++---- labs/lab2.md | 1 + 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/labs/lab1.md b/labs/lab1.md index bb4e226d9..eb319e50f 100644 --- a/labs/lab1.md +++ b/labs/lab1.md @@ -91,9 +91,20 @@ git config --global commit.gpgsign true git config --global tag.gpgsign true ``` -Tell the platform your SSH key is a **signing key**: -- GitHub: Settings → SSH and GPG keys → **New SSH key**, key type **Signing Key** -- GitLab: Profile → SSH Keys → tick "Usage type: Authentication & signing" +Now register the key on the platform. GitHub treats **Authentication** and **Signing** as *separate* roles for the same key, so you add it under both: + +- **Authentication Key** — lets you `clone` / `fetch` / `push` over SSH (`git@github.com:…`). If you cloned over HTTPS, or have never seen `ssh -T git@github.com` greet you by name, you don't have one configured yet — add it now or the `upstream` SSH remote will fail in Lab 2. +- **Signing Key** — gives your commits the **Verified** badge. + +- 🐙 GitHub: Settings → SSH and GPG keys → **New SSH key** → add the **same** `~/.ssh/id_ed25519.pub` **twice**, once with Key type **Authentication Key** and once with **Signing Key**. +- 🦊 GitLab: Profile → SSH Keys → a single key with **Usage type: Authentication & signing** covers both. + +Confirm authentication works before moving on: + +```bash +ssh -T git@github.com +# expect: Hi YOUR_USERNAME! You've successfully authenticated... +``` ### 1.4: Make a Signed Commit @@ -303,7 +314,8 @@ In `submissions/lab1.md`: ## Common Pitfalls - 🪤 **PR template doesn't auto-populate** — make sure the template is on `main` *before* opening the PR -- 🪤 **Commits show "Unverified"** — the SSH key must be added as a *Signing Key* on GitHub (not just an authentication key) +- 🪤 **Commits show "Unverified"** — the key must also be added as a **Signing Key** on GitHub; an Authentication Key alone won't verify commits (they're separate roles — see §1.3) +- 🪤 **`git@github.com: Permission denied (publickey)` on clone/fetch/push** — the *reverse* gap: your key is registered for signing but not as an **Authentication Key**. Add it as Authentication too (§1.3) and confirm with `ssh -T git@github.com`. Quick unblock for the *public* upstream: `git remote set-url upstream https://github.com/inno-devops-labs/DevOps-Intro.git` - 🪤 **`git push` rejected on `main`** — that's the bonus rule working as designed; push to `feature/lab1` instead - 🪤 **`gpg.format=ssh` ignored** — confirm Git ≥ 2.34: `git --version` - 🪤 **Pushed to the wrong branch** — `git switch feature/lab1` before `git push` diff --git a/labs/lab2.md b/labs/lab2.md index fca7b3f22..aae9acfb3 100644 --- a/labs/lab2.md +++ b/labs/lab2.md @@ -223,6 +223,7 @@ git bisect reset ## Common Pitfalls +- 🪤 **`git@github.com: Permission denied (publickey)` on `git fetch upstream`** — *not* a remote-config bug (the error is at the SSH layer, before Git reads the repo). Your key isn't registered for **authentication** on GitHub — and a **Signing Key** (Lab 1) does *not* count for auth, they're separate roles. Add the same `~/.ssh/id_ed25519.pub` as an **Authentication Key** (Lab 1 §1.3), verify with `ssh -T git@github.com`, then re-run. To unblock right now, the public upstream fetches over HTTPS with no key: `git remote set-url upstream https://github.com/inno-devops-labs/DevOps-Intro.git` - 🪤 **`reset --hard` without committing first** — your *uncommitted* edits really *are* gone (reflog only saves committed work). Always check `git status` first - 🪤 **`tag -v` says "no signature"** — you used `git tag NAME` instead of `git tag -a -s NAME -m "..."` - 🪤 **Rebase conflicts** — resolve, then `git rebase --continue`. Never `git rebase --skip` unless you know what you're skipping From 63084e55398b3ec2433ee9f909f7db12f1b653bc Mon Sep 17 00:00:00 2001 From: Dmitrii Creed Date: Thu, 11 Jun 2026 23:31:10 +0400 Subject: [PATCH 08/11] =?UTF-8?q?docs(lab3):=20matrix=20renames=20required?= =?UTF-8?q?=20checks=20=E2=80=94=20warn=20+=20ci-ok=20gate=20pattern;=20se?= =?UTF-8?q?t=20honest=20cache=20expectations?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 2.2: matrixed jobs report as 'test (1.23)' etc.; the old required 'test'/'vet' contexts hang at 'Expected' and block every student PR. Document both fixes (rename required checks / require a single ci-ok aggregation job with if: always()) - 2.4: QuickNotes has zero deps, so cache on/off won't move wall-clock; ask students to explain why + compare per-step timings instead - pitfalls for both Signed-off-by: Dmitrii Creed --- labs/lab3.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/labs/lab3.md b/labs/lab3.md index 9f0970b20..87344cfb3 100644 --- a/labs/lab3.md +++ b/labs/lab3.md @@ -160,6 +160,23 @@ Tips: - GitLab: `parallel:matrix:` - Set `fail-fast: false` (GH) or equivalent so a single bad cell doesn't cancel the others — you want to *see* which combo broke +> ⚠️ **The matrix renames your checks — update branch protection (1.6) or your PR blocks forever.** A matrixed `test` job reports as `test (1.23)` and `test (1.24)`; the old required check named `test` will sit at *"Expected — Waiting for status to be reported"* indefinitely, even though every real check is green. Two fixes: +> +> 1. **Quick:** in the branch-protection rule, replace `vet`/`test` with the matrixed names (`vet (1.23)`, `vet (1.24)`, `test (1.23)`, `test (1.24)`). +> 2. **Robust (recommended):** add one aggregation job and require *only* it — then the matrix can change freely without touching protection settings: +> +> ```yaml +> ci-ok: +> if: always() +> needs: [vet, test, lint] +> runs-on: ubuntu-24.04 +> steps: +> - run: | +> test "${{ contains(needs.*.result, 'failure') || contains(needs.*.result, 'cancelled') }}" = "false" +> ``` +> +> The `if: always()` matters — without it, a failed `needs` job *skips* `ci-ok`, and a skipped required check lets the PR through on some configurations. + ### 2.3: Skip docs-only changes Edit your trigger so the pipeline runs **only** when something in `app/` or your CI config itself changes. README edits should not burn 4 minutes of CI time. @@ -179,6 +196,8 @@ Capture wall-clock times from the CI UI for three scenarios: > 💡 To get a clean baseline, temporarily disable each optimization with a commit, take a screenshot of the run time, then restore. +> 🧪 **Expect the cache rows to be boring — that's the finding, not a failure.** QuickNotes has **zero third-party dependencies** (look at `app/go.mod` — no `require` block, no `go.sum`), so the module cache has nothing to store and total wall-clock barely moves with `cache: true` vs `cache: false`. Most of your 60–80 s is runner provisioning, checkout, and the Go toolchain download — none of which `setup-go`'s cache touches. Report what you measured and *explain why* (that's design question **f** in disguise). To see where caching *would* pay, compare the **per-step** durations (`setup-go`, `go test`) instead of job totals, and note which step a real dependency-heavy project would save on. + ### 2.5: Document In `submissions/lab3.md`: @@ -284,6 +303,8 @@ Answer in 4-6 sentences: - 🪤 **Forgot `working-directory` (or `cd app`) for Go commands** — Go modules live in `app/`, not the repo root; commands run from the root will fail with "no Go files" - 🪤 **`fail-fast: true` (the GH Actions default) in a matrix** — one fail cancels the others; you can't see *which* combo broke - 🪤 **Branch protection set on someone else's fork's `main`** — you can only protect *your* fork's `main`. The upstream course repo has its own protection +- 🪤 **PR stuck on "Expected — Waiting for status to be reported" after adding the matrix** — the matrix renamed `test` → `test (1.23)`/`test (1.24)`, but branch protection still requires the old `test` context, which will never report again. Update the required-check names or switch to the `ci-ok` aggregation job (see §2.2) +- 🪤 **"Caching didn't speed anything up"** — on a zero-dependency module that's the *correct* result, not a mistake (see §2.4); don't pad the timing table with numbers you didn't observe - 🪤 **`golangci-lint` version not pinned** — "latest" pulls a new release tomorrow that may flag your code with new rules. Pin `v2.5.0` exactly - 🪤 **GitLab CI: incorrect anchor syntax** (`<<: *name`) — GitLab is strict; use the in-platform CI Lint tool (`Project → CI/CD → Editor → Validate`) - 🪤 **Cache hits expire after 7 days of inactivity on GH** — that's expected; the cache key is what protects you against poisoning From 11cac63dbd46faccc4c933033b71c27c76a539b7 Mon Sep 17 00:00:00 2001 From: Dmitrii <15dnau@gmail.com> Date: Tue, 9 Jun 2026 17:41:34 +0300 Subject: [PATCH 09/11] test: unsigned commit (should fail) Signed-off-by: Dmitrii <15dnau@gmail.com> From f862320470e9d94fe2ca53f66551e08da9058587 Mon Sep 17 00:00:00 2001 From: Dmitrii <15dnau@gmail.com> Date: Tue, 9 Jun 2026 18:52:08 +0300 Subject: [PATCH 10/11] docs: upstream moved while you worked Signed-off-by: Dmitrii <15dnau@gmail.com> From 66c8592e78f4ec2299d8b252060fc32ad2c8ecb1 Mon Sep 17 00:00:00 2001 From: Dmitrii <15dnau@gmail.com> Date: Wed, 17 Jun 2026 00:02:31 +0300 Subject: [PATCH 11/11] add report Signed-off-by: Dmitrii <15dnau@gmail.com> --- submissions/lab4.md | 294 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 294 insertions(+) create mode 100644 submissions/lab4.md diff --git a/submissions/lab4.md b/submissions/lab4.md new file mode 100644 index 000000000..e6eb32d18 --- /dev/null +++ b/submissions/lab4.md @@ -0,0 +1,294 @@ +## Task 1 — Trace a Request End-to-End (6 pts) + +### 1.1 Capture + +App started in terminal A with `cd app/ && go run .` (listens on `:8080`). +Capture in terminal B (sudo pre-authenticated with `sudo -v` so it could run +backgrounded without a suspended password prompt): + +```bash +sudo tcpdump -i lo0 -s 0 -w lab4-trace.pcap 'tcp port 8080' & +TCPDUMP_PID=$! +``` + +One request fired in terminal C: + +```bash +curl -v -X POST http://localhost:8080/notes \ + -H 'Content-Type: application/json' \ + -d '{"title":"trace me","body":"in flight"}' +``` + +`curl -v` output (note: connection went over IPv6 loopback `::1`): + +``` +* Connected to localhost (::1) port 8080 +> POST /notes HTTP/1.1 +> Host: localhost:8080 +> User-Agent: curl/8.7.1 +> Content-Type: application/json +> Content-Length: 39 +> +< HTTP/1.1 201 Created +< Content-Type: application/json +< Date: Tue, 16 Jun 2026 20:46:57 GMT +< Content-Length: 90 +< +{"id":7,"title":"trace me","body":"in flight","created_at":"2026-06-16T20:46:57.566588Z"} +* Connection #0 to host localhost left intact +``` + +Capture stopped: `sudo kill $TCPDUMP_PID` → tcpdump reported **12 packets captured**. + +### 1.2 Decode + annotate + +Decoded with `sudo tcpdump -r lab4-trace.pcap -nn -A | tee lab4-trace.txt`. +The whole transaction is loopback IPv6 (`::1`), client port `55246` ↔ server port `8080`. +Annotated packet walk: + +**① TCP three-way handshake** (packets 1–3): + +``` +[S] ::1.55246 > ::1.8080: Flags [S], seq 1061962572 ← SYN (client → server) +[S.] ::1.8080 > ::1.55246: Flags [S.], seq 1185686777, ack ...573 ← SYN/ACK (server → client) +[.] ::1.55246 > ::1.8080: Flags [.], ack 1 ← ACK (client → server) +``` +Connection established. (Plus an extra server `[.]` ack — normal on loopback.) + +**② HTTP request line + JSON body** (packet 5, `[P.]` PUSH, length 174): + +``` +::1.55246 > ::1.8080: Flags [P.], seq 1:175 ... HTTP: POST /notes HTTP/1.1 + POST /notes HTTP/1.1 + Host: localhost:8080 + User-Agent: curl/8.7.1 + Content-Type: application/json + Content-Length: 39 + + {"title":"trace me","body":"in flight"} +``` + +**③ HTTP response line + JSON body** (packet 7, `[P.]` PUSH, length 203): + +``` +::1.8080 > ::1.55246: Flags [P.], seq 1:204 ... HTTP: HTTP/1.1 201 Created + HTTP/1.1 201 Created + Content-Type: application/json + Date: Tue, 16 Jun 2026 20:46:57 GMT + Content-Length: 90 + + {"id":7,"title":"trace me","body":"in flight","created_at":"2026-06-16T20:46:57.566588Z"} +``` + +**④ Connection close** (FIN handshake, packets 9–12): + +``` +[F.] ::1.55246 > ::1.8080: Flags [F.], seq 175 ← client FIN +[.] ::1.8080 > ::1.55246: Flags [.], ack 176 ← server ACKs the FIN +[F.] ::1.8080 > ::1.55246: Flags [F.], seq 204 ← server FIN +[.] ::1.55246 > ::1.8080: Flags [.], ack 205 ← client ACKs → connection closed +``` + +Graceful four-way FIN close (no `RST`). Full raw capture in `lab4-trace.txt`. + +### 1.3 Five debugging commands + +**1. What's listening on :8080?** (`ss` does not exist on macOS → `lsof`) + +``` +$ lsof -nP -iTCP:8080 -sTCP:LISTEN +COMMAND PID USER FD TYPE DEVICE NODE NAME +quicknote 34042 dmitrijnaumov 5u IPv6 0x19c0...877 TCP *:8080 (LISTEN) +``` +→ The `quicknotes` process (PID 34042) owns `*:8080`, bound on IPv6 — which is +why the curl above connected via `::1`. + +**2. Routes from this host** (`ip route` → `netstat -rn`, relevant rows): + +``` +Destination Gateway Flags Netif +default 192.168.0.1 UGScIg en0 ← default route via Wi-Fi gateway +127 127.0.0.1 UCS lo0 ← all 127/8 stays on loopback +127.0.0.1 127.0.0.1 UH lo0 +::1 ::1 UHL lo0 ← IPv6 loopback (used by this request) +``` +(Full table — incl. many VPN `utun4` host routes — omitted for brevity.) + +**3. Reachability on loopback** (`mtr` → `traceroute`): + +``` +$ traceroute localhost +traceroute to localhost (127.0.0.1), 64 hops max + 1 localhost (127.0.0.1) 1.687 ms 1.040 ms 0.702 ms +``` +→ Single hop, sub-2ms — loopback never leaves the host. + +**4. DNS works** (`dig` — same on macOS): + +``` +$ dig +short example.com @1.1.1.1 +172.66.147.243 +104.20.23.154 +``` +→ Resolution against Cloudflare `1.1.1.1` succeeds. + +**5. Service logs** — no `journalctl`/journald on macOS. QuickNotes was run in the +foreground via `go run .`, so its log line +(`quicknotes listening on :8080 (notes loaded: N)`) prints to terminal A's stdout; +that terminal *is* the log sink here. + +### 1.4 Reflection — what would I check first on a 502? + +A 502 Bad Gateway is a **proxy/upstream** error: the front proxy (nginx, Caddy, +a load balancer) accepted my connection but got no valid response from the +backend. So I would not start at the client — I'd work the upstream link. First, +is the QuickNotes process actually alive and **listening** on the expected port +(`lsof -nP -iTCP:8080 -sTCP:LISTEN`)? If it's not listening, it crashed or never +bound — check its logs/stdout for a panic or `bind` error. If it *is* listening, +is the proxy pointed at the right host:port, and is the backend simply too slow +(a handler timeout will surface as 502/504)? In short: 502 means "the thing +behind the gateway is broken or unreachable," so I trace proxy → upstream +process → port → logs, in that order. + +--- + +## Task 2 — Outside-In Debugging on a Broken Deploy (4 pts) + +### 2.1 Reproduce the break (port conflict) + +```bash +cd app/ +ADDR=:8080 go run . & # first instance +PID1=$! +sleep 2 +ADDR=:8080 go run . 2>&1 | tee /tmp/qn-broken.log & # second instance +``` + +First instance bound cleanly: + +``` +[1] 40010 +2026/06/16 23:54:30 quicknotes listening on :8080 (notes loaded: 7) +``` + +Second instance failed — **exact root-cause error**: + +``` +2026/06/16 23:54:54 quicknotes listening on :8080 (notes loaded: 7) +2026/06/16 23:54:54 listen: listen tcp :8080: bind: address already in use +exit status 1 +[2] + exit 1 ADDR=:8080 go run . 2>&1 | tee /tmp/qn-broken.log +``` + +Root cause: **`listen tcp :8080: bind: address already in use`** (`EADDRINUSE`) — +two processes cannot bind the same `host:port`. + +### 2.2 Outside-in chain (command → output → decision) + +**1. Is it running?** (`ps`) + +``` +$ ps -ef | grep -E "go run|quicknotes" | grep -v grep +501 40010 39989 ... go run . +501 40014 40010 ... /Users/.../go-build/.../quicknotes +``` +→ Yes, and there are **two** processes: the `go run .` wrapper (PID 40010) and +its **child compiled binary** `quicknotes` (PID 40014, parent = 40010). The child +is the real server. *Decision: process alive; move inward.* + +**2. Is it listening?** (`lsof`, replaces `ss -tlnp`) + +``` +$ lsof -nP -iTCP:8080 +COMMAND PID USER FD TYPE DEVICE NODE NAME +quicknote 40014 dmitrijnaumov 5u IPv6 0x3677...01c0 TCP *:8080 (LISTEN) +``` +→ The **child** PID 40014 (not the `go run` wrapper) owns `*:8080`. *Decision: +exactly one listener — the second instance never bound, consistent with EADDRINUSE.* + +**3. Reachable from host?** (`curl` health probe) + +``` +$ curl -s -o /dev/null -w "%{http_code}\n" http://localhost:8080/health +200 +``` +→ The surviving first instance serves fine. *Decision: not a connectivity/app +fault — the failure is purely the second bind losing the race for the port.* + +**4. Firewall blocking?** (`pfctl`, replaces `iptables`/`nft`) + +``` +$ sudo pfctl -sr +scrub-anchor "com.apple/*" all fragment reassemble +anchor "com.apple/*" all +``` +→ Only default macOS anchors, no rules blocking 8080. *Decision: not a firewall +problem — network layer ruled out.* + +**5. DNS?** (`dig`) + +``` +$ dig +short localhost +(empty) +``` +→ Empty is **expected**: `localhost` resolves from `/etc/hosts`, not DNS, and +`dig` only queries DNS. *Decision: name resolution not involved — "it's not DNS."* + +**Conclusion of the chain:** running ✓, listening ✓ (one instance), reachable ✓, +firewall clear, DNS irrelevant → the only fault is the **second process losing the +bind race** on an already-occupied port. + +### 2.3 Repair + re-verify — and a process-tree gotcha + +```bash +kill $PID1 # PID1 = 40010 +sleep 1 +ADDR=:8080 go run . & +sleep 1 +curl -s http://localhost:8080/health +``` + +Result — the new instance **still failed to bind**, yet `/health` returned 200: + +``` +[1] + terminated ADDR=:8080 go run . +2026/06/16 23:56:03 listen: listen tcp :8080: bind: address already in use +exit status 1 +$ curl -s http://localhost:8080/health +{"notes":7,"status":"ok"} +``` + +**Why:** `kill $PID1` killed only the `go run` **wrapper** (40010), not its child +listener `quicknotes` (40014). The child was **orphaned and kept holding `:8080`**, +so the fresh `go run` hit the same `EADDRINUSE`, and the 200 from `/health` is the +*old orphaned listener* still answering — not a clean restart. A classic false-green. + +**Correct repair** — kill the actual listener found via `lsof`, then restart: + +```bash +lsof -nP -iTCP:8080 # find the real listener PID (the quicknotes child, 40014) +kill 40014 # or: pkill quicknotes +sleep 1 +ADDR=:8080 go run . & # now binds cleanly +curl -s http://localhost:8080/health +``` + +### 2.4 Blameless mini-postmortem (≤200 words) + +A second instance crash-looped with `bind: address already in use`. No one "did it +wrong" — the system simply *permitted* two processes to contend for one `host:port` +with nothing enforcing single-instance ownership. The incident exposed a second, +sharper systemic gap: killing the `go run` wrapper did **not** reap its child +server. Wrapper and listener are different PIDs, and a plain `kill` of the parent +orphaned the child, which kept holding the port. The misleading `200` from the +health check then made a *failed* restart look successful. + +What's systemic: process *lifecycle* and *ownership* were both unmanaged. A real +supervisor (launchd, systemd, or a container runtime) tracks the whole process +group/cgroup, so stopping the unit reaps every child and frees the port atomically, +and it refuses to start a duplicate. Preventive tooling: readiness/liveness probes +that distinguish "bound and serving" from "stale orphan answering," a deploy +pre-check that the port is free (`lsof`/`ss`) before launch, and dynamic port +allocation or per-container network namespaces so two instances can never collide +in the first place. +---