1 parent
0d9b1fd703
commit
7c09c89da5
9 files changed
+202
-31
No files matched your search
@@ -9,6 +9,11 @@
|
||||
| 실행 | Gitea Actions에서 `main`을 선택해 수동 실행 |
|
||||
| Worker | `baron-qa-gateway-prod` |
|
||||
| Custom Domain | `https://qa.baroncs.co.kr` |
|
||||
| EGBIM 작성페이지 | `https://qa.baroncs.co.kr/egbim/` |
|
||||
| 운영 ABC API | `https://qa.brsw.kr` |
|
||||
| 운영 EGBIM 프로젝트 ID | `01a1c543-ab4f-744f-8eff-ab85f2644271` |
|
||||
| 운영 Q&A 채널 ID | `01a1c544-35ac-7674-9bf0-2469bfbe3e52` |
|
||||
| 운영 SSO issuer | `https://app.brsw.kr/oidc` |
|
||||
| Cloudflare account ID | `81fa2d48964d31dd0da9558f9ce601d1` |
|
||||
| 정적 파일 R2 bucket | `baron-qa-write` |
|
||||
| R2 binding 이름 | `QA_BUCKET` |
|
||||
@@ -26,7 +31,7 @@
|
||||
|---|---|
|
||||
| `PROD_CLOUDFLARE_API_TOKEN` | 기존 운영 Worker를 배포하고 R2 파일을 업로드할 수 있는 Cloudflare token |
|
||||
| `PROD_SESSION_SECRET` | 최소 32자 운영 세션 서명키. 예: `openssl rand -hex 32`로 생성한 값 |
|
||||
| `PROD_ABC_API_KEY` | **등록 보류:** 관리페이지 서버 확정 후 운영 ABC project/channel API key 등록 |
|
||||
| `PROD_ABC_API_KEY` | 운영 EGBIM 프로젝트에서 발급한 API key. 작성페이지 저장소에 별도 등록 |
|
||||
| `PROD_ORG_CONTEXT_KEY_ID` | 운영 조직 컨텍스트 연동 Key ID |
|
||||
| `PROD_ORG_CONTEXT_KEY_SECRET` | 운영 조직 컨텍스트 연동 Key Secret |
|
||||
|
||||
@@ -50,22 +55,25 @@ R2 권한은 계정 범위의 **Workers R2 Storage Write/Edit**를 선택한다.
|
||||
|
||||
| 이름 | 필수 | 값 |
|
||||
|---|---|---|
|
||||
| `PROD_AUTH_CLIENT_ID` | 필수 | 운영 callback URI가 허용된 SSO client ID |
|
||||
| `PROD_ABC_API_BASE_URL` | 필수 / 등록 보류 | 관리페이지 서버 확정 후 운영 ABC HTTPS origin 등록. `/api` 경로를 붙이지 않는다. |
|
||||
| `PROD_ABC_PROJECT_ID` | 필수 / 등록 보류 | 관리페이지 서버 확정 후 운영 ABC project UUID 등록 |
|
||||
| `PROD_ABC_CHANNEL_ID` | 필수 / 등록 보류 | 관리페이지 서버 확정 후 운영 ABC channel UUID 등록 |
|
||||
| `PROD_AUTH_CLIENT_ID` | 필수 | 운영 SSO의 Public PKCE client ID. callback은 `https://qa.baroncs.co.kr/auth/callback` |
|
||||
| `PROD_AUTH_ISSUER` | 선택 | 기본 `https://app.brsw.kr/oidc`. authorization·token·userinfo 주소를 이 issuer에서 생성 |
|
||||
| `PROD_ABC_API_BASE_URL` | 선택 | 기본 `https://qa.brsw.kr`. 다른 origin은 배포 차단. `/api`와 `/egbim` 경로를 붙이지 않는다. |
|
||||
| `PROD_ABC_PROJECT_ID` | 선택 | 기본 `01a1c543-ab4f-744f-8eff-ab85f2644271`. 다른 값은 배포 차단 |
|
||||
| `PROD_ABC_CHANNEL_ID` | 선택 | 기본 `01a1c544-35ac-7674-9bf0-2469bfbe3e52`. EGBIM의 Q&A 채널이며 다른 값은 배포 차단 |
|
||||
| `PROD_ORG_CONTEXT_ENABLED` | 필수 | `true` |
|
||||
| `PROD_ORG_CONTEXT_TENANT_IDS` | 필수 | 기준 tenant UUID JSON 배열. 예: `["tenant-UUID"]` |
|
||||
| `PROD_ORG_CONTEXT_API_URL` | 선택 | 기본 `https://sadmin.hmac.kr/api/v1/integrations/org-context` |
|
||||
| `PROD_ORG_CONTEXT_API_URL` | 선택 | 기본 `https://app.brsw.kr/api/v1/integrations/org-context` |
|
||||
| `PROD_ORG_CONTEXT_SCOPE_MODE` | 선택 | 기본 `SCOPED` |
|
||||
| `PROD_ORG_CONTEXT_EXPOSURE` | 선택 | 기본 `identifiers` |
|
||||
| `PROD_ORG_CONTEXT_CACHE_TTL_SECONDS` | 선택 | 기본 `300`, 허용 범위 1~3600 |
|
||||
|
||||
SSO에는 `https://qa.baroncs.co.kr/auth/callback`을 허용한다. Q&A 로그아웃은 Worker가 세션 쿠키를 삭제한 뒤 `AUTH_POST_LOGOUT_REDIRECT_URI`에 설정된 `https://test.baroncs.co.kr/ko/sw-inquiry.html`로 이동한다. 이 이동은 중앙 SSO 로그아웃 API를 사용하지 않는다. 등록된 SSO client나 ABC project/channel이 운영 대상인지 확정한 후 배포한다.
|
||||
|
||||
지금 준비할 Variables는 `PROD_AUTH_CLIENT_ID`와 `PROD_ORG_CONTEXT_*` 6개다. `PROD_AUTH_CLIENT_ID`의 참고값은 기존 스테이징 client `e16898a7-acd2-420a-a224-cdcd89ff66cd`이며, 이 client에 운영 callback이 허용된 경우에만 운영에서도 재사용한다. 별도 운영 client를 만들었다면 그 ID를 등록한다. 기준 tenant UUID와 조직 연동 키는 실제 발급받은 값을 사용한다. 기존 `STAGING_*` 등록은 `PROD_*` 등록으로 간주하지 않는다.
|
||||
`PROD_AUTH_CLIENT_ID`는 운영 issuer에 등록된 Public PKCE client여야 한다. 관리페이지의 비공개 Server-side Web client를 그대로 사용하지 않는다. 운영 작성페이지 callback `https://qa.baroncs.co.kr/auth/callback`과 필요한 scope를 해당 client에 허용한다. 기준 tenant UUID와 조직 연동 키는 운영 값을 사용한다. 기존 `STAGING_*` 등록은 `PROD_*` 등록으로 간주하지 않는다.
|
||||
|
||||
회사·부서 조회용 sadmin 조직 컨텍스트 API 설정은 ABC 관리페이지 연동 설정과 별개다. 조직 API 주소·기준 tenant·키의 운영 사용이 확정된 경우 미리 등록할 수 있다. Secret 값이나 테스트 fixture UUID를 실제 설정값으로 문서에 기록하지 않는다.
|
||||
작성페이지의 `PROD_ABC_API_KEY`는 이 저장소(`disong/baron_qa_write`)의 Secret이다. 관리페이지 저장소의 `PROD_SECRETARY_ABC_API_KEY`와 등록 위치가 다르다. 브라우저는 작성페이지 Worker의 `/api/feedbacks`를 호출하고, Worker만 이 키로 운영 ABC API를 호출한다. `egbim/config.js`에 API 키를 넣지 않는다.
|
||||
|
||||
회사·부서 조회용 조직 컨텍스트 API 설정은 ABC 관리페이지 연동 설정과 별개다. 조직 API 주소·기준 tenant·키의 운영 사용이 확정된 경우 미리 등록할 수 있다. Secret 값이나 테스트 fixture UUID를 실제 설정값으로 문서에 기록하지 않는다.
|
||||
|
||||
Worker runtime에는 `PROD_`를 제거한 이름으로 주입한다. `DEPLOY_COMMIT_SHA`는 workflow가 선택된 커밋에서 자동으로 전달하므로 Gitea에 따로 등록하지 않는다.
|
||||
|
||||
@@ -76,19 +84,21 @@ Worker runtime에는 `PROD_`를 제거한 이름으로 주입한다. `DEPLOY_COM
|
||||
3. `npm ci`로 고정된 의존성을 설치한다.
|
||||
4. `npm run check`와 `npm test`를 실행한다.
|
||||
5. `npm run org:verify`로 실제 운영 조직 API의 인증·범위·구성원 응답을 검증한다.
|
||||
6. `npm run deploy:production -- --dry-run`으로 Worker 번들을 만든다. 이 단계는 Cloudflare 리소스를 변경하지 않는다.
|
||||
7. 해당 커밋의 정적 파일을 `baron-qa-write/releases/<SHA>/...`에 올린다.
|
||||
8. `npm run deploy:production`으로 코드·runtime 변수·Secret을 같은 Worker 배포에 반영한다.
|
||||
9. `npm run production:verify`로 익명 세션, CSS 응답·커밋 일치, 비로그인 글쓰기 redirect를 확인한다. 전파 지연에 대비해 최대 5회 확인한다.
|
||||
6. `npm run abc:verify`로 운영 프로젝트·채널·API key와 문의 필드를 읽기 전용으로 확인한다. 잘못된 키·UUID·필드 구성은 정적 파일 업로드 전에 차단한다.
|
||||
7. `npm run deploy:production -- --dry-run`으로 Worker 번들을 만든다. 이 단계는 Cloudflare 리소스를 변경하지 않는다.
|
||||
8. 해당 커밋의 정적 파일을 `baron-qa-write/releases/<SHA>/...`에 올린다.
|
||||
9. `npm run deploy:production`으로 코드·runtime 변수·Secret을 같은 Worker 배포에 반영한다.
|
||||
10. `npm run production:verify`로 익명 세션, CSS 응답·커밋 일치, 비로그인 글쓰기 redirect를 확인한다. 전파 지연에 대비해 최대 5회 확인한다.
|
||||
|
||||
Secret 파일은 임시 디렉터리에 접근 권한 `0600`으로 만들고 배포 명령 종료 후 삭제한다. Secret 값은 CLI 인자나 로그로 출력하지 않는다.
|
||||
|
||||
## 첫 운영 배포 실행
|
||||
|
||||
현재 `PROD_ABC_API_KEY`, `PROD_ABC_API_BASE_URL`, `PROD_ABC_PROJECT_ID`, `PROD_ABC_CHANNEL_ID` 등록은 관리페이지 서버 확정까지 보류한다. 이 값들이 없으면 필수 설정 검증에서 배포를 중단한다. SSO·조직 컨텍스트·Cloudflare·세션 서명키 설정은 먼저 준비할 수 있다.
|
||||
운영 API 주소와 사용자가 확정한 EGBIM 프로젝트·Q&A 채널 UUID를 운영 기본값으로 반영했다. Gitea의 `PROD_ABC_API_BASE_URL`·`PROD_ABC_PROJECT_ID`·`PROD_ABC_CHANNEL_ID`가 비어 있으면 이 값을 사용하며, 다른 값이면 업로드 전에 중단한다. 운영 프로젝트 API key는 별도 Secret이 필요하다. 실제 도메인이 `Hello World!`만 반환하면 Q&A 작성페이지 코드가 해당 도메인에서 서비스되지 않는 상태다. Worker 코드 배포와 Cloudflare custom domain의 대상 Worker를 함께 확인한다. 관리 서버의 CORS 설정만으로 작성페이지가 배포되지는 않는다.
|
||||
|
||||
- [x] 관리페이지 연동 `PROD_ABC_*` 4개를 제외한 운영 Secrets와 Variables 등록을 완료했다. 사용자 보고 기준이며 실제 값·권한 검증은 아직 수행하지 않았다.
|
||||
- [ ] 관리페이지 서버 확정 후 `PROD_ABC_API_KEY`, `PROD_ABC_API_BASE_URL`, `PROD_ABC_PROJECT_ID`, `PROD_ABC_CHANNEL_ID`를 등록한다.
|
||||
- [x] 작성페이지 저장소의 `PROD_ABC_API_KEY` 등록을 완료했다. 사용자 보고 기준이며 실제 키 검증은 workflow에서 수행한다.
|
||||
- [x] 운영 EGBIM 프로젝트·Q&A 채널 UUID를 사용자에게 확인하고 운영 기본 설정에 반영했다.
|
||||
- [x] 운영 SSO callback과 관련 변수 등록을 완료했다. 사용자 완료 보고 기준이다.
|
||||
- [ ] ABC project/channel과 조직 API의 실제 접근 권한을 확인한다.
|
||||
- [ ] 이 변경을 `main`에 반영한다.
|
||||
@@ -98,7 +108,7 @@ Secret 파일은 임시 디렉터리에 접근 권한 `0600`으로 만들고 배
|
||||
|
||||
## 실패와 롤백
|
||||
|
||||
- 설정·조직 API·빌드 검증 실패는 운영 정적 파일 업로드와 Worker 배포 전에 중단된다.
|
||||
- 설정·조직 API·ABC 연결·빌드 검증 실패는 운영 정적 파일 업로드와 Worker 배포 전에 중단된다.
|
||||
- 정적 파일 업로드가 실패해도 기존 Worker는 이전 커밋 경로를 계속 읽는다. 다시 실행하면 같은 커밋 경로로 업로드한다.
|
||||
- Worker 배포 후 HTTP 확인이 실패하면 workflow는 실패로 표시되지만 이미 반영한 배포를 자동으로 되돌리지는 않는다. 마지막 정상 Worker 버전으로 명시적으로 롤백한다.
|
||||
- Cloudflare의 `baron-qa-gateway-prod` **Deployments**에서 마지막 정상 버전으로 rollback하면 해당 버전의 `QA_ASSET_PREFIX`와 정적 파일을 다시 사용한다. 이전 release 경로는 보관한다.
|
||||
|
||||
Reference in new issue
Block a user