본문으로 건너뛰기

프로젝트 계획서

Git + Notion = Gition 개발자를 위한 올인원 협업 플랫폼

목차



1. 프로젝트 주제

1.1. 주 주제

Git 저장소와 블록 기반 문서를 통합한 개발자 협업 플랫폼 구축

1.2. 세부 주제

구분내용
코드 관리GitHub 연동, 브랜치/커밋 관리
문서화Notion 스타일 블록 에디터
CI/CDGitHub Actions + GitLab CI 하이브리드
인증GitHub OAuth 2.0

2. 요구사항 정의

2.1. 기능 요구사항

2.1.1. 인증 및 계정 관리

기능구현 방식상태
GitHub OAuthOAuth 2.0O
세션 관리Token 기반O
로그인/로그아웃localStorage 저장O

2.1.2. 저장소 관리

기능설명상태
저장소 목록GitHub API 연동O
저장소 복제서버로 CloneO
브랜치 전환로컬/리모트 브랜치O
파일 탐색디렉토리 네비게이션O

2.1.3. 에디터

기능설명상태
블록 에디터Notion 스타일O
마크다운 렌더링MarkdownRenderer-
코드 블록구문 강조-
.gition 저장소브랜치별 로컬 페이지O

2.1.4. Git 연동

기능설명상태
커밋 히스토리브랜치별 조회O
파일 뷰어내용 조회/편집O
코드 검색저장소 내 검색O
Issues/PRGitHub 연동 표시O

2.1.5. CI/CD 파이프라인

플랫폼기능상태
GitHub ActionsESLint / PyLint 검사O
Unit Test 실행O
Gitleaks / Trivy 보안 스캔O
GitLab Mirror 동기화O
GitLab CIDocker 이미지 빌드O
Container Registry 푸시O
수동 배포 트리거O

2.1.6. Kubernetes 인프라

구성 요소설명상태
Ingress ControllerHost/Path 기반 라우팅O
MetalLBLoadBalancer IP 할당O
NFS Provisioner동적 PVC 생성O
FastAPI Deployment3 replicas + 공유 볼륨O
Frontend Deployment2 replicas (React + Nginx)O
MySQL MasterVM Docker (외부 Endpoints)O
MySQL Slave StatefulSetK8s 내 2 replicas (GTID 복제)O
imagePullSecretsGitLab Registry 인증O

2.2. 비기능 요구사항

항목요구사항설명
응답 시간API 응답 < 500ms사용자 경험 보장
가용성99% 이상연간 다운타임 87시간 이내
확장성K8s 기반 스케일 아웃HPA/VPA 자동 스케일링
보안OAuth 2.0 + Token 기반GitHub 인증 연동
유지보수성모듈화 아키텍처컴포넌트 단위 배포 가능

3. 프로젝트 목표

3.1. 핵심 목표

┌─────────────────────────────────────────────────────────────┐
│ Gition 핵심 가치 │
├─────────────────────────────────────────────────────────────┤
│ [통합] 코드 + 문서 + CI/CD를 하나의 플랫폼에 │
│ [버전관리] Git 기반 문서 자동 버전 관리 │
│ [실시간] CI/CD 상태를 문서에서 실시간 확인 │
└─────────────────────────────────────────────────────────────┘

3.2. 마일스톤

버전목표진행률
v0.1Core Platform85%
v0.2Visualization & Features10%
v0.3Advanced Integrations0%

4. 시스템 아키텍처 설계

4.1. 전체 구성

┌─────────────────────────────────────────────────────────────┐
│ Client │
│ (React + Vite) │
└─────────────────────────────────────────────────────────────┘


┌─────────────────────────────────────────────────────────────┐
│ Ingress Controller (nginx-ingress) │
│ Host: gition.local │
│ /api/* → api-svc:3001 │
│ /* → frontend-svc:80 │
└─────────────────────────────────────────────────────────────┘

┌───────────────┴───────────────┐
▼ ▼
┌─────────────────────────┐ ┌─────────────────────────────┐
│ FastAPI │ │ React SPA │
│ (Deployment: 3 pods) │ │ (Deployment: replicas) │
│ │ │ │
│ • GitHub OAuth │ │ • 블록 에디터 │
│ • Git Operations │ │ • 파일 브라우저 │
│ • Page CRUD │ │ • 커밋 히스토리 │
│ • /repos NFS Mount │ │ │
└─────────────────────────┘ └─────────────────────────────┘


┌─────────────────────────────────────────────────────────────┐
│ MySQL (Master-Slave) │
├──────────────────────────┬──────────────────────────────────┤
│ Master (VM Docker) │ Slave (K8s StatefulSet) │
│ 172.100.100.11 │ mysql-slave-0, mysql-slave-1│
│ Write 전용 │ Read 전용 (GTID 복제) │
│ │ │
│ • Users │ • 자동 복제 설정 │
│ • Repositories │ • server-id 자동 할당 │
│ • BranchPages │ │
│ • Sessions │ │
└──────────────────────────┴──────────────────────────────────┘

4.2. 기술 스택

계층기술
FrontendReact + Vite + TypeScript
BackendPython FastAPI + GitPython
DatabaseMySQL 8.0 (Master-Slave Replication)
AuthGitHub OAuth 2.0
InfraKubernetes + MetalLB + NFS
CI/CDGitHub Actions + GitLab CI

4.3. Kubernetes 인프라 구성

┌──────────────────────────────────────────────────────────────────────────────┐
│ Client (Browser) │
│ http://gition.local │
└───────────────────────────────────┬───────────────────────────────────────────┘


┌──────────────────────────────────────────────────────────────────────────────┐
│ LoadBalancer Service (MetalLB) │
│ (ingress-nginx-controller) │
│ │
│ externalIPs: 172.100.100.20:80 │
│ NodePort: 30080 (대체 경로) │
└───────────────────────────────────┬───────────────────────────────────────────┘


┌──────────────────────────────────────────────────────────────────────────────┐
│ Ingress Resource (gition-ingress) │
│ Host: gition.local │
├──────────────────────────────────────────────────────────────────────────────┤
│ │
│ /api/* ──────────► api-svc:3001 ──────► FastAPI Pods (x3) │
│ /auth/github ──────────► api-svc:3001 ──────► FastAPI Pods │
│ /health ──────────► api-svc:3001 ──────► FastAPI Pods │
│ /* (catch-all) ──────────► frontend-svc:80 ────► React Pods │
│ │
└──────────────────────────────────────────────────────────────────────────────┘

4.4. CI/CD 파이프라인

┌─────────────────────────────────────────────────────────────────────────────┐
│ CI/CD Pipeline │
└─────────────────────────────────────────────────────────────────────────────┘

┌─────────────┐ ┌─────────────────────────────────────────────────────────┐
│ GitHub │ │ GitHub Actions │
│ (Public) │ │ │
│ │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ [Source]───┼───►│ │ ESLint │──►│ Test │──►│ Security│──►│ Mirror │ │
│ Code │ │ │ PyLint │ │ Suite │ │ Scan │ │ Sync │ │
│ │ │ └─────────┘ └─────────┘ └─────────┘ └────┬────┘ │
└─────────────┘ └─────────────────────────────────────────────────┼───────┘


┌─────────────────────────────────────────────────────────────────────────────┐
│ GitLab (Private) │
│ │
│ ┌─────────────┐ ┌─────────────────┐ ┌─────────────────────┐ │
│ │ Docker │───────►│ Container │───────►│ Kubernetes │ │
│ │ Build │ │ Registry │ │ Deployment │ │
│ └─────────────┘ └─────────────────┘ └─────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────┘

GitHub Actions (Public)

  • ESLint / PyLint 검사
  • Unit Test 실행
  • Gitleaks / Trivy 보안 스캔
  • GitLab Mirror 동기화

GitLab CI (Private)

  • Docker 이미지 빌드
  • Container Registry 푸시
  • 수동 배포 트리거

5. 데이터베이스 설계

5.1. ERD

┌────────────────────┐
│ Users │
├────────────────────┤
│ PK id │
│ github_id │
│ login │
│ email │
│ avatar_url │
│ access_token │
│ created_at │
│ updated_at │
└─────────┬──────────┘

│ 1:N

┌────────────────────┐ ┌────────────────────┐
│ Repositories │ │ Sessions │
├────────────────────┤ ├────────────────────┤
│ PK id │ │ PK id │
│ FK user_id ───────┼─────────│ FK user_id │
│ github_id │ │ token_hash │
│ name │ │ expires_at │
│ full_name │ │ created_at │
│ owner │ └────────────────────┘
│ clone_url │
│ default_branch │
│ is_private │
│ cloned_at │
│ last_synced │
└─────────┬──────────┘

│ 1:N

┌────────────────────┐
│ BranchPages │
├────────────────────┤
│ PK id │
│ FK repo_id │
│ FK user_id │
│ branch_name │
│ title │
│ content (JSON) │
│ created_at │
│ updated_at │
└────────────────────┘

5.2. 주요 테이블 상세

테이블용도주요 컬럼
usersGitHub OAuth 사용자 정보github_id, login, access_token
repositories연동된 저장소 메타데이터github_id, clone_url, default_branch
sessions사용자 세션 관리token_hash, expires_at
branch_pages브랜치별 페이지 콘텐츠branch_name, content (JSON)

5.3. 테이블 관계

관계설명
Users → Repositories1:N (사용자가 여러 저장소 보유)
Users → Sessions1:N (사용자가 여러 세션 생성 가능)
Repositories → BranchPages1:N (저장소별 브랜치 페이지)
Users → BranchPages1:N (사용자별 페이지 소유)

5.4. MySQL 복제 구성

구성 요소위치역할
MasterVM (172.100.100.11) Docker ComposeWrite 전용
Slave (x2)K8s StatefulSetRead 전용 (GTID 복제)

6. 프로젝트 산출물

6.1. 구현 파일 목록

구분파일위치
FrontendApp.tsxfrontend/
Backendmain.pybackend/
DBdatabase.pybackend/
Git Opsgit_ops.pybackend/
CI/CDpipelines.yaml.github/workflows/
GitLab CI.gitlab-ci.yml프로젝트 루트
Dockerdocker-compose.yml프로젝트 루트

6.2. Kubernetes 매니페스트

구분파일설명
Ingressingress.yaml라우팅 규칙 (Host/Path)
LoadBalanceringress-nginx-svc.yamlMetalLB 외부 IP 설정
Backendfastapi-deployment.yamlFastAPI Deployment + Service (Replicas: 3)
Frontendfrontend.yamlReact Deployment + Service
Databasemysql-slave.yamlMySQL StatefulSet (Read Replicas)
Storagenfs-provisioner.yamlNFS 동적 프로비저닝
MetalLBmetallb-config.yamlIP Pool 설정

6.3. 주요 컴포넌트

컴포넌트설명파일
FileTree파일 탐색기 UIfrontend/components/
BlockEditor블록 에디터frontend/components/
CommitHistory커밋 히스토리 뷰frontend/components/
MarkdownRenderer마크다운 렌더링frontend/components/

7. 일정 계획

단계작업 내용상태
1단계OAuth + 저장소 연동O 완료
2단계파일 브라우저 + 에디터O 완료
3단계브랜치/커밋 관리O 완료
4단계블록 에디터 고도화- 진행중
5단계CI/CD 시각화- 예정
6단계K8s 배포O 완료

8. 로드맵

v0.1 Core Platform (85%)

기능상태설명
GitHub OAuth 연동OGitHub 로그인/로그아웃
저장소 목록/복제OGitHub API 연동, 서버 Clone
파일 브라우저O디렉토리 네비게이션
브랜치 관리O로컬/리모트 브랜치 전환
커밋 히스토리O브랜치별 조회
블록 에디터 기본ONotion 스타일
마크다운 렌더링-MarkdownRenderer 구현 예정
코드 블록 구문 강조-Syntax Highlighting
그래프 시각화-D3.js 기반

v0.2 Visualization & Features (10%)

기능상태설명
커밋 그래프-트리 구조 시각화
Issue/PR 생성-GitHub API 연동
웹 터미널-xterm.js + WebSocket
실시간 편집-WebSocket 기반 동시 편집

v0.3 Advanced Integrations (0%)

기능상태설명
ArgoCD GitOps-자동 배포 파이프라인
Helm Chart-K8s 패키지 관리
멀티 클러스터-분산 배포 지원

Infrastructure (완료)

기능상태설명
Docker Compose 개발 환경O로컬 개발용
GitHub Actions CIO린트, 테스트, 보안 스캔
GitLab CI/CDO빌드, 레지스트리, 배포
Kubernetes 배포O아래 상세 참조

Kubernetes 상세

구성 요소상태
Ingress Controller (nginx-ingress)O
LoadBalancer (MetalLB + externalIPs)O
NFS Provisioner (동적 PVC)O
FastAPI Deployment (3 replicas, 공유 저장소)O
Frontend DeploymentO
MySQL Master (VM Docker)O
MySQL Slave StatefulSet (K8s, GTID 복제)O
Read/Write Split (database.py)O

9. 트러블슈팅

9.1. CI/CD 관련

Day문제해결
3Runner에서 GitLab 접근 불가config.tomlclone_url, network_mode = "host" 추가
3HTTP Registry 오류insecure-registries 설정
9Git History Secret LeakageBFG Repo-Cleaner
11Docker 빌드 시 DNS 해석 실패Docker daemon.json에 DNS 추가
# insecure-registries (daemon.json)
{"insecure-registries": ["172.100.100.8:5050"], "dns": ["8.8.8.8"]}

# BFG로 비밀번호 제거
java -jar bfg.jar --replace-text replacements.txt .
git push --force

9.2. Kubernetes 관련

Day문제해결
2PVC PendingRBAC Role/RoleBinding 추가
2Readiness probe failedcommand: bash -c "..." 사용
9Repository not clonedNFS PVC 마운트
9nginx upstream not foundIngress 라우팅으로 변경
# NFS PVC 마운트 (fastapi-deployment.yaml)
volumes:
- name: repos-volume
persistentVolumeClaim:
claimName: repos-pvc

9.3. Database 관련

Day문제해결
9MySQL 연결 불가sudo ufw disable + Docker 재시작
9Replication 실패Master에 복제 계정 생성
9Schema Missingmysqldump로 수동 동기화
10Duplicate Key 에러Read/Write 모두 Master 사용
11MySQL 연결 TimeoutDocker 재시작
# MySQL 연결 복구
sudo systemctl restart docker

# 스키마 동기화
kubectl exec mysql-slave-0 -n gition -- bash -c \
"mysqldump -h 172.100.100.11 -uroot -p<PW> --set-gtid-purged=OFF gition | mysql -uroot -p<PW> gition"

9.4. Network 관련

Day문제해결
9ExternalName DNS 불가ClusterIP + Endpoints 사용
9OAuth redirect_uri 불일치Callback URL 포트 수정
9OAuth 콜백 후 404/auth/github/*만 백엔드로 변경
# ClusterIP + Endpoints (mysql-master-svc.yaml)
apiVersion: v1
kind: Service
metadata:
name: mysql-master
spec:
ports:
- port: 3306
---
apiVersion: v1
kind: Endpoints
metadata:
name: mysql-master
subsets:
- addresses:
- ip: 172.100.100.11
ports:
- port: 3306

9.5. 참고 문서

Day주제주요 트러블슈팅
Day 23-Tier 배포PVC Pending, Readiness Probe
Day 3외부 Registry 연동2단계 포트포워딩, insecure-registries
Day 9K8s Ingress 구조 개선OAuth 라우팅, NFS PVC, MySQL Replication
Day 10Read/Write Split복제 지연, Duplicate Key
Day 11빌드 DNS 오류Docker daemon.json DNS 설정

관련 문서

그래프 뷰

그래프 데이터 로딩 중…
현재: 프로젝트 계획서
노드 클릭 → 이동 · 드래그 → 위치 조정