diff --git a/docs/dev_dashboard.html b/docs/dev_dashboard.html index 0d3281c..56490b3 100644 --- a/docs/dev_dashboard.html +++ b/docs/dev_dashboard.html @@ -302,7 +302,7 @@ project pulse

지금 위치: NAS vignette-prod 정식 배포 완료(SHA dce85620) — public API/웹 모두 새 빌드 서빙, 데이터 보존 확인. 실계정 로그인 폐루프와 C-001·REQ-008 사람 게이트가 남았다.

2026-08-31 배포 파이프라인 재정립(소유자 지시): git 관리·배포는 git.chanpaca.net(Forgejo 11.0.16) 중심으로 이관 완료 — yunchan/vignette 레포 생성, master=be08c0b5 push, 소스 SSOT 지정. github.com(origin)은 private 백업/미러로 유지(제거 아님). 배포 대상은 NAS Production(docker-compose.nas.yml, vignette-prod)이며 이 PC는 단순 개발용. Cloudflare는 서비스 공개 서빙용만 유지, cloudflare tunnel은 제거 대상. 관리 도구 scripts/vignette-pipeline.py --check로 기준선 무결성 점검(ALL OK): 문서 deployment-pipeline.md.

-

현재(2026-09-01 A 경로 실배포): Forgejo master dce85620를 NAS에서 직접 clone·빌드해 vignette-prod api/engine/web을 교체했고, Cloudflare Pages production도 새 빌드(index-BFKGXJQi.js, 이전 세대 자산 보존)로 배포했다. 사전 dump cab6826b…(11.0MB·TOC 1783)·env 백업·구 이미지 보존으로 롤백 경로를 고정했다. 중복 활성 회기 14쌍 30행은 최신 유지 정책으로 종료(영수증 보존·삭제 0)하고 마이그레이션 20/21/22를 온라인 적용했다. 이 과정에서 mig22의 name[]=text[] 캐스트 결함과 master의 게이트웨이 openai provider 누락 회귀를 발견해 즉시 교정했다(테스트 71 passed). 배포 후 public health ok·db/engine true, OpenAPI 200, /auth/me 401, dev-login 404, 데이터 집계 전후 동일(app_user 1380/sessions 618/turns 1743). 증거: nas-prod-deploy-2026-09-01.json. 다음: headful 실계정 로그인→회기 폐루프(소유자 창내 로그인), C-001 외부 임상 검수, NAS 재부팅 자동복구 smoke.

+

현재(2026-09-01 A 경로 실배포): Forgejo master dce85620를 NAS에서 직접 clone·빌드해 vignette-prod api/engine/web을 교체했고, Cloudflare Pages production도 새 빌드(index-BFKGXJQi.js, 이전 세대 자산 보존)로 배포했다. 사전 dump cab6826b…(11.0MB·TOC 1783)·env 백업·구 이미지 보존으로 롤백 경로를 고정했다. 중복 활성 회기 14쌍 30행은 최신 유지 정책으로 종료(영수증 보존·삭제 0)하고 마이그레이션 20/21/22를 온라인 적용했다. 이 과정에서 mig22의 name[]=text[] 캐스트 결함과 master의 게이트웨이 openai provider 누락 회귀를 발견해 즉시 교정했다(테스트 71 passed). 배포 후 public health ok·db/engine true, OpenAPI 200, /auth/me 401, dev-login 404, 데이터 집계 전후 동일(app_user 1380/sessions 618/turns 1743). 증거: nas-prod-deploy-2026-09-01.json. headful 실계정 폐루프도 완료: NAS env의 OAuth secret 오류(invalid_client)를 발견·교정한 뒤 소유자 실계정 로그인→기존 회기 20건 표시(데이터 보존)→새 사례 회기 생성(mig22 실증)→실턴 SSE·AI 응답→종료→리뷰 생성까지 GREEN(sessions 619·turns 1745·case_profile 566). 일일 검증형 DB 백업 사이드카도 가동(첫 덤프 11.2MB OK). 다음: C-001 외부 임상 검수, NAS 재부팅 자동복구 smoke, 백업 실패 알림·off-host 복제.

운영 복구·watchdog·배포 상세 보기

2026-08-31 사례 연속성 후보: source candidate에는 같은 NPC의 완전히 새로 시작(빈 새 case)과 이어서 진행(선택 case의 압축 기억)을 분리했고, 사례별 누적 회기·상담자 가시 턴·누적 시간을 시작 전 표시하며 기억은 lazy foldout으로 숨겼다. migration 22는 legacy case unique만 해제하고 migration 21의 단일 활성 회기 제약을 유지한다. 이는 source/test 후보 상태이며 NAS DB 적용·배포·실제 production 브라우저 GREEN은 아직 하지 않았다.

diff --git a/docs/ops/backlog-2026-06-26.md b/docs/ops/backlog-2026-06-26.md index 4dba260..9b628d4 100644 --- a/docs/ops/backlog-2026-06-26.md +++ b/docs/ops/backlog-2026-06-26.md @@ -227,10 +227,11 @@ - [x] 중복 활성 회기 14쌍·30행을 최신 유지 정책으로 종료(영수증 `receipts/stale-active-cleanup-20260901.csv`, 삭제 0) 후 마이그레이션 20/21/22 온라인 적용. mig22의 `name[]=text[]` 캐스트 결함 발견→`5a74302e` 교정. master에 게이트웨이 openai provider가 누락된 회귀 발견→구 운영 이미지에서 이식(`dce85620`, 테스트 71 passed) - [x] readiness: public health `ok·db/engine true·openai OK`, OpenAPI 200, `/auth/me` 401, dev-login 404, 컨테이너 healthy, 데이터 보존(app_user 1380/sessions 618/turns 1743/case_profile 565 전후 동일) -### A-3. 로그인·작동 E2E 검증 (실브라우저) — 진행 중 +### A-3. 로그인·작동 E2E 검증 (실브라우저) — **2026-09-01 완료 (전건 GREEN)** - [x] public 로그인 화면 렌더(단일 Google CTA·콘솔 오류는 예상된 401 1건) + OAuth redirect_uri `https://api-vignette.chanpaca.net/auth/callback`·PKCE S256 검증 — headful 브라우저 -- [ ] 실제 Google 계정 로그인→callback→회기·턴 생성(production DB mutation) — **소유자 창내 로그인 대기**(자격증명은 소유자 직접 입력) -- [x] 배포 WEB: Pages production `9224a64b`, 새 entry `index-BFKGXJQi.js` 200·정상 MIME, 직전 entry `index-Bm30Ozeb.js` 200 보존(이전 세대 자산 175개 보존) +- [x] 실제 Google 계정 로그인→callback→회기·턴 생성 완료 — 첫 시도에서 NAS env의 OAuth secret 오류(`invalid_client`)를 발견해 동작 실적 secret으로 교정 후 성공. headful 폐루프: 로그인(소유자 직접 입력)→기존 회기 20건 표시(이전 데이터 보존)→활성 회기 가드·시간 만료 fail-closed 확인→stale 회기 정식 종료→**새 사례(fresh case) 회기 생성(mig22 운영 실증)**→pre pulse 잠금→실턴 SSE·AI 내담자 응답→종료→리뷰 생성. DB 실증: sessions 618→619·turns 1743→1745·case_profile 565→566. 증거: `ops/evidence/prod-e2e-review-2026-09-01.png` +- [x] 배포 WEB: Pages production `9224a64b`, 새 entry `index-BFKGXJQi.js` 200·정상 MIME, 직전 entry `index-Bm30Ozeb.js` 200 보존(이전 세대 자산 175개 보존). 관리자 콘솔 렌더·서비스 상태 5/5 확인 +- [x] **DB 백업 예약 실행 운영화(1단계)** — `db-backup` 사이드카(일일 pg_dump→`pg_restore -l` 검증→원자 게시, 14일 보존)를 정식 스택에 추가, 첫 자동 덤프 11,202,927B 성공. owner 비번-볼륨 불일치도 env와 일치화. 실패 알림·off-host 암호화 복제·restore drill 주기는 후속 게이트로 유지 ### 잔여(재부팅 외) — 그대로 유지 - [ ] 실배포 완료 전까지는 아래가 열린 게이트 유지: `public API/DB·아바타 정식 승격`, `G8 실DB/public 사람 게이트`, diff --git a/docs/ops/evidence/nas-prod-deploy-2026-09-01.json b/docs/ops/evidence/nas-prod-deploy-2026-09-01.json index 5c7e6a0..9227157 100644 --- a/docs/ops/evidence/nas-prod-deploy-2026-09-01.json +++ b/docs/ops/evidence/nas-prod-deploy-2026-09-01.json @@ -66,5 +66,28 @@ "login_screen": "렌더 정상 (단일 Google CTA)", "console_errors": "비로그인 /auth/me 401 1건뿐 (예상 동작)", "oauth_redirect": "accounts.google.com, redirect_uri=https://api-vignette.chanpaca.net/auth/callback, PKCE S256, scope openid email profile" + }, + "oauth_secret_fix": { + "symptom": "google_oauth_callback_failed token_exchange_failed 401 invalid_client", + "cause": "NAS env.nas의 OAUTH_GOOGLE_CLIENT_SECRET이 잘못된 값(secret sha16 ef2cc311c2f2ce39)", + "fix": "동작 실적 있는 PC 런타임 env의 secret(sha16 77becad9b95f2131)으로 교체 후 api 재생성 — 로그인 성공", + "backup": "private/env.nas.before-oauth-secret-fix-20260901" + }, + "headful_closed_loop": { + "login": "소유자 실제 Google 계정 로그인 (자격증명은 소유자 직접 입력) → auth_session 1건 생성, 관리자 권한 유지", + "data_visibility": "기존 회기 20건 목록 표시 (7/13~8/31, 34턴·40턴 회기 포함) — 이전 데이터 보존 확인", + "guards": "활성 회기 존재 시 새 사례 시작 차단 문구, 시간 만료 회기 유예 후 서버 발화 거부 (fail-closed)", + "fresh_case": "P1 새 사례 시작 → session 9fb604a1-cb41-4138-bfee-b52b8475913e 생성 (migration 22 운영 실증)", + "pre_pulse": "목표/과업/유대 3관점 잠금 후 첫 발화 준비", + "turn": "학습자 발화 1건 → AI 내담자(P1 서연, openai 엔진) 응답 1건 SSE 수신·저장", + "end_review": "회기 종료 → 리뷰 페이지 실제 축어록 2개 기반 생성, 탭 UI(축어록/피드백/워크시트) 정상", + "db_delta": "sessions 618→619, turns 1743→1745, case_profile 565→566, 새 회기 ended_at 기록", + "admin_console": "현재 서비스 상태·리소스 5/5 렌더, 페이지 오류 0", + "screenshot": "prod-e2e-review-2026-09-01.png" + }, + "backup_automation": { + "service": "db-backup 사이드카 (postgres 이미지, 일일 pg_dump -Fc → pg_restore -l 검증 → 원자 mv, 보존 14일)", + "first_dump": "vignette-20260901-033517.dump 11,202,927 bytes OK", + "owner_password_alignment": "볼륨 실비번과 env.nas POSTGRES_PASSWORD 불일치를 ALTER ROLE로 일치화 (socket 경유)" } } diff --git a/docs/ops/evidence/prod-e2e-review-2026-09-01.png b/docs/ops/evidence/prod-e2e-review-2026-09-01.png new file mode 100644 index 0000000..613dcf2 Binary files /dev/null and b/docs/ops/evidence/prod-e2e-review-2026-09-01.png differ