GitLab κ·Έλ£Ή λ° νλ‘μ νΈλ₯Ό λλμΌλ‘ κ΄λ¦¬νλ μΉ μ ν리μΌμ΄μ
# κ°λ° νκ²½ μ€ν (κΈ°λ³Έ, ν«λ¦¬λ‘λ μ§μ)
docker compose up -d
# λΈλΌμ°μ μμ μ μ
open http://localhost:3030
# νλ‘λμ
νκ²½ μ€ν
docker compose -f docker-compose.prod.yml up -d- λλ μμ±: YAML ν νλ¦ΏμΌλ‘ κ·Έλ£Ή/νλ‘μ νΈ κ³μΈ΅ ꡬ쑰 μΌκ΄ μμ±
- λλ μ μ‘: μ¬λ¬ νλ‘μ νΈ/κ·Έλ£Ήμ λ€λ₯Έ λ€μμ€νμ΄μ€λ‘ μΌκ΄ μ΄λ
- λλ μμ : 체ν¬λ°μ€λ‘ μ νν νλͺ©λ€ μΌκ΄ μμ (μ€μκ° μ§νλ₯ νμ)
- λλ μμΉ΄μ΄λΈ/볡μ: νλ‘μ νΈ μΌκ΄ μμΉ΄μ΄λΈ λ° μΈμμΉ΄μ΄λΈ
- λλ 볡μ : νλ‘μ νΈ/κ·Έλ£Ή μΌκ΄ 볡μ¬
- κ°μμ± λ³κ²½: Public/Internal/Private μΌκ΄ λ³κ²½
- CI/CD μ€μ λκΈ°ν: ν νλ¦Ώ νλ‘μ νΈ μ€μ μ λ€λ₯Έ νλ‘μ νΈμ μ μ©
- κΆν κ΄λ¦¬: λ©€λ² κΆν μΌκ΄ μ€μ λ° λ³κ²½
- μ΄μ/MR κ΄λ¦¬: μ΄μμ λ¨Έμ§ λ¦¬νμ€νΈ μΌκ΄ μμ±/μμ
- νΈλ¦¬ λ·°: GitLab ꡬ쑰λ₯Ό κ³μΈ΅μ μΌλ‘ μκ°ν
- 체ν¬λ°μ€ μ ν: λΆλͺ¨-μμ μ°λ λ€μ€ μ ν
- μ€μκ° μ§νλ₯ : WebSocketμ ν΅ν μμ μ§ν μν© νμ
- μμ νμ€ν 리: μ΅κ·Ό μμ λ΄μ μλ μ μ₯ λ° νμ
- νν°λ§: μμΉ΄μ΄λΈλ νλ‘μ νΈ λ° μμ μμ κ·Έλ£Ή μλ νν°
GitLab Bulk Manager
βββ Frontend (Port 3030)
β βββ React 18 + TypeScript
β βββ Material-UI v5
β βββ Redux Toolkit (μν κ΄λ¦¬)
β βββ Socket.IO Client (μ€μκ° ν΅μ )
β βββ Vite (λ²λ€λ¬)
β
βββ Backend (Port 4050)
β βββ Node.js + Express (ES Modules)
β βββ Session κΈ°λ° μΈμ¦
β βββ GitLab API νλ‘μ
β βββ WebSocket μλ²
β βββ Winston λ‘κ±°
β
βββ Redis (Port 6379)
βββ μΈμ
μ€ν 리μ§
# 1. μ μ₯μ ν΄λ‘
git clone <repository-url>
cd gitlab-bulk-manager
# 2. κ°λ° νκ²½ μ€ν (κΈ°λ³Έ, ν«λ¦¬λ‘λ μ§μ)
docker compose up -d
# - Backend: nodemonμΌλ‘ μλ μ¬μμ
# - Frontend: Vite dev serverλ‘ HMR μ§μ
# - μ½λ λ³κ²½ μ μλ λ°μ
# - 첫 μ€ν μ μλμΌλ‘ npm install μν
# 3. νλ‘λμ
νκ²½ μ€ν
docker compose -f docker-compose.prod.yml up -d
# - μ΅μ νλ λΉλ (Multi-stage Docker build)
# - Frontend: Nginxλ‘ μ μ νμΌ μλΉ
# - Backend: Node.js νλ‘λμ
λͺ¨λ
# - 보μ κ°ν (non-root user)
# 4. μν νμΈ
docker compose ps
docker compose logs -f # μ€μκ° λ‘κ·Έ
docker compose logs -f backend # Backend λ‘κ·Έλ§
docker compose logs -f frontend # Frontend λ‘κ·Έλ§
# 5. μ€μ§
docker compose down
# λ³Όλ₯¨ ν¬ν¨ μμ : docker compose down -v# 1. Redis μ€μΉ λ° μ€ν (νμ)
redis-server
# 2. Backend μ€ν
cd backend
npm install
npm run dev # κ°λ° λͺ¨λ (nodemon)
# λλ
npm start # νλ‘λμ
λͺ¨λ
# 3. Frontend μ€ν (μ ν°λ―Έλ)
cd frontend
npm install
npm run dev # κ°λ° μλ² (Vite HMR)
# λλ
npm run build && npm run preview # νλ‘λμ
λΉλ# μλ² μ€μ
PORT=4050 # Backend ν¬νΈ (κΈ°λ³Έ: 4050)
NODE_ENV=development # νκ²½ (development/production)
# μΈμ
μ€μ
SESSION_SECRET=your-secret-here # μΈμ
μνΈν ν€ (νμ)
# Redis μ€μ (μ νμ¬ν)
REDIS_URL=redis://localhost:6379
REDIS_PASSWORD=your_redis_password
# CORS μ€μ
FRONTEND_URL=http://localhost:3030
# Rate Limiting
RATE_LIMIT_WINDOW_MS=900000 # 15λΆ
RATE_LIMIT_MAX_REQUESTS=100 # μ΅λ μμ² μ
# λ‘κΉ
LOG_LEVEL=info # debug, info, warn, error# API μ€μ
VITE_API_URL=http://localhost:4050
# WebSocket μ€μ
VITE_WS_URL=ws://localhost:4050
VITE_ENABLE_WEBSOCKET=true # μ€μκ° μ§νλ₯ νμ±ν
# μ± μ€μ
VITE_APP_NAME=GitLab Bulk Manager
VITE_APP_VERSION=1.0.0μμΈν λ¬Έμλ docs ν΄λλ₯Ό μ°Έμ‘°νμΈμ:
# Docker Composeλ‘ κ°λ° νκ²½ μ€ν (κΈ°λ³Έκ°)
docker compose up -d
# λ³κ²½μ¬νμ΄ μλμΌλ‘ λ°μλ¨:
# - Backend: nodemonμ΄ νμΌ λ³κ²½ κ°μ§νμ¬ μλ μ¬μμ
# - Frontend: Vite HMRλ‘ μ¦μ λ°μ
# - λ³Όλ₯¨ λ§μ΄νΈλ‘ λ‘컬 μ½λμ 컨ν
μ΄λ λκΈ°ν
# λ°±κ·ΈλΌμ΄λ μ€ν λμ λ‘κ·Έ 보기
docker compose up # Ctrl+Cλ‘ μ’
λ£# 컨ν
μ΄λ λ΄λΆμμ ν
μ€νΈ μ€ν
docker compose exec backend npm test
docker compose exec frontend npm test
# λλ λ‘컬μμ μ§μ μ€ν
cd backend && npm test
cd frontend && npm test# 컨ν
μ΄λ λ΄λΆμμ μ€ν
docker compose exec backend npm run lint:fix
docker compose exec frontend npm run lint:fix
# Frontend ν¬λ§·ν
docker compose exec frontend npm run format- ν ν° λ³΄μ: GitLab Personal Access Tokenμ μλ² μΈμ μλ§ μ μ₯
- μΈμ μνΈν: Redisμ μνΈνλ μΈμ λ°μ΄ν° μ μ₯
- HTTPS μ§μ: νλ‘λμ νκ²½μμ HTTPS μ¬μ© κΆμ₯
- Rate Limiting: API μμ² μ νμΌλ‘ λ¨μ© λ°©μ§
- CORS μ€μ : νμ©λ μΆμ²λ§ API μ κ·Ό κ°λ₯
- μ λ ₯ κ²μ¦: λͺ¨λ μ¬μ©μ μ λ ₯ κ²μ¦ λ° sanitize
- API λΌμ°ν° ν΅ν©: μ€λ³΅λ bulkActions.js μ κ±°, bulk.jsλ‘ μΌμν
- μΈμ
ν€ ν΅μΌ: λͺ¨λ νμΌμμ
req.session.gitlabTokenμ¬μ© - μ€μκ° μ§νλ₯ : WebSocketμ ν΅ν λλ μμ μ§ν μν© νμ
- API κ²½λ‘ μμ :
/api/gitlab/bulk/*κ²½λ‘λ‘ ν΅μΌ - UI κ°μ : 체ν¬λ°μ€ μ ν, μμ νμ€ν 리, μλ νΌμΉ¨ κΈ°λ₯
MIT License
- Fork the repository
- Create your feature branch (
git checkout -b feature/AmazingFeature) - Commit your changes (
git commit -m 'Add some AmazingFeature') - Push to the branch (
git push origin feature/AmazingFeature) - Open a Pull Request
ν¬νΈ μΆ©λ λ¬Έμ
# ν¬νΈ μ¬μ© μ€μΈ νλ‘μΈμ€ νμΈ
lsof -i :3030 # Frontend
lsof -i :4050 # Backend
# Docker 컨ν
μ΄λ μ¬μμ
docker compose down
docker compose up -dμμ‘΄μ± μ€μΉ μ€ν¨
# Docker λ³Όλ₯¨κ³Ό node_modules μ¬μμ±
docker compose down -v
docker compose up -d --buildμΈμ μ μ§ μλ¨
SESSION_SECRETνκ²½ λ³μ μ€μ νμΈ- Redis μ°κ²° μν νμΈ
- λΈλΌμ°μ μΏ ν€ μ€μ νμΈ