서비스 운영 환경과 배포 방법
최종 업데이트: 2025년 6월 29일
이 문서는 SurfAI 프로젝트의 클라우드 인프라 구성, 배포, 그리고 CI/CD 파이프라인 설정에 대한 전체 가이드를 제공합니다.
1. 개요
이 서비스는 프론트엔드와 백엔드 애플리케이션을 각각의 Docker 컨테이너로 빌드하여, Google Cloud Run에 배포합니다. CI/CD는 GitHub Actions를 통해 자동화되며, 인증은 Workload Identity Federation을 사용하여 안전하게 처리됩니다.
2. Google Cloud Platform (GCP) 설정
가. 프로젝트 및 API 활성화
- 프로젝트 ID:
surfai-463212 - 배포를 위해, GCP 프로젝트에서 다음 API들이 반드시 **활성화(Enabled)**되어 있어야 합니다.
- Cloud Run API: 애플리케이션 배포 및 실행
- Cloud Build API:
Docker이미지 빌드 - Artifact Registry API: 빌드된
Docker이미지 저장 - IAM API (Identity and Access Management): 권한 관리
- IAM Service Account Credentials API: 인증 토큰 생성
나. 서비스 계정 (Service Account) 설정
GitHub Actions가 배포 작업을 수행할 때 사용할 전용 "로봇 계정"입니다.
- 서비스 계정 생성:
- 이름:
github-actions-deployer - 이메일 (자동 생성):
[email protected]
- 이름:
- 서비스 계정 자체의 역할 부여:
- "IAM" 페이지에서
github-actions-deployer계정을 찾아 다음 역할들을 부여합니다.Cloud Run 관리자 (Cloud Run Admin)Cloud Build 편집자 (Cloud Build Editor)서비스 계정 사용자 (Service Account User)
- "IAM" 페이지에서
다. Workload Identity 제휴 (GitHub Actions 인증)
GitHub Actions가 비밀 키 없이 안전하게 GCP에 인증하도록 설정합니다.
- ID 풀(Pool) 생성:
- 이름 / 풀 ID:
github-actions-pool
- 이름 / 풀 ID:
- OIDC 공급업체(Provider) 추가:
- 공급업체 ID:
github-actions-provider - 발급자 (URL):
https://token.actions.githubusercontent.com - 속성 조건:
assertion.repository_owner == 'jaytsol'
- 공급업체 ID:
- 서비스 계정과 외부 ID 연결 (가장 중요):
github-actions-deployer서비스 계정의 "권한" 탭으로 이동합니다.- **"+ 액세스 권한 부여"**를 클릭합니다.
- 새 주 구성원:
principalSet://iam.googleapis.com/projects/781704308120/locations/global/workloadIdentityPools/github-actions-pool/attribute.repository_owner/jaytsol - 역할 부여: 다음 두 가지 역할을 모두 추가하고 저장합니다.
워크로드 아이덴티티 사용자 (Workload Identity User)서비스 계정 토큰 생성자 (Service Account Token Creator)
3. 애플리케이션 배포 (Cloud Run)
프론트엔드와 백엔드는 각각 별도의 Cloud Run 서비스로 배포됩니다.
가. 백엔드 (surfai-backend)
- 배포 리전:
asia-northeast1(타이완) - 도메인:
api.surfai.org - 필수 환경 변수:
NODE_ENV:productionAPI_BASE_URL:https://api.surfai.orgFRONTEND_URL:https://surfai.orgROOT_DOMAIN:surfai.orgDB_HOST,DB_PORT,DB_USERNAME,DB_PASSWORD,DB_DATABASE: 운영용 PostgreSQL (Supabase) 정보JWT_SECRET,JWT_REFRESH_SECRET,JWT_REFRESH_EXPIRATION_TIMEGOOGLE_CLIENT_ID,GOOGLE_CLIENT_SECRETADMIN_EMAILS- ...기타
R2,ComfyUI관련 키
나. 프론트엔드 (surfai-frontend)
- 배포 리전:
asia-northeast1(타이완) - 도메인:
surfai.org - 참고: 프론트엔드의 환경 변수는 런타임이 아닌, 빌드 시점에 주입되어야 합니다. (
GitHub Actions워크플로우의substitutions플래그를 통해 전달)
4. CI/CD (GitHub Actions)
가. GitHub 저장소 Secrets
각 리포지토리의 "Settings" > "Secrets and variables" > "Actions" 에서 다음 Secret들을 설정합니다.
- 공통 Secret (프론트/백엔드 모두):
GCP_PROJECT_ID:surfai-463212GCP_WORKLOAD_IDENTITY_PROVIDER:projects/781704308120/...(Workload Identity 공급자의 전체 이름)
- 프론트엔드 전용 Secret:
NEXT_PUBLIC_API_URL:https://api.surfai.orgNEXT_PUBLIC_WEBSOCKET_URL:wss://api.surfai.org/events
나. 워크플로우 파일
- 각 리포지토리의
.github/workflows/폴더에deploy-backend.yml과deploy-frontend.yml을 배치합니다. - 이 파일들은
main브랜치에 코드가 푸시될 때마다 자동으로 실행되어,cloudbuild.yaml을 참조하여Docker이미지를 빌드하고Cloud Run에 배포합니다.