fix(setup): 실험대에서 35편을 끝까지 밟고 어긋난 명령·결과 31건을 고친다

test-server 를 비우고 다시 세운 뒤 Setup 기록 35편(virtualization 9 ·
keycloak-session-store 26)을 문서에 적힌 명령 그대로 쳤다. 어긋난 자리를
기록과 SSOT 양쪽에 실측과 함께 넣었다.

막히던 것
- 04 의 인증서 경로가 live/hyeonworks.com 이라 nginx 가 [emerg] 로 안 떴다.
  실제 계보는 live/auth.hyeonworks.com 이고 「문제가 생기면」은 진단이 거꾸로였다
- 인증서가 와일드카드가 아니다. SAN 이 auth·app1·app2 셋뿐이라 그 밖의 이름은
  TLS 에서 끊기고 curl 이 exit 60 · %{http_code} 000 을 낸다. SSOT 안에서
  두 문단이 서로 어긋나 있었다
- A-7 14번 ①이 kc-lab-1 에서 여섯 줄 다 실패하는데 마지막 date 만 「차단」을 찍는다

검사가 실패할 수 없던 자리
- B-1 의 세션 키 고르기는 앞 단계가 $KEY 를 채워 둬서 루프가 한 건도 못 맞혀도
  통과한다. KEY= 로 비우고 키마다 1/0 을 찍게 바꿨다
- k3s-agent 유닛의 sed -i 는 패턴에 $HOME 이 들어 있어 아무 줄도 안 바꾼 채 성공한다

certbot
- renew --dry-run 의 종료 코드는 성공도 0, 실패도 0, 다른 사유의 실패는 1 이다.
  본문의 renew failure(s) 로만 판정할 수 있다
- --dry-run 은 staging 서버를 쓰는데 renewal/*.conf 의 account= 는 운영 계정을
  가리킨다. 실패한 dry-run 이 staging 계정을 하나 더 만들어 다음 실행이 계속 멎는다
- 훅을 755 로 놓고 시뮬레이션이 성공해도 Running deploy-hook command 는 안 나온다.
  certbot 2.1.0 에는 --run-deploy-hooks 도 없다
- 강제 갱신은 실제로 쳤고 서빙까지 닿았다. serial 06F3E0EF…1373 → 065547…3DF1,
  notAfter Dec 3 → Dec 16, nginx worker 2629 4712 → 4745 4754

독자가 칠 수 있는 형태로
- 안 되는 형태가 번호 붙은 단계에 앉아 있던 8곳을 뒤집고, 되는 형태를 ①로 올렸다
- 랩 안에서 공개 이름을 치는 curl 65줄에 --resolve 를 붙였다. 붙인 형태를 실제로
  쳐서 문서가 적은 값과 같은지 확인했다
- 힙독·sed -i·echo >>·&&·|| 를 편집기 + 파일 리스팅 + 분할 형태로 바꿨다
- 닫는 코드펜스가 빠져 뒤 200여 줄의 블록 종류가 뒤집혀 있던 곳을 포함해 3곳을 고쳤다

관문: check_body PASS · check_prose error 0 · check_evidence 두 프로젝트 문제 없음 ·
verify-tech-log-tree error 0 · verify-project-layout error 0 · 코드펜스 전수 0건

남은 것: B-0 주입은 keycloak-pattern 저장소의 소스를 고치고 이미지를 다시 구워야
해서 안 했다(unknown).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
DongHyeonka
2026-09-17 19:38:12 +09:00
co-authored by Claude Opus 5
parent 4a457afde9
commit 32e39e20aa
150 changed files with 6066 additions and 269 deletions
@@ -0,0 +1,4 @@
[ 60061ms] [ERROR] Failed to load resource: the server responded with a status of 422 (Unprocessable Entity) @ https://hyeonworks.com/api/v1/studio/documents?limit=200:0
[ 65184ms] [ERROR] Failed to load resource: the server responded with a status of 422 (Unprocessable Entity) @ https://hyeonworks.com/api/v1/studio/documents?limit=200:0
[ 87640ms] [ERROR] Failed to load resource: the server responded with a status of 405 (Method Not Allowed) @ https://hyeonworks.com/api/v1/studio/documents/7e7fb64d-f3a5-4f1e-8351-04596929aaf0:0
[ 98850ms] [ERROR] Failed to load resource: the server responded with a status of 404 (Not Found) @ https://hyeonworks.com/api/v1/studio/documents/7e7fb64d-f3a5-4f1e-8351-04596929aaf0:0
@@ -0,0 +1,133 @@
- generic [ref=f6e3]:
- link "본문으로 건너뛰기" [ref=f6e4] [cursor=pointer]:
- /url: "#main-content"
- banner [ref=f6e5]:
- generic [ref=f6e6]:
- link "TechLog Studio" [ref=f6e7] [cursor=pointer]:
- /url: /studio
- text: TechLog
- generic [ref=f6e8]: Studio
- navigation "Studio 주 탐색" [ref=f6e10]:
- generic [ref=f6e11]:
- link "작업" [ref=f6e12] [cursor=pointer]:
- /url: /studio/documents
- link "구조" [ref=f6e13] [cursor=pointer]:
- /url: /studio/taxonomy
- link "자료" [ref=f6e14] [cursor=pointer]:
- /url: /studio/assets
- link "게시" [ref=f6e15] [cursor=pointer]:
- /url: /studio/publications
- generic [ref=f6e16]:
- link "작업본" [ref=f6e17] [cursor=pointer]:
- /url: /studio/documents
- link "새 문서" [ref=f6e18] [cursor=pointer]:
- /url: /studio/documents/new
- generic [ref=f6e19]:
- link "공개 사이트 보기" [ref=f6e20] [cursor=pointer]:
- /url: /
- button "로그아웃" [ref=f6e21]
- main [ref=f6e22]:
- generic [ref=f6e23]:
- generic [ref=f6e24]:
- generic "현재 문서" [ref=f6e25]:
- generic [ref=f6e26]: CASE
- generic [aria-hidden] [ref=f6e27]: ·
- generic [ref=f6e28]: v1
- complementary [ref=f6e29]:
- heading "작업 상태" [level=2] [ref=f6e30]
- status "편집 상태" [ref=f6e31]: 저장됨
- generic [ref=f6e33]:
- button "저장" [disabled] [ref=f6e34]
- button "게시" [ref=f6e35]
- main "문서 편집" [ref=f6e36]:
- region "문서 기본 정보" [ref=f6e37]:
- generic [ref=f6e39]: 검증 기록
- heading "제목 없는 작업본" [level=1] [ref=f6e40]:
- generic [ref=f6e41]:
- generic [ref=f6e42]: 제목
- textbox "제목" [ref=f6e43]:
- /placeholder: 제목을 입력하세요
- generic [ref=f6e44]:
- generic [ref=f6e45]: 요약
- textbox "요약" [ref=f6e46]:
- /placeholder: 이 기록에서 다루는 핵심을 한두 문장으로 적어 주세요.
- generic [ref=f6e47]:
- generic [ref=f6e48]: 목록 카드에는 약 90자까지 보입니다.
- generic [aria-hidden] [ref=f6e49]: 0 / 2000
- group [ref=f6e50]:
- generic "속성 프로젝트 없음 · 주제 없음" [ref=f6e51] [cursor=pointer]:
- generic [ref=f6e52]: 속성
- generic [ref=f6e53]: 프로젝트 없음 · 주제 없음
- generic [aria-hidden] [ref=f6e54]: 접기
- generic [ref=f6e55]:
- generic [ref=f6e56]:
- generic [ref=f6e57]: 프로젝트
- group [ref=f6e59]:
- generic "Project" [ref=f6e60] [cursor=pointer]:
- generic [ref=f6e61]: 프로젝트 없음
- generic [aria-hidden] [ref=f6e62]:
- generic [ref=f6e63]:
- generic [ref=f6e64]: 주제
- group [ref=f6e66]:
- generic "Topic" [ref=f6e67] [cursor=pointer]:
- generic [ref=f6e68]: 주제 없음
- generic [aria-hidden] [ref=f6e69]:
- generic [ref=f6e70]:
- generic [ref=f6e71]: URL 이름
- generic [ref=f6e72]:
- generic [aria-hidden] [ref=f6e73]: /
- textbox "slug" [ref=f6e74]:
- /placeholder: 비우면 제목에서 자동 생성
- generic [ref=f6e75]: 직접 정하지 않아도 저장할 때 제목을 기준으로 만들어집니다.
- group [ref=f6e76]:
- generic "연결된 기록 필요할 때 추가 +" [ref=f6e77] [cursor=pointer]:
- generic [ref=f6e78]: 연결된 기록
- generic [ref=f6e79]: 필요할 때 추가
- text: +
- text: +
- status [ref=f6e80]
- region [ref=f6e81]:
- generic [ref=f6e82]:
- paragraph [ref=f6e83]: CASE
- heading "문제와 검증" [level=2] [ref=f6e84]
- paragraph [ref=f6e85]: 문제와 결론을 먼저 고정하고, 그 사이의 검증 과정을 본문 블록으로 이어서 작성합니다.
- generic [ref=f6e86]:
- generic [ref=f6e87]:
- generic [ref=f6e88]: 문제
- textbox "문제" [ref=f6e89]:
- /placeholder: 어떤 현상이 문제였는지 한 문단으로 적어 주세요.
- generic [ref=f6e90]:
- generic [ref=f6e91]: 결론
- textbox "결론" [ref=f6e92]:
- /placeholder: 검증을 통해 무엇을 확인했는지 적어 주세요.
- group [ref=f6e93]:
- generic "검증 세부정보 0개 입력됨" [ref=f6e94] [cursor=pointer]:
- generic [ref=f6e95]: 검증 세부정보
- generic [ref=f6e96]: 0개 입력됨
- generic [ref=f6e97]:
- generic [ref=f6e98]:
- generic [ref=f6e99]:
- text: 본문
- paragraph [ref=f6e100]: 작성 화면이 곧 문서입니다. 빈 블록에서 / 를 입력해 제목·목록·코드 블록을 추가할 수 있습니다.
- generic [ref=f6e101]:
- button "본문에 자료 넣기" [ref=f6e103]
- generic [ref=f6e104]:
- generic [ref=f6e105]: 업로드 종류
- combobox "업로드 종류" [ref=f6e106]:
- option "이미지" [selected]
- option "다이어그램"
- option "첨부파일"
- button "Asset 업로드" [ref=f6e107]: 업로드
- region "본문" [ref=f6e108]:
- generic [ref=f6e110]:
- generic "텍스트 블록 작업" [ref=f6e111]:
- button "1번째 블록 메뉴" [ref=f6e112]: ⋮⋮
- textbox "1번째 텍스트" [ref=f6e114]:
- /placeholder: 내용을 입력하거나 / 를 눌러 블록을 추가하세요
- generic "1번째 블록 순서와 삭제":
- button "위로 이동" [disabled]: ↑
- button "아래로 이동" [disabled]: ↓
- button "블록 삭제": 삭제
- button "+ 블록 추가" [ref=f6e115]
- paragraph [ref=f6e116]: 빈 블록에서 / 를 입력하면 제목·목록·코드 같은 블록으로 바꿀 수 있습니다.
- paragraph [ref=f6e117]: 검증 기록 작업본을 만들었습니다.
@@ -0,0 +1,135 @@
- generic [ref=f6e3]:
- link "본문으로 건너뛰기" [ref=f6e4] [cursor=pointer]:
- /url: "#main-content"
- banner [ref=f6e5]:
- generic [ref=f6e6]:
- link "TechLog Studio" [ref=f6e7] [cursor=pointer]:
- /url: /studio
- text: TechLog
- generic [ref=f6e8]: Studio
- navigation "Studio 주 탐색" [ref=f6e10]:
- generic [ref=f6e11]:
- link "작업" [ref=f6e12] [cursor=pointer]:
- /url: /studio/documents
- link "구조" [ref=f6e13] [cursor=pointer]:
- /url: /studio/taxonomy
- link "자료" [ref=f6e14] [cursor=pointer]:
- /url: /studio/assets
- link "게시" [ref=f6e15] [cursor=pointer]:
- /url: /studio/publications
- generic [ref=f6e16]:
- link "작업본" [ref=f6e17] [cursor=pointer]:
- /url: /studio/documents
- link "새 문서" [ref=f6e18] [cursor=pointer]:
- /url: /studio/documents/new
- generic [ref=f6e19]:
- link "공개 사이트 보기" [ref=f6e20] [cursor=pointer]:
- /url: /
- button "로그아웃" [ref=f6e21]
- main [ref=f6e22]:
- generic [ref=f6e23]:
- generic [ref=f6e24]:
- generic "현재 문서" [ref=f6e25]:
- generic [ref=f6e26]: CASE
- generic [aria-hidden] [ref=f6e27]: ·
- generic [ref=f6e28]: v2
- complementary [ref=f6e29]:
- heading "작업 상태" [level=2] [ref=f6e30]
- status "편집 상태" [ref=f6e31]: 저장됨
- generic [ref=f6e33]:
- button "저장" [disabled] [ref=f6e34]
- button "게시" [ref=f6e35]
- main "문서 편집" [ref=f6e36]:
- region "문서 기본 정보" [ref=f6e37]:
- generic [ref=f6e39]: 검증 기록
- heading "zz 시험 작업본 — 지울 것" [level=1] [ref=f6e118]:
- generic [ref=f6e41]:
- generic [ref=f6e42]: 제목
- textbox "제목" [ref=f6e43]:
- /placeholder: 제목을 입력하세요
- text: zz 시험 작업본 — 지울 것
- generic [ref=f6e44]:
- generic [ref=f6e45]: 요약
- textbox "요약" [ref=f6e46]:
- /placeholder: 이 기록에서 다루는 핵심을 한두 문장으로 적어 주세요.
- generic [ref=f6e47]:
- generic [ref=f6e48]: 목록 카드에는 약 90자까지 보입니다.
- generic [aria-hidden] [ref=f6e49]: 0 / 2000
- group [ref=f6e50]:
- generic "속성 프로젝트 없음 · 주제 없음" [ref=f6e51] [cursor=pointer]:
- generic [ref=f6e52]: 속성
- generic [ref=f6e53]: 프로젝트 없음 · 주제 없음
- generic [aria-hidden] [ref=f6e54]: 접기
- generic [ref=f6e55]:
- generic [ref=f6e56]:
- generic [ref=f6e57]: 프로젝트
- group [ref=f6e59]:
- generic "Project" [ref=f6e60] [cursor=pointer]:
- generic [ref=f6e61]: 프로젝트 없음
- generic [aria-hidden] [ref=f6e62]:
- generic [ref=f6e63]:
- generic [ref=f6e64]: 주제
- group [ref=f6e66]:
- generic "Topic" [ref=f6e67] [cursor=pointer]:
- generic [ref=f6e68]: 주제 없음
- generic [aria-hidden] [ref=f6e69]:
- generic [ref=f6e70]:
- generic [ref=f6e71]: URL 이름
- generic [ref=f6e72]:
- generic [aria-hidden] [ref=f6e73]: /
- textbox "slug" [ref=f6e74]:
- /placeholder: 비우면 제목에서 자동 생성
- text: zz-siheom-jakeobbon-jiul-geos
- generic [ref=f6e75]: 직접 정하지 않아도 저장할 때 제목을 기준으로 만들어집니다.
- group [ref=f6e76]:
- generic "연결된 기록 필요할 때 추가 +" [ref=f6e77] [cursor=pointer]:
- generic [ref=f6e78]: 연결된 기록
- generic [ref=f6e79]: 필요할 때 추가
- text: +
- text: +
- status [ref=f6e80]
- region [ref=f6e81]:
- generic [ref=f6e82]:
- paragraph [ref=f6e83]: CASE
- heading "문제와 검증" [level=2] [ref=f6e84]
- paragraph [ref=f6e85]: 문제와 결론을 먼저 고정하고, 그 사이의 검증 과정을 본문 블록으로 이어서 작성합니다.
- generic [ref=f6e86]:
- generic [ref=f6e87]:
- generic [ref=f6e88]: 문제
- textbox "문제" [ref=f6e89]:
- /placeholder: 어떤 현상이 문제였는지 한 문단으로 적어 주세요.
- generic [ref=f6e90]:
- generic [ref=f6e91]: 결론
- textbox "결론" [ref=f6e92]:
- /placeholder: 검증을 통해 무엇을 확인했는지 적어 주세요.
- group [ref=f6e93]:
- generic "검증 세부정보 0개 입력됨" [ref=f6e94] [cursor=pointer]:
- generic [ref=f6e95]: 검증 세부정보
- generic [ref=f6e96]: 0개 입력됨
- generic [ref=f6e97]:
- generic [ref=f6e98]:
- generic [ref=f6e99]:
- text: 본문
- paragraph [ref=f6e100]: 작성 화면이 곧 문서입니다. 빈 블록에서 / 를 입력해 제목·목록·코드 블록을 추가할 수 있습니다.
- generic [ref=f6e101]:
- button "본문에 자료 넣기" [ref=f6e103]
- generic [ref=f6e104]:
- generic [ref=f6e105]: 업로드 종류
- combobox "업로드 종류" [ref=f6e106]:
- option "이미지" [selected]
- option "다이어그램"
- option "첨부파일"
- button "Asset 업로드" [ref=f6e107]: 업로드
- region "본문" [ref=f6e108]:
- generic [ref=f6e110]:
- generic "텍스트 블록 작업" [ref=f6e111]:
- button "1번째 블록 메뉴" [ref=f6e112]: ⋮⋮
- textbox "1번째 텍스트" [ref=f6e114]:
- /placeholder: 내용을 입력하거나 / 를 눌러 블록을 추가하세요
- generic "1번째 블록 순서와 삭제":
- button "위로 이동" [disabled]: ↑
- button "아래로 이동" [disabled]: ↓
- button "블록 삭제": 삭제
- button "+ 블록 추가" [ref=f6e115]
- paragraph [ref=f6e116]: 빈 블록에서 / 를 입력하면 제목·목록·코드 같은 블록으로 바꿀 수 있습니다.
- paragraph [ref=f6e117]: 버전 2으로 저장했습니다.