설치
이 문서가 답하는 질문
- 이 확장을 설치하려면 정확히 무엇이 필요한가?
- 어떤 PostgreSQL 버전을 지원한다고 선언되어 있고, 어떤 버전이 실제로 검증되었는가?
- pgvector는 왜 필수인가?
CASCADE를 빼면 어떻게 되는가?- Docker 없이 로컬에 설치하려면?
사실 (Facts)
확장 메타데이터
engine/ontological.control 전문 (7줄, engine/ontological.control:1-7):
comment = 'Ontological — Cypher-native ontology graph database for the AI agent era'
default_version = '0.1.0'
module_pathname = '$libdir/ontological'
relocatable = false
superuser = false
trusted = false
requires = 'vector'
여기서 운영에 직결되는 항목:
| 키 | 값 | 운영상 의미 |
|---|---|---|
default_version |
0.1.0 |
CREATE EXTENSION ontological은 항상 0.1.0을 만든다. 업그레이드 스크립트가 없으므로 다른 버전은 존재하지 않는다 |
relocatable |
false |
ALTER EXTENSION ontological SET SCHEMA … 불가. 스키마는 og_catalog / og_data로 고정 (engine/sql/bootstrap.sql:13-14) |
superuser |
false |
확장 스크립트가 호출자 권한으로 실행된다. 즉 스키마 생성 권한이 있는 역할이면 슈퍼유저가 아니어도 설치를 시도할 수 있다. 다만 이 저장소의 어떤 스크립트도 비슈퍼유저 설치를 실행하지 않으므로 비슈퍼유저 설치 경로는 미검증 |
trusted |
false |
superuser = false이므로 trusted는 효과가 없다 |
requires |
vector |
pgvector가 먼저 설치되어 있어야 한다 |
pgvector 의존성
requires = 'vector' 때문에 pgvector 확장이 없으면 설치가 실패한다. 저장소의 모든 설치 명령이 예외 없이 CASCADE를 붙이는 이유가 이것이다:
start.sh:50—CREATE EXTENSION ontological CASCADEREADME.md:178—CREATE EXTENSION ontological CASCADEtests/run.sh:19—CREATE EXTENSION ontological CASCADEtests/typeql/run.py:110부근 —CREATE EXTENSION ontological CASCADE
pgvector가 실제로 쓰이는 곳은 벡터 검색 경로다 — og_add_embedding이 vector(N) 컬럼과 HNSW 인덱스를 만든다 (engine/src/vector/mod.rs:33, 오류 문자열 "failed to build HNSW index: {e}").
지원 PostgreSQL 버전 — 선언과 검증의 구분
engine/Cargo.toml:9-19가 선언하는 feature:
[features]
default = ["pg16"]
pg13 = ["pgrx/pg13", "pgrx-tests/pg13" ]
pg14 = ["pgrx/pg14", "pgrx-tests/pg14" ]
pg15 = ["pgrx/pg15", "pgrx-tests/pg15" ]
pg16 = ["pgrx/pg16", "pgrx-tests/pg16" ]
pg17 = ["pgrx/pg17", "pgrx-tests/pg17" ]
pg18 = ["pgrx/pg18", "pgrx-tests/pg18" ]
pg19 = ["pgrx/pg19", "pgrx-tests/pg19" ]
| 상태 | 근거 | |
|---|---|---|
| 선언된 버전 | PostgreSQL 13 ~ 19 | engine/Cargo.toml:11-17 |
| 기본 빌드 대상 | PostgreSQL 16 | engine/Cargo.toml:10 |
| 개발 이미지가 초기화하는 버전 | PostgreSQL 16 뿐 | docker/Dockerfile.dev:23 — cargo pgrx init --pg16 … |
start.sh가 기동하는 버전 |
PostgreSQL 16 뿐 | start.sh:37 — cargo pgrx start pg16 |
| 벤치마크가 실행된 버전 | PostgreSQL 16.14 (Debian) | bench/results/bench-50000-20260817T033001Z.json 의 environment.postgres |
| CI에서 교차 검증되는 버전 | 없음 | .github/ 디렉터리가 존재하지 않음 |
결정(Decision): 이 문서는 PostgreSQL 16만 검증된 대상으로 취급한다. pg13·pg14·pg15·pg17·pg18·pg19는 "빌드 feature가 존재한다"는 사실만 참이며, 그 위에서 회귀 스위트가 통과한다는 근거는 저장소에 없다. → 10_improvements_ops.md
OPS-03
확장이 만드는 것
CREATE EXTENSION ontological은 두 개의 SQL 파일을 순서대로 실행한다 (engine/src/lib.rs:23-24):
extension_sql_file!("../sql/bootstrap.sql", name = "bootstrap", bootstrap);
extension_sql_file!("../sql/access.sql", name = "access", finalize);
결과물:
- 스키마 2개 —
og_catalog,og_data(engine/sql/bootstrap.sql:13-14) - 카탈로그·저장 테이블 (
og_catalog.graph,og_catalog.type,og_data.og_node,og_data.og_edge,og_data.og_adj, …) - 인라인 가능한
LANGUAGE sql접근 함수와 뷰 (engine/sql/access.sql) - Rust
#[pg_extern]함수 전체
타입별 저장 테이블(og_data.n_<type_id>, og_data.e_<type_id>)은 확장 스크립트가 아니라 런타임에 og_create_type 등이 만든다 (engine/src/catalog/types.rs:69,73). 이 구분은 백업에서 중요하다 — 08_backup_and_restore.md 참조.
경로 A — Docker (저장소가 실제로 쓰는 경로)
A-1. 이미지 빌드
docker/Dockerfile.dev 전체가 하는 일 (docker/Dockerfile.dev:1-25):
FROM pgvector/pgvector:pg16— PostgreSQL 16 + pgvector가 이미 들어 있는 베이스- 빌드 도구 설치:
build-essential postgresql-server-dev-16 curl ca-certificates git pkg-config libssl-dev libclang-dev clang libreadline-dev zlib1g-dev flex bison jq procps sudo - 비루트 사용자
dev생성 — 주석 그대로 "pgrx refuses to run postgres as root".dev에게 NOPASSWD sudo를 주고,/usr/share/postgresql/16/extension과/usr/lib/postgresql/16/lib의 소유권을 넘긴다 (확장 설치 대상 디렉터리) - rustup stable(minimal 프로파일) 설치
cargo install cargo-pgrx --locked— 버전 미지정cargo pgrx init --pg16 /usr/lib/postgresql/16/bin/pg_configWORKDIR /work
docker build -f docker/Dockerfile.dev -t ontological-dev .
start.sh:28은 이미지 태그를ontological-dev:latest로 참조한다. 위 명령의-t ontological-dev는:latest와 동일하므로 그대로 맞는다.
주의: 5단계의
cargo install cargo-pgrx --locked에는 버전 핀이 없는데,engine/Cargo.toml:22는pgrx = "=0.19.2"로 정확히 고정되어 있다. cargo-pgrx가 0.19.2보다 앞서 나가면 이미지 재빌드 시점에 따라 빌드가 깨진다. →OPS-04
A-2. 컨테이너 기동 + 확장 설치 (README 경로)
README.md:169-180 에 있는, 저장소가 문서화한 유일한 완전 설치 절차:
docker build -f docker/Dockerfile.dev -t ontological-dev .
docker run -d --name og -v "$PWD":/work -p 28816:28816 -w /work ontological-dev sleep infinity
docker exec og bash -lc 'cd /work/engine && \
cargo pgrx install --features pg16 --no-default-features \
--pg-config /usr/lib/postgresql/16/bin/pg_config --sudo && \
cargo pgrx start pg16 && \
createdb -h localhost -p 28816 og && \
psql -h localhost -p 28816 -d og -c "CREATE EXTENSION ontological CASCADE" && \
psql -h localhost -p 28816 -d og -f /work/examples/demo.sql'
각 인자의 의미:
| 인자 | 의미 |
|---|---|
cargo pgrx install |
cdylib를 빌드해 $libdir와 확장 디렉터리에 설치한다 |
--features pg16 --no-default-features |
기본 feature와 중복 활성화를 피한다 |
--pg-config /usr/lib/postgresql/16/bin/pg_config |
이미지의 apt 설치본 PostgreSQL을 대상으로 지정 |
--sudo |
확장 디렉터리 쓰기에 sudo 사용. Dockerfile이 dev에게 NOPASSWD sudo를 준 이유 (docker/Dockerfile.dev:13) |
cargo pgrx start pg16 |
pgrx가 관리하는 PostgreSQL 16 인스턴스를 기동. 포트 28816 |
포트 28816은 pgrx의 pg16 기본 포트다. 저장소 전체가 이 값을 기본으로 쓴다 —
start.sh:8,tests/run.sh:7,bench/harness.py:47,portal/server/index.js:23,tests/typeql/run.py:26.
A-3. start.sh는 설치를 하지 않는다 — 반드시 알아야 할 점
start.sh에는 cargo pgrx install이 없다. 전체 90줄 중 빌드 단계는 Bolt 게이트웨이의 cargo build --release 하나뿐이다 (start.sh:60).
start.sh:45-52는 데이터베이스가 없을 때만 아래를 실행하는데, 표준 출력·오류를 모두 버린다:
docker exec "$CONTAINER" bash -lc "
createdb -h localhost -p $PGPORT $DB
psql -h localhost -p $PGPORT -d $DB -q -c 'CREATE EXTENSION ontological CASCADE'
psql -h localhost -p $PGPORT -d $DB -q -f /work/examples/demo.sql" >/dev/null 2>&1
즉 확장이 설치되지 않은 컨테이너에서 start.sh를 처음 실행하면 createdb는 성공하고 CREATE EXTENSION은 조용히 실패한다. 데이터베이스는 생겼으므로 다음 실행부터는 start.sh:45의 조건이 거짓이 되어 이 블록 자체를 건너뛴다 — 결과적으로 빈 데이터베이스에 계속 붙게 된다.
필수 규칙:
start.sh를 실행하기 전에 반드시 A-2의cargo pgrx install을 최소 한 번 수행할 것. →OPS-01
설치 여부는 이렇게 확인한다:
docker exec ontological-dev bash -lc \
"psql -h localhost -p 28816 -d postgres -tAc \
\"SELECT name, default_version FROM pg_available_extensions WHERE name IN ('ontological','vector')\""
기대 출력:
ontological|0.1.0
vector|<pgvector 버전>
경로 B — 로컬 빌드 (Docker 없이)
저장소에 로컬 설치 스크립트는 없다. 아래는
docker/Dockerfile.dev:1-25가 컨테이너 안에서 하는 일을 호스트에서 그대로 재현한 것이며, 저장소 안에서 실행 검증된 절차는 아니다. 검증된 경로가 필요하면 경로 A를 쓸 것.
B-1. 사전 요구
| 요구 | 근거 |
|---|---|
PostgreSQL 16 + 서버 개발 헤더 (postgresql-server-dev-16) |
docker/Dockerfile.dev:6 |
pgvector (확장 vector) |
engine/ontological.control:7 |
| Rust stable 툴체인 | docker/Dockerfile.dev:21 |
clang / libclang-dev (bindgen용), libssl-dev, pkg-config |
docker/Dockerfile.dev:7-9 |
| 비루트 사용자 (pgrx가 root로 postgres를 띄우지 않음) | docker/Dockerfile.dev:12 |
B-2. 절차
# 1. cargo-pgrx. Dockerfile은 --locked 만 쓰지만, engine/Cargo.toml 이 pgrx를
# "=0.19.2" 로 고정하므로 같은 버전을 명시하는 편이 안전하다.
cargo install cargo-pgrx --locked --version 0.19.2
# 2. pgrx 초기화 — 시스템 PostgreSQL 16 을 대상으로
cargo pgrx init --pg16 $(which pg_config)
# 3. 확장 빌드 및 설치
cd engine
cargo pgrx install --features pg16 --no-default-features \
--pg-config $(which pg_config) --sudo
# 4. pgrx 관리 인스턴스 기동 (포트 28816)
cargo pgrx start pg16
# 5. 데이터베이스 생성과 확장 설치
createdb -h localhost -p 28816 og
psql -h localhost -p 28816 -d og -c 'CREATE EXTENSION ontological CASCADE'
psql -h localhost -p 28816 -d og -f ../examples/demo.sql
--version 0.19.2는engine/Cargo.toml:22의 핀에서 도출한 값이다.docker/Dockerfile.dev:22에는 이 인자가 없다 — 그 차이가OPS-04의 내용이다.
B-3. macOS 링크 설정
engine/.cargo/config.toml은 macOS에서만 적용되는 링커 플래그를 담고 있다 (engine/.cargo/config.toml:1-3):
[target.'cfg(target_os="macos")']
# Postgres symbols won't be available until runtime
rustflags = ["-Clink-arg=-Wl,-undefined,dynamic_lookup"]
리눅스에는 추가 설정이 없다.
B-4. 빌드 프로파일
engine/Cargo.toml:39-46:
[profile.dev]
panic = "unwind"
[profile.release]
panic = "unwind"
opt-level = 3
lto = "fat"
codegen-units = 1
lto = "fat" + codegen-units = 1은 릴리스 빌드를 상당히 느리게 만든다. 반복 개발에는 cargo pgrx install의 기본(debug) 빌드를 쓰고, 성능 측정·배포에는 --release를 쓴다.
panic = "unwind"는 pgrx가 Rust 패닉을 PostgreSQL의 ereport(ERROR)로 변환하기 위해 필요하다 — engine/src/id.rs:31의 주석이 이 동작에 의존한다고 명시한다.
설치 검증
# 확장 버전
psql -h localhost -p 28816 -d og -tAc "SELECT ontological_version()"
# → 0.1.0 (engine/src/lib.rs:41-43, CARGO_PKG_VERSION 을 그대로 반환)
# 스키마와 테이블
psql -h localhost -p 28816 -d og -c "\dn og_catalog og_data"
# 그래프 목록
psql -h localhost -p 28816 -d og -c "SELECT graph_id, name, created_at FROM og_catalog.graph ORDER BY name"
# 데모 그래프가 살아 있는지 (Cypher 경로)
psql -h localhost -p 28816 -d og -tAc \
"SELECT og_cypher('default','MATCH (w:Work) RETURN count(w) AS n')"
# 구조 무결성 — 빈 결과가 정상
psql -h localhost -p 28816 -d og -c "SELECT * FROM og_check_integrity()"
금지 / 필수
금지 (Forbidden)
ALTER EXTENSION ontological UPDATE— 업그레이드 스크립트가 존재하지 않는다.engine/아래에ontological--0.1.0--*.sql형식의 파일이 하나도 없으며,engine/sql/에는bootstrap.sql과access.sql만 있다.OPS-02- pgvector 없이
CREATE EXTENSION ontological(CASCADE 생략) —requires = 'vector'위반으로 실패한다. - root로
cargo pgrx start— pgrx가 거부한다 (docker/Dockerfile.dev:12주석). - 확장 스키마 이동 (
SET SCHEMA) —relocatable = false.
필수 (Required)
start.sh실행 전에cargo pgrx install을 최소 한 번 수행할 것 (A-3).- pg16 이외의 버전을 시도할 때는 그것이 미검증 경로임을 인지할 것.
- 프로덕션 이미지가 필요하면 직접 정의할 것 — 저장소에는 dev 이미지만 있다 (
OPS-05).