Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 11 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -344,8 +344,17 @@ DocGrid의 자체 소스코드와 문서는 [Apache License 2.0](LICENSE)에 따
|---|---|---|
| [BAAI/bge-m3](https://huggingface.co/BAAI/bge-m3) | Embedding Server 첫 실행 시 다운로드 | MIT License |
| [qwen2.5:7b](https://ollama.com/library/qwen2.5:7b) | 사용자가 `ollama pull`로 다운로드 | Apache License 2.0 |
| [Ollama](https://github.com/ollama/ollama) | 사용자가 Native로 설치해 `qwen2.5:7b`를 실행 | MIT License |
| OpenSQL | 외부 개발·검증 DB로 연결 | 공급사 배포본과 License는 저장소에 포함하지 않음 |
| Java·npm 의존성과 Container Image | Build 또는 실행 시 외부 Registry에서 획득 | 각 구성요소의 별도 라이선스 적용 |
| Python 의존성 (임베딩 서버) | `backend/embedding-server/requirements.txt`로 설치 | fastapi MIT, uvicorn BSD, FlagEmbedding MIT, torch BSD, transformers·peft Apache-2.0, numpy BSD, prometheus-client Apache-2.0 AND BSD-2-Clause. Linux x86_64에서는 CPU 전용 torch를 설치해 NVIDIA `nvidia-*` 패키지를 설치하지 않음 |
| Java 의존성 | Gradle로 획득 (`backend/build.gradle`) | Apache-2.0·MIT·BSD 위주. Hibernate ORM 6.6은 LGPL-2.1 이상, Logback은 EPL-2.0과 LGPL-2.1 듀얼, Jakarta·AspectJ는 EPL-2.0, 테스트용 H2는 MPL-2.0·EPL-1.0, JUnit은 EPL-2.0 |
| npm 의존성 | npm으로 획득 (`frontend/package-lock.json`) | 실행 의존성 4개는 react·react-dom·scheduler MIT, drizzle-orm Apache-2.0. 나머지는 빌드·개발 도구이며 MIT·Apache-2.0·ISC·BSD 위주이고 MPL-2.0, LGPL-3.0(sharp libvips) 등을 포함 |
| Valkey 9.1 (Container Image) | 로컬 Compose 캐시 서버. Spring Data Redis(Apache-2.0)·Lettuce(MIT) 클라이언트로 접속 | BSD-3-Clause |
| pgvector/pgvector 0.8.1 (Container Image) | 로컬 Compose PostgreSQL 17 | pgvector는 PostgreSQL License. 이미지는 PostgreSQL과 OS 패키지를 포함 |
| Prometheus v3.5.5, Alertmanager v0.33.1 (Container Image) | 선택형 `monitoring` profile | Apache-2.0 |
| Grafana 13.2.3 (Container Image) | 선택형 `monitoring` profile. 수정하지 않고 별도 컨테이너로 실행 | AGPL-3.0 (OSI 승인) |
| MinIO (Container Image) | 로컬 Compose의 `minio` 서비스. 팀은 현재 사용하지 않음(파일 저장소는 GCS). 공식 `minio/minio` 이미지는 2026-10-09 기준 새로 받을 수 없음(`docker pull` 거부 확인) | AGPL-3.0 |

외부 모델, 라이브러리, Container Image와 OpenSQL 배포본은 DocGrid의 Apache License 2.0 적용 범위에
포함되지 않습니다.
포함되지 않습니다. 위 표의 라이선스는 2026-10-09 기준 각 패키지의 메타데이터(POM·PyPI·npm
lockfile)와 업스트림 라이선스 원문을 확인한 결과이며, 제출·배포 시점에 다시 확인합니다.
83 changes: 83 additions & 0 deletions docs/design/kangcheolung-#454-readme-license-table.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
# #454 README 외부 구성요소 라이선스 표 보강

closes #454

#450, #452(임베딩 서버 torch)와 이어지는 2차 평가 오픈소스 라이선스 대응이다.

---

## 배경

- 평가 기준은 OSI 승인 라이선스이고(#399), 팀 점검에서는 대회 규정이 사용한 라이브러리·모델의 출처와 라이선스 명시도 요구한다고 정리했다. 규정 원문은 레포에서 확인하지 못했으므로 원문 대조가 필요하다.
- README의 라이선스 표에는 모델 2개와 OpenSQL, "Java·npm 의존성과 Container Image는 별도 라이선스 적용"이라는 포괄 항목만 있었다. 실제 사용하는 Python 패키지와 컨테이너 이미지의 라이선스는 없었다.

---

## 결정

**코드와 설정은 바꾸지 않고, README의 라이선스 표만 보강한다.**

MinIO는 건드리지 않는다. 팀이 사용하지 않고 배포 컨테이너에도 없으며(파일 저장소는 GCS), `docker-compose.yml`·`.env.example`·README 빠른 실행을 바꾸면 팀원의 로컬 개발 흐름에 영향이 있어 팀과 먼저 상의가 필요하다. 대신 확인한 사실을 라이선스 표에 정직하게 기록한다.

### MinIO 관련 확인 사실 (2026-10-09)

공식 `minio/minio` 이미지를 새로 받을 수 없다.

| 시도 | 결과 |
|---|---|
| `docker pull minio/minio:latest` | `pull access denied for minio/minio, repository does not exist or may require 'docker login'` |
| `docker pull --platform linux/amd64 minio/minio:RELEASE.2025-09-07T16-13-09Z` | 같은 오류 |
| Docker Hub 레지스트리 API(익명 토큰) 태그·매니페스트 조회 | 401 `UNAUTHORIZED` |
| `quay.io/minio/minio` 태그 조회 | 401 `Requires authentication` |

- 이미지를 미리 받아 둔 환경(개발 PC)에서만 동작해 드러나지 않았다. 이미지를 갖고 있지 않은 환경에서 `docker compose up`이 MinIO를 받지 못할 가능성이 크다.
- 저장소가 없어졌는지 비공개로 바뀌었는지는 구분하지 못했고, Docker 로그인 상태에서의 결과는 확인하지 못했다.
- 따라서 `latest` 태그를 릴리스 태그로 고정하는 방법은 쓸 수 없다.
- MinIO 서버 이미지는 AGPL-3.0이다. (로컬 컨테이너의 `minio --version` 출력과 저장소 `LICENSE`로 확인)
- MinIO 어댑터는 `STORAGE_TYPE=minio`일 때만 활성화되고(`@ConditionalOnProperty`), 앱 기본값이 이미 `local`이므로 MinIO 없이 실행하는 경로가 코드에 있다. 이 사실을 바탕으로 한 기본 경로 분리(compose profile, `.env.example`, README 빠른 실행 변경)는 팀 협의 후 별도 이슈로 진행한다.

---

## 변경 범위

| 파일 | 변경 |
|---|---|
| `README.md` | `## 라이선스 및 외부 구성요소` 표에 Ollama, Python·Java·npm 의존성, 컨테이너 이미지 항목 추가, 기준일 명시 |

### 추가한 항목과 확인 근거

| 항목 | 라이선스 | 확인 근거 |
|---|---|---|
| Python 의존성 (fastapi, uvicorn, FlagEmbedding, torch, transformers, peft, numpy, prometheus-client) | MIT, BSD, MIT, BSD, Apache-2.0, Apache-2.0, BSD, Apache-2.0 AND BSD-2-Clause | 핀 버전의 PyPI 메타데이터. FlagEmbedding 1.2.11은 PyPI 라이선스 칸이 비어 있어 소스 배포 파일(SHA-256 대조)의 `LICENSE`로 MIT 확인 |
| Java 의존성 | Apache-2.0·MIT·BSD 위주, Hibernate ORM 6.6 LGPL-2.1+, Logback EPL-2.0·LGPL-2.1 듀얼, Jakarta·AspectJ EPL-2.0, H2 MPL-2.0·EPL-1.0(테스트), JUnit EPL-2.0(테스트) | Gradle `runtimeClasspath`·`testRuntimeClasspath`의 POM·상위 POM |
| npm 의존성 | 실행 의존성 4개 MIT·Apache-2.0, 나머지 빌드·개발 도구 | `frontend/package-lock.json` 650개 |
| Valkey | BSD-3-Clause | `valkey-io/valkey` `COPYING` |
| pgvector | PostgreSQL License | `pgvector/pgvector` v0.8.1 `LICENSE` |
| Prometheus v3.5.5, Alertmanager v0.33.1 | Apache-2.0 | 각 태그의 `LICENSE` |
| Grafana 13.2.3 | AGPL-3.0 (기본 라이선스) | v13.2.3 `LICENSING.md` |
| Ollama | MIT | `ollama/ollama` `LICENSE` |
| MinIO | AGPL-3.0 | 위 확인 사실 |

---

## 검증

| 항목 | 결과 |
|---|---|
| 표의 각 라이선스 | 위 "확인 근거"의 업스트림 원문 또는 패키지 메타데이터와 일치 |
| 변경 파일 | `README.md` 하나. 코드·설정 변경 없음 |

### 검증하지 못한 범위

- 라이선스는 메타데이터와 업스트림 원문 기준이며 법률 자문이 아니다. 제출 시점에 다시 확인한다.
- Java 의존성 라이선스는 POM 표기 기준이다. JAR 내부의 고지 파일과 개별 배포 조건은 전수 확인하지 않았다.
- npm 개발 도구 중 CC0·CC-BY 패키지가 최종 배포 번들에 들어가는지는 로컬 빌드 산출물(`dist`, `.next`) 검색으로만 확인했고, 검색에서는 발견되지 않았다.

---

## 이 이슈의 범위 밖

- 전이 의존성을 포함한 라이브러리별 **전체 구성요소 목록**: 규정 제8조의 요구 범위를 원문으로 확인한 뒤 필요하면 진행
- MinIO 기본 경로 분리(compose profile, `.env.example`, README 빠른 실행)와 MinIO 기반 E2E(`storageWorkerE2eTest`, `local-e2e`)의 대체 방안: 팀 협의 후 별도 이슈
- Grafana(AGPL-3.0)의 의무 범위는 OpenUP 멘토링(~10/26)에서 확인
- `docs/images/architecture.png`의 Redis 로고, GCP 운영 Redis 현재 버전 확인
Loading