[DB 선택 대화형 프롬프트] - setup/lib/db_select.sh: 설치 시 SQLite/PostgreSQL/PostgreSQL+pgvector 선택 - DB_TYPE 환경변수로 무인 설치 지원 - pgvector 자동 빌드/설치 (소스 빌드 폴백 포함) - .env DATABASE_URL 자동 기록 [Vector DB] - docker-compose.yml: postgres를 pgvector/pgvector:pg15 이미지로 교체 - Qdrant: docker profile=vector 로 선택적 활성화 - docs/vector_db_guide.md: pgvector/Qdrant 사용법 + 시나리오 [Gitea 온프레미스 Git 서버] - docker-compose.yml: gitea/gitea:1.21-rootless 서비스 추가 - setup/lib/gitea_setup.sh: 공통 설치/초기화 함수 - setup/gitea_init.sh: 독립 실행형 초기화 스크립트 - 관리자 계정 생성 - guardia 조직 + GUARDiA 저장소 생성 - main 브랜치 보호 (PR + 리뷰 1명 필수) - develop 브랜치 생성 - 개발자 계정 (engineer1/2, pm1, admin) + feature/이름/init 브랜치 자동 생성 - 현재 소스 자동 push [브랜치 전략] main : 보호 브랜치, PR 필수, 리뷰 1명 필수 develop : 통합 브랜치, force-push 금지 feature/이름/기능: 개인 개발 브랜치 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
226 lines
9.3 KiB
Bash
226 lines
9.3 KiB
Bash
#!/bin/bash
|
|
# ==============================================================
|
|
# GUARDiA Gitea 초기화 스크립트
|
|
# ==============================================================
|
|
# Gitea 컨테이너/서비스가 기동된 후 실행하여
|
|
# 관리자 계정, 조직, 저장소, 브랜치 보호를 자동 설정합니다.
|
|
#
|
|
# 사용법:
|
|
# bash setup/gitea_init.sh
|
|
# GITEA_PORT=3000 GITEA_ADMIN=admin bash setup/gitea_init.sh
|
|
# ==============================================================
|
|
|
|
set -euo pipefail
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
GUARDIA_ROOT="$(dirname "$SCRIPT_DIR")"
|
|
|
|
GITEA_PORT="${GITEA_PORT:-3000}"
|
|
GITEA_BASE="http://localhost:${GITEA_PORT}"
|
|
GITEA_ADMIN="${GITEA_ADMIN:-gitadmin}"
|
|
GITEA_ADMIN_PW="${GITEA_ADMIN_PW:-Gitea@guardia!}"
|
|
GITEA_ADMIN_EMAIL="${GITEA_ADMIN_EMAIL:-admin@guardia.local}"
|
|
GITEA_ORG="${GITEA_ORG:-guardia}"
|
|
GITEA_REPO="${GITEA_REPO:-GUARDiA}"
|
|
|
|
GREEN='\033[0;32m'; YELLOW='\033[1;33m'; NC='\033[0m'
|
|
ok() { echo -e "${GREEN}[OK]${NC} $*"; }
|
|
warn() { echo -e "${YELLOW}[WARN]${NC} $*"; }
|
|
info() { echo -e " $*"; }
|
|
|
|
API="${GITEA_BASE}/api/v1"
|
|
AUTH="Authorization: Basic $(echo -n "${GITEA_ADMIN}:${GITEA_ADMIN_PW}" | base64)"
|
|
|
|
echo "=================================================="
|
|
echo " Gitea 초기화"
|
|
echo " URL: $GITEA_BASE"
|
|
echo "=================================================="
|
|
|
|
# ── Gitea 응답 대기 ───────────────────────────────────────────
|
|
echo ""
|
|
echo "[1/7] Gitea 서비스 응답 대기..."
|
|
for i in $(seq 1 30); do
|
|
if curl -sf "$API/version" -o /dev/null 2>/dev/null; then
|
|
ok "Gitea 응답 확인"
|
|
break
|
|
fi
|
|
sleep 2
|
|
[[ $i -eq 30 ]] && { echo "[ERR] Gitea 응답 없음 — 서비스를 먼저 시작하세요"; exit 1; }
|
|
done
|
|
|
|
# ── 관리자 계정 생성 (Gitea API 인증용) ─────────────────────────
|
|
echo ""
|
|
echo "[2/7] 관리자 계정 설정..."
|
|
|
|
# Docker 환경: gitea admin 명령 사용
|
|
if command -v docker &>/dev/null && docker ps | grep -q guardia-gitea; then
|
|
docker exec guardia-gitea gitea admin user create \
|
|
--username "$GITEA_ADMIN" \
|
|
--password "$GITEA_ADMIN_PW" \
|
|
--email "$GITEA_ADMIN_EMAIL" \
|
|
--admin 2>/dev/null || info "관리자 이미 존재"
|
|
elif command -v gitea &>/dev/null; then
|
|
gitea admin user create \
|
|
--username "$GITEA_ADMIN" \
|
|
--password "$GITEA_ADMIN_PW" \
|
|
--email "$GITEA_ADMIN_EMAIL" \
|
|
--admin 2>/dev/null || info "관리자 이미 존재"
|
|
else
|
|
# API로 관리자 생성 시도 (초기 설치 시)
|
|
curl -sf -X POST "$API/users" \
|
|
-H "Content-Type: application/json" \
|
|
-d "{\"username\":\"${GITEA_ADMIN}\",\"password\":\"${GITEA_ADMIN_PW}\",\"email\":\"${GITEA_ADMIN_EMAIL}\"}" \
|
|
-o /dev/null 2>/dev/null || info "관리자 이미 존재"
|
|
fi
|
|
ok "관리자: $GITEA_ADMIN"
|
|
|
|
# ── 조직 생성 ────────────────────────────────────────────────
|
|
echo ""
|
|
echo "[3/7] 조직 생성..."
|
|
curl -sf -X POST "$API/orgs" \
|
|
-H "$AUTH" -H "Content-Type: application/json" \
|
|
-d "{\"username\":\"${GITEA_ORG}\",\"visibility\":\"private\",\"description\":\"GUARDiA ITSM Organization\"}" \
|
|
-o /dev/null 2>/dev/null && ok "조직 생성: $GITEA_ORG" || info "조직 이미 존재: $GITEA_ORG"
|
|
|
|
# ── GUARDiA 저장소 생성 ──────────────────────────────────────
|
|
echo ""
|
|
echo "[4/7] 저장소 생성..."
|
|
curl -sf -X POST "$API/orgs/${GITEA_ORG}/repos" \
|
|
-H "$AUTH" -H "Content-Type: application/json" \
|
|
-d "{
|
|
\"name\":\"${GITEA_REPO}\",
|
|
\"description\":\"GUARDiA ITSM Platform\",
|
|
\"private\":true,
|
|
\"default_branch\":\"main\",
|
|
\"auto_init\":true,
|
|
\"readme\":\"Default\"
|
|
}" \
|
|
-o /dev/null 2>/dev/null && ok "저장소 생성: ${GITEA_ORG}/${GITEA_REPO}" \
|
|
|| info "저장소 이미 존재"
|
|
|
|
sleep 3 # 저장소 초기화 대기
|
|
|
|
# ── develop 브랜치 생성 ─────────────────────────────────────
|
|
echo ""
|
|
echo "[5/7] develop 브랜치 생성..."
|
|
curl -sf -X POST "$API/repos/${GITEA_ORG}/${GITEA_REPO}/branches" \
|
|
-H "$AUTH" -H "Content-Type: application/json" \
|
|
-d '{"new_branch_name":"develop","old_branch_name":"main"}' \
|
|
-o /dev/null 2>/dev/null && ok "develop 브랜치 생성" || info "develop 브랜치 이미 존재"
|
|
|
|
# ── main 브랜치 보호 설정 ────────────────────────────────────
|
|
echo ""
|
|
echo "[6/7] main 브랜치 보호 설정..."
|
|
curl -sf -X POST "$API/repos/${GITEA_ORG}/${GITEA_REPO}/branch_protections" \
|
|
-H "$AUTH" -H "Content-Type: application/json" \
|
|
-d "{
|
|
\"branch_name\": \"main\",
|
|
\"enable_push\": false,
|
|
\"enable_push_whitelist\": true,
|
|
\"push_whitelist_usernames\": [\"${GITEA_ADMIN}\"],
|
|
\"required_approvals\": 1,
|
|
\"enable_approvals_whitelist\": false,
|
|
\"block_on_rejected_reviews\": true,
|
|
\"block_on_official_review_requests\": false,
|
|
\"dismiss_stale_approvals\": true
|
|
}" \
|
|
-o /dev/null 2>/dev/null \
|
|
&& ok "main 브랜치 보호: PR 필수, 리뷰 1명 필수" \
|
|
|| info "브랜치 보호 이미 설정됨"
|
|
|
|
# develop 브랜치 보호 (push 허용, but 직접 force-push 금지)
|
|
curl -sf -X POST "$API/repos/${GITEA_ORG}/${GITEA_REPO}/branch_protections" \
|
|
-H "$AUTH" -H "Content-Type: application/json" \
|
|
-d '{"branch_name":"develop","enable_force_push":false}' \
|
|
-o /dev/null 2>/dev/null || true
|
|
|
|
# ── 개발자 계정 + 개인 브랜치 생성 ──────────────────────────
|
|
echo ""
|
|
echo "[7/7] 개발자 계정 + 개인 브랜치 생성..."
|
|
|
|
# GUARDiA ITSM 역할에 맞는 기본 개발자 계정
|
|
declare -A USERS=(
|
|
["engineer1"]="Eng1@guardia!:engineer1@guardia.local"
|
|
["engineer2"]="Eng2@guardia!:engineer2@guardia.local"
|
|
["pm1"]="PM1@guardia!:pm1@guardia.local"
|
|
["admin"]="Admin@guardia!:admin@guardia.local"
|
|
)
|
|
|
|
# Developers 팀 생성
|
|
TEAM_RESP=$(curl -sf -X POST "$API/orgs/${GITEA_ORG}/teams" \
|
|
-H "$AUTH" -H "Content-Type: application/json" \
|
|
-d "{
|
|
\"name\":\"Developers\",
|
|
\"permission\":\"write\",
|
|
\"units\":[\"repo.code\",\"repo.issues\",\"repo.pulls\"],
|
|
\"includes_all_repositories\":true
|
|
}" 2>/dev/null)
|
|
TEAM_ID=$(echo "$TEAM_RESP" | python3 -c "import sys,json; print(json.load(sys.stdin).get('id',''))" 2>/dev/null || echo "")
|
|
[[ -n "$TEAM_ID" ]] && ok "Developers 팀 생성 (ID: $TEAM_ID)"
|
|
|
|
# 팀에 저장소 추가
|
|
[[ -n "$TEAM_ID" ]] && curl -sf -X PUT "$API/teams/${TEAM_ID}/repos/${GITEA_ORG}/${GITEA_REPO}" \
|
|
-H "$AUTH" -o /dev/null 2>/dev/null
|
|
|
|
for username in "${!USERS[@]}"; do
|
|
IFS=':' read -r pw email <<< "${USERS[$username]}"
|
|
|
|
# 사용자 생성
|
|
curl -sf -X POST "$API/admin/users" \
|
|
-H "$AUTH" -H "Content-Type: application/json" \
|
|
-d "{
|
|
\"username\":\"${username}\",
|
|
\"password\":\"${pw}\",
|
|
\"email\":\"${email}\",
|
|
\"login_name\":\"${username}\",
|
|
\"source_id\":0,
|
|
\"send_notify\":false,
|
|
\"must_change_password\":false
|
|
}" -o /dev/null 2>/dev/null || info "사용자 이미 존재: $username"
|
|
|
|
# 팀 멤버 추가
|
|
[[ -n "$TEAM_ID" ]] && curl -sf -X PUT "$API/teams/${TEAM_ID}/members/${username}" \
|
|
-H "$AUTH" -o /dev/null 2>/dev/null
|
|
|
|
# 개인 feature 브랜치 생성 (feature/이름/init)
|
|
curl -sf -X POST "$API/repos/${GITEA_ORG}/${GITEA_REPO}/branches" \
|
|
-H "$AUTH" -H "Content-Type: application/json" \
|
|
-d "{\"new_branch_name\":\"feature/${username}/init\",\"old_branch_name\":\"develop\"}" \
|
|
-o /dev/null 2>/dev/null
|
|
|
|
ok "계정 + 브랜치: $username (feature/${username}/init)"
|
|
done
|
|
|
|
# ── 현재 소스 push ───────────────────────────────────────────
|
|
echo ""
|
|
echo " 현재 GUARDiA 소스를 Gitea에 push..."
|
|
GITEA_URL="http://${GITEA_ADMIN}:${GITEA_ADMIN_PW}@localhost:${GITEA_PORT}/${GITEA_ORG}/${GITEA_REPO}.git"
|
|
git -C "$GUARDIA_ROOT" remote remove gitea 2>/dev/null || true
|
|
git -C "$GUARDIA_ROOT" remote add gitea "$GITEA_URL"
|
|
git -C "$GUARDIA_ROOT" push gitea main 2>/dev/null \
|
|
&& ok "main 브랜치 push 완료" || warn "main push 실패 — 수동: git push gitea main"
|
|
git -C "$GUARDIA_ROOT" push gitea develop 2>/dev/null || true
|
|
|
|
echo ""
|
|
echo "=================================================="
|
|
ok "Gitea 초기화 완료!"
|
|
echo ""
|
|
info "Gitea URL: http://localhost:${GITEA_PORT}"
|
|
info "관리자: ${GITEA_ADMIN} / ${GITEA_ADMIN_PW}"
|
|
info "저장소: http://localhost:${GITEA_PORT}/${GITEA_ORG}/${GITEA_REPO}"
|
|
echo ""
|
|
info "=== 브랜치 전략 ==="
|
|
info " main : PR + 리뷰 1명 필수 (보호)"
|
|
info " develop : 통합 브랜치 (force-push 금지)"
|
|
info " feature/이름/기능명: 개인 개발 브랜치"
|
|
echo ""
|
|
info "=== 개발자 계정 ==="
|
|
for username in "${!USERS[@]}"; do
|
|
IFS=':' read -r pw _ <<< "${USERS[$username]}"
|
|
info " $username / $pw → feature/${username}/init"
|
|
done
|
|
echo ""
|
|
info "=== Git 원격 저장소 설정 ==="
|
|
info " git remote add guardia-gitea http://localhost:${GITEA_PORT}/${GITEA_ORG}/${GITEA_REPO}.git"
|
|
info " git push guardia-gitea feature/이름/기능명"
|
|
echo "=================================================="
|