GitHub 조직 저장소를 Vercel 무료 플랜으로 배포하는 완벽 가이드: Git 연동 없이 3개 토큰으로 해결하기
GitHub 조직(Organization) 저장소를 운영하다 보면 Vercel의 Git 연동을 사용하기 어려운 상황에 자주 직면합니다. 조직 정책, 권한 문제, 무료 플랜 제약 등 다양한 이유로 인해 일반적인 배포 방법이 막히는 경우가 많습니다.
이 글에서는 **Git 연동 없이 Vercel CLI + GitHub Actions + 3개의 시크릿(토큰/ID)**만으로 안전하고 자동화된 배포 파이프라인을 구축하는 방법을 실무 관점에서 상세히 설명합니다.
🚨 문제 상황: 왜 조직 저장소는 배포가 까다로운가?
전형적인 시나리오
Organization Repository → Vercel Git 연동 시도 → ❌ 실패
오류 메시지:- "Organization repositories require a Team plan"- "Insufficient permissions"- "Git integration not available for this repository"주요 장애물
- 조직 저장소 제약: Vercel 무료 플랜은 개인 저장소만 Git 연동 지원
- 보안 정책: 조직 관리자가 외부 앱 연동을 차단한 경우
- 권한 문제: 저장소에 대한 Vercel 앱 설치 권한이 없는 경우
- 비용: Team 플랜으로 업그레이드하기에는 부담
💡 해결책: Vercel CLI를 활용한 우회 배포
핵심 아이디어
“Git 연동을 사용하지 않고, CI 환경에서 Vercel CLI로 직접 인증/빌드/배포”
필요한 것
단 3개의 시크릿만 있으면 됩니다:
VERCEL_ORG_ID: Vercel 팀 또는 개인 계정 IDVERCEL_PROJECT_ID: Vercel 프로젝트 IDVERCEL_TOKEN: Vercel API 토큰
이 방법의 장점
✅ Git 연동 불필요: 조직 정책에 구애받지 않음 ✅ 무료 플랜 가능: Team 플랜 없이도 완벽하게 작동 ✅ 완전 자동화: PR 생성 시 Preview, main 브랜치 배포 시 Production ✅ 권한 최소화: 배포에 필요한 최소한의 권한만 사용 ✅ 재현 가능: 로컬/CI 어디서든 동일한 프로세스
📋 전체 흐름 한눈에 보기
graph TD A[개발자 코드 Push] --> B{브랜치 확인} B -->|PR 브랜치| C[GitHub Actions 트리거] B -->|main 브랜치| D[GitHub Actions 트리거] C --> E[Vercel CLI로 Preview 빌드] D --> F[Vercel CLI로 Production 빌드] E --> G[Preview 배포 *.vercel.app] F --> H[Production 배포 your-domain.com]핵심 프로세스:
- Vercel에서 프로젝트 생성 (Git 연동 없이)
- 프로젝트 ID와 조직 ID 확인
- API 토큰 생성
- GitHub Secrets에 3개 값 등록
- GitHub Actions 워크플로우 설정
- 자동 배포 완성!
🔧 1단계: Vercel 프로젝트 설정
1.1 프로젝트 생성
Vercel Dashboard 접속: https://vercel.com/dashboard
- “Add New…” → “Project” 클릭
- Git 연동 건너뛰기: “Import” 대신 “Continue with Template” 또는 빈 프로젝트 생성
- 프레임워크 선택: Next.js, Astro, SvelteKit 등
- 프로젝트 이름 설정
중요: Git 저장소를 연결하지 않고 프로젝트만 먼저 생성합니다.
1.2 프로젝트 ID 확인
Vercel Dashboard → 프로젝트 선택 → Settings → General → Project ID예시: prj_abc123xyz789
이 값을 복사하여 메모장에 저장합니다.
1.3 조직/팀 ID 확인
Vercel Dashboard → Settings → General → Team ID (또는 User ID)형식:
- 팀 계정:
team_abc123xyz789 - 개인 계정:
user_abc123xyz789
이 값도 복사하여 저장합니다.
1.4 API 토큰 생성
Vercel Dashboard → Settings → Tokens → Create Token주의사항:
- 토큰은 생성 직후 한 번만 표시됩니다
- 즉시 복사하여 안전한 곳에 저장
- 토큰 이름:
github-actions-deploy(알아보기 쉽게) - 권한 범위: 기본 설정 (Full Account Access)
생성된 토큰 예시: vercel_abc123...xyz789
🔐 2단계: GitHub Secrets 등록
GitHub 저장소 설정
GitHub 저장소 → Settings → Secrets and variables → Actions→ "New repository secret" 클릭3개의 시크릿 추가
1. VERCEL_ORG_ID
Name: VERCEL_ORG_IDValue: team_abc123xyz789 (또는 user_abc123xyz789)2. VERCEL_PROJECT_ID
Name: VERCEL_PROJECT_IDValue: prj_abc123xyz7893. VERCEL_TOKEN
Name: VERCEL_TOKENValue: vercel_abc123...xyz789조직 저장소 권한 주의사항
- 저장소 관리 권한이 있어야 시크릿 등록 가능
- 권한이 없다면 조직 관리자에게 요청
- Organization-level secrets 사용도 가능 (여러 저장소에서 공유)
⚙️ 3단계: GitHub Actions 워크플로우 작성
파일 생성
.github/workflows/vercel-deploy.yml 파일을 생성합니다.
완전한 워크플로우 코드
name: Vercel Deploy (CLI)
on: push: branches: [main] pull_request: workflow_dispatch: # 수동 실행 가능
env: VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }} VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }} VERCEL_TOKEN: ${{ secrets.VERCEL_TOKEN }} NEXT_TELEMETRY_DISABLED: 1 # Next.js 텔레메트리 비활성화
jobs: deploy-preview: name: Deploy Preview if: github.event_name == 'pull_request' runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4
- name: Setup Node.js uses: actions/setup-node@v4 with: node-version: 20 cache: "pnpm"
- name: Setup pnpm uses: pnpm/action-setup@v4 with: version: 9 run_install: true
- name: Pull Vercel environment (preview) run: pnpm dlx vercel@latest pull --yes --environment=preview --token "$VERCEL_TOKEN"
- name: Build with Vercel run: pnpm dlx vercel@latest build --token "$VERCEL_TOKEN"
- name: Deploy to Vercel (preview) run: | url=$(pnpm dlx vercel@latest deploy --prebuilt --token "$VERCEL_TOKEN" --yes) echo "Preview URL: $url" echo "PREVIEW_URL=$url" >> $GITHUB_ENV
- name: Comment PR with preview URL uses: actions/github-script@v7 if: github.event_name == 'pull_request' with: script: | github.rest.issues.createComment({ issue_number: context.issue.number, owner: context.repo.owner, repo: context.repo.repo, body: `🚀 Preview deployed!\n\n✨ **Preview URL**: ${process.env.PREVIEW_URL}` })
deploy-production: name: Deploy Production if: github.event_name == 'push' && github.ref == 'refs/heads/main' runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4
- name: Setup Node.js uses: actions/setup-node@v4 with: node-version: 20 cache: "pnpm"
- name: Setup pnpm uses: pnpm/action-setup@v4 with: version: 9 run_install: true
- name: Pull Vercel environment (production) run: pnpm dlx vercel@latest pull --yes --environment=production --token "$VERCEL_TOKEN"
- name: Build with Vercel run: pnpm dlx vercel@latest build --token "$VERCEL_TOKEN"
- name: Deploy to Vercel (production) run: pnpm dlx vercel@latest deploy --prebuilt --prod --token "$VERCEL_TOKEN" --yes
- name: Deployment completed run: echo "✅ Production deployment completed successfully!"주요 명령어 설명
vercel pull
pnpm dlx vercel@latest pull --yes --environment=preview --token "$VERCEL_TOKEN"역할: Vercel에 저장된 환경변수를 CI 환경으로 동기화
생성되는 파일:
.vercel/project.json: 프로젝트 메타데이터.vercel/README.txt: 설정 정보.env.local: 환경변수 (Preview 또는 Production)
vercel build
pnpm dlx vercel@latest build --token "$VERCEL_TOKEN"역할: Vercel 빌드 시스템으로 프로젝트 빌드
생성되는 디렉토리:
.vercel/output: 배포용 프리빌트 아티팩트
장점:
- Vercel의 최적화된 빌드 설정 사용
- 이미지 최적화, Edge Functions 등 자동 처리
vercel deploy --prebuilt
pnpm dlx vercel@latest deploy --prebuilt --prod --token "$VERCEL_TOKEN" --yes역할: 이미 빌드된 아티팩트를 Vercel에 업로드
옵션:
--prebuilt:.vercel/output디렉토리 사용--prod: Production 도메인에 배포 (없으면 Preview)--yes: 확인 프롬프트 건너뛰기
🚀 4단계: 실전 배포 시나리오
시나리오 1: PR 생성 시 자동 Preview 배포
# 1. Feature 브랜치 생성git checkout -b feat/user-authentication
# 2. 코드 작성 및 커밋git add .git commit -m "feat: 사용자 인증 기능 추가"
# 3. GitHub에 푸시git push origin feat/user-authentication
# 4. GitHub에서 PR 생성# → GitHub Actions 자동 실행# → Vercel Preview 배포# → PR 코멘트에 Preview URL 자동 추가결과: 팀원들이 PR에서 Preview URL을 클릭하여 변경사항 즉시 확인 가능
시나리오 2: main 브랜치 병합 시 Production 배포
# 1. PR 리뷰 완료 후 main으로 병합git checkout maingit merge feat/user-authentication
# 2. main 브랜치 푸시git push origin main
# 3. GitHub Actions 자동 실행# → Vercel Production 배포# → 실제 도메인에 반영
# 4. 배포 확인# → https://your-domain.com결과: 2-3분 내에 프로덕션 사이트 업데이트 완료
🔧 5단계: 로컬에서 수동 배포 (선택사항)
긴급 배포가 필요하거나 CI를 거치지 않고 배포해야 할 때:
환경변수 설정
# Windows (PowerShell)$env:VERCEL_ORG_ID="team_abc123xyz789"$env:VERCEL_PROJECT_ID="prj_abc123xyz789"$env:VERCEL_TOKEN="vercel_abc123...xyz789"
# macOS/Linuxexport VERCEL_ORG_ID="team_abc123xyz789"export VERCEL_PROJECT_ID="prj_abc123xyz789"export VERCEL_TOKEN="vercel_abc123...xyz789"배포 실행
# 1. 환경변수 동기화pnpm dlx vercel pull --yes --environment=production
# 2. 빌드pnpm dlx vercel build
# 3. 배포pnpm dlx vercel deploy --prebuilt --prod🛠️ 트러블슈팅 가이드
문제 1: 401 Unauthorized
증상:
Error: Invalid token401 Unauthorized원인 및 해결책:
- 토큰 만료: Vercel Dashboard에서 새 토큰 생성
- 토큰 오타: GitHub Secrets에서 값 재확인
- 권한 부족: 토큰을 생성한 계정이 프로젝트 접근 권한이 있는지 확인
문제 2: 403 Forbidden
증상:
Error: ForbiddenYou don't have access to this project원인 및 해결책:
- ORG_ID 불일치: 프로젝트 소유 주체(팀/개인)와
VERCEL_ORG_ID일치 확인 - PROJECT_ID 오류: Vercel Dashboard에서 정확한 Project ID 재확인
- 토큰 범위: 토큰이 해당 팀/프로젝트에 대한 권한 포함 확인
문제 3: 404 Not Found
증상:
Error: Project not found404 Not Found원인 및 해결책:
- PROJECT_ID 오타: 복사-붙여넣기로 정확히 입력
- 프로젝트 삭제: Vercel에서 프로젝트 존재 여부 확인
- 대소문자 구분: ID는 대소문자를 정확히 구분
문제 4: 빌드 실패
증상:
Error: Build failedExit code: 1원인 및 해결책:
Node 버전 불일치:
- uses: actions/setup-node@v4 with: node-version: 20 # 로컬과 동일한 버전 사용의존성 설치 실패:
- uses: pnpm/action-setup@v4 with: version: 9 # package.json의 packageManager 필드와 일치 run_install: true환경변수 누락:
# Vercel Dashboard에서 필요한 환경변수 설정# Settings → Environment Variables문제 5: Preview는 성공, Production 실패
증상: PR 배포는 되는데 main 브랜치 배포 실패
원인 및 해결책:
-
Production 환경변수 누락:
Terminal window # Vercel Dashboard → Settings → Environment Variables# Production 환경에 필요한 변수 추가 -
—prod 권한 확인:
# 토큰이 Production 배포 권한 포함 확인 -
브랜치 보호 규칙:
# GitHub Settings → Branches# main 브랜치 보호 규칙이 CI를 차단하지 않는지 확인
💎 고급 활용 팁
팁 1: Monorepo 지원
프로젝트가 monorepo의 하위 디렉토리에 있는 경우:
jobs: deploy-preview: runs-on: ubuntu-latest defaults: run: working-directory: apps/web # 하위 디렉토리 지정 steps: # ... (이하 동일)또는 Vercel 프로젝트 설정에서:
Settings → General → Root Directory → apps/web팁 2: 환경변수 전략
민감한 정보는 Vercel Dashboard에 저장:
Settings → Environment Variables- DATABASE_URL (Production)- API_KEY (Production, Preview)- NEXT_PUBLIC_APP_URL (Production, Preview)CI에서만 필요한 값은 GitHub Secrets에:
env: CI_SPECIFIC_VAR: ${{ secrets.CI_VAR }}팁 3: 배포 알림 설정
Slack 알림 추가:
- name: Notify Slack if: success() uses: slackapi/slack-github-action@v1 with: payload: | { "text": "🚀 Production 배포 완료!", "url": "https://your-domain.com" } env: SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK }}팁 4: 캐시 최적화
빌드 속도 향상을 위한 캐시 설정:
- uses: actions/setup-node@v4 with: node-version: 20 cache: "pnpm" # pnpm 의존성 캐싱
- uses: actions/cache@v4 with: path: .vercel key: ${{ runner.os }}-vercel-${{ hashFiles('**/pnpm-lock.yaml') }}팁 5: npm/yarn 사용자를 위한 설정
npm 사용 시:
- uses: actions/setup-node@v4 with: node-version: 20 cache: "npm"- run: npm ci- run: npx vercel pull --yes --environment=preview --token "$VERCEL_TOKEN"- run: npx vercel build --token "$VERCEL_TOKEN"- run: npx vercel deploy --prebuilt --token "$VERCEL_TOKEN" --yesyarn 사용 시:
- uses: actions/setup-node@v4 with: node-version: 20 cache: "yarn"- run: yarn --frozen-lockfile- run: yarn dlx vercel pull --yes --environment=preview --token "$VERCEL_TOKEN"- run: yarn dlx vercel build --token "$VERCEL_TOKEN"- run: yarn dlx vercel deploy --prebuilt --token "$VERCEL_TOKEN" --yes🔐 보안 모범 사례
1. 토큰 관리
✅ 해야 할 것:
- GitHub Secrets에만 저장
- 정기적으로 토큰 재생성 (3-6개월)
- 최소 권한 원칙 적용
❌ 하지 말아야 할 것:
- 코드에 하드코딩
- 공개 저장소의 환경 파일에 포함
- 팀원과 토큰 직접 공유
2. 권한 분리
개발자 → GitHub Push 권한만CI → Vercel 배포 권한만관리자 → Secrets 관리 권한3. 감사 로그 활용
Vercel Dashboard → Settings → Audit Log- 배포 이력 확인- 토큰 사용 내역 모니터링- 이상 활동 감지📊 Git 연동 vs CLI 배포 비교
| 항목 | Git 연동 | CLI 배포 (본 가이드) |
|---|---|---|
| 설정 난이도 | ⭐⭐ 쉬움 | ⭐⭐⭐ 중간 |
| 조직 저장소 | ❌ Team 플랜 필요 | ✅ 무료 플랜 가능 |
| 권한 문제 | ❌ 자주 발생 | ✅ 최소 권한 |
| 커스터마이징 | ⭐⭐ 제한적 | ⭐⭐⭐⭐⭐ 완전 제어 |
| 빌드 캐시 | ✅ 자동 | ⭐⭐⭐ 수동 설정 |
| Preview 코멘트 | ✅ 자동 | ⭐⭐⭐ 스크립트 필요 |
| 보안성 | ⭐⭐⭐ 양호 | ⭐⭐⭐⭐⭐ 우수 |
| 유지보수 | ⭐⭐⭐⭐⭐ 쉬움 | ⭐⭐⭐ 중간 |
✅ 최종 체크리스트
배포 전 반드시 확인:
Vercel 설정
- 프로젝트 생성 완료
-
VERCEL_PROJECT_ID정확히 복사 -
VERCEL_ORG_ID정확히 복사 (team_*또는user_*) -
VERCEL_TOKEN생성 및 저장 - 필요한 환경변수 Vercel Dashboard에 등록
GitHub 설정
- 3개 Secrets 등록 완료
- 오타 없이 정확히 입력
-
.github/workflows/vercel-deploy.yml파일 생성 - Node/패키지 매니저 버전 로컬과 일치
테스트
- PR 생성하여 Preview 배포 테스트
- Preview URL 정상 작동 확인
- main 브랜치 푸시하여 Production 배포 테스트
- Production 도메인 정상 작동 확인
🎯 결론
GitHub 조직 저장소라고 해서 Vercel 무료 배포가 불가능한 것은 아닙니다. Vercel CLI와 3개의 시크릿만 있으면:
✅ Git 연동 없이 완전 자동화된 배포 파이프라인 구축 ✅ PR마다 독립적인 Preview 환경 ✅ main 브랜치 병합 시 자동 Production 배포 ✅ 조직 정책과 무관하게 무료 플랜 활용 ✅ 최소 권한으로 보안성 확보
이 방법은 실제 프로덕션 환경에서 검증되었으며, 수많은 프로젝트에서 안정적으로 사용되고 있습니다.
지금 바로 시작해보세요! 30분이면 완전한 배포 파이프라인을 구축할 수 있습니다.
💬 댓글