본문으로 건너뛰기

GenD Git (Gitea) 개요

GenD 는 노트북·소스 코드의 형상관리를 위해 내부 Git 서버 (Gitea 1.22.x) 를 1급 인프라로 운영합니다. 외부 GitHub.com 사용은 온프레미스·데이터 격리 정책상 차단되어 있으며, 가스공사 등 폐쇄망 납품 요건에서도 동일한 요구가 적용됩니다.

본 문서는 Epic #1081 M1 Step 1+2 의 산출물을 정리합니다. Step 3 (gend-api git_service + DB + 라우터) 는 후속 별도 PR 에서 다룹니다.

도입 배경

항목보유미보유 (본 Epic 대상)
노트북 서버JupyterHub 5.4.4 + singleuser 5.4.5노트북 ↔ Git 게이트웨이
인증Keycloak 26.2 + OIDC + Groups내부 Git 의 OIDC 연동
객체 저장SeaweedFS (dev) / Ceph RGW (prod)Git LFS 백엔드 (M3)
ML 추적MLflow Tracking + Model RegistryRun ↔ commit SHA 자동 태깅 (M2)

M1 단계에서 Gitea 자체 부트스트랩 + JupyterHub IDE 옵션 확장을 완료합니다.

구성도

환경별 구성

항목Kind dev (gend-local)AKS prod (aks-genos-prod)
이미지gitea/gitea:1.22.6 (DockerHub)genosprodacr.azurecr.io/gitea/gitea:1.22.6 (ACR mirror)
Storage Classstandard (Kind hostPath)managed-csi-tagged (Azure Disk SSD)
PG 백엔드gitea-postgresql.gend.svc.cluster.local:5432 (별도 PG)postgres-cluster-rw.gend.svc.cluster.local:5432 (공용 PG, DB gitea)
Ingresshttp://gend.local/git/* (self-signed TLS, ssl-redirect off)https://gend.genon.ai/git/* (cert-manager letsencrypt-prod, ssl-redirect on, gend-tls 재사용)
SSHNodePort 30022 (로컬 git+ssh)비활성 (HTTPS push 만 표준)
Secretplaceholder example Secret 유지 (plaintext OK)example Secret patch-delete → 별도 SealedSecret 매니페스트

적용 절차

Kind 로컬

# 1. Gitea base + kind overlay 적용
kubectl --context kind-gend-local apply -k infra/gitea/overlays/kind/

# 2. Keycloak realm 재import (gitea client 등록 포함)
make keycloak-apply KCTX=kind-gend-local

# 3. (Step 3 머지 후) gend-api 측 git_service 활성
# apps/api/src/gend_api/services/git/ + routers/git.py + Alembic 마이그

AKS 운영

# 1. SealedSecret 으로 실제 OIDC client_secret + webhook secret 발급/주입
# (infra/sealed-secrets/aks-prod/gitea-{oidc,webhook}.yaml — 별도 PR)

# 2. base + aks overlay 적용
kubectl --context aks-genos-prod apply -k infra/gitea/overlays/aks/

# 3. Keycloak realm 갱신 (gitea client 포함)
make keycloak-apply KCTX=aks-genos-prod

보안 가드

  • runAsNonRoot UID 1000 — K8s runAsNonRoot 호환 (CLAUDE.md "infra 핵심 패턴").
  • ModSecurity off (enable-modsecurity: "false") — git push 의 PUT/DELETE + multipart 차단 회피 (feedback_modsecurity_ingress).
  • proxy-body-size 500m — LFS / 큰 pack 파일 대응 (mlflow ingress 와 동일).
  • NetworkPolicy — egress 는 PG + Keycloak + S3 (SeaweedFS/Ceph) + DNS 만 허용.
  • NoRoot SSH — SSH 호스트 키와 git 시스템 사용자는 컨테이너 안에서만, fsGroup 1000 으로 정렬.
  • placeholder Secret 격리 — base 의 gend-gitea-oidc-secret / gend-git-webhook-secret 은 example 라벨이 붙어 있으며, AKS overlay 가 강제로 patch-delete 합니다. 실 비밀은 SealedSecret/Vault 단일 출처 (feedback_secret_single_source).

사용자 가이드 (요약)

상세 사용자 가이드는 Step 3 (gend-api git_service + UI 통합) 머지 후 작성됩니다. 본 M1 Step 1+2 단계에서는 다음만 가능합니다.

  1. 브라우저에서 https://gend.genon.ai/git/ (또는 http://gend.local/git/) 접속
  2. "Sign in with OpenID" → Keycloak 로그인 → 자동 사용자 생성
  3. 수동 PAT 발급: Settings → Applications → Generate New Token
  4. JupyterLab / VS Code (code-server) profile 에서 git clone https://<user>:<PAT>@gend.genon.ai/git/...

Step 3 머지 후에는 단명 PAT 자동 발급 + ~/.gitconfig 자동 시드 + commit SHA 자동 MLflow 태깅이 활성됩니다.

잔여 작업 (이 문서 시점)

  • M1 Step 3apps/api/src/gend_api/services/git/, routers/git.py, Alembic 마이그레이션, pytest. PAT 발급/회수, repo CRUD, webhook 수신.
  • M2 — MLflow ↔ Git webhook 자동 태깅, 그룹(Keycloak group) 단위 repo namespace, pre-receive hook 출력 셀 검증.
  • M3 — Gitea dump 야간 백업, LFS 활성 (Ceph RGW gitea-lfs), OpenSearch 감사 인덱스, Forgejo 마이그레이션 평가.

관련 문서

참조