WebDAV를 통한 웹사이트 배포
이 스킬은 이미 생성된 정적 HTML/CSS/JS 사이트 (RDF-Turtle + SHACL + Jinja2 파이프라인(예: sites/openlink/rdf/build.py)의 출력물)를 Virtuoso WebDAV 루트에 게시하고 매핑된 공개 경로를 설정하는 데 사용합니다. 사이트의 콘텐츠 모델(온톨로지, SHACL 셰이프, 순서)은 이 스킬의 상위 단계에서 작성되고 검증됩니다. 이 스킬의 작업은 "여기 완성된 HTML이 들어있는 generated/ 폴더가 있습니다. 이걸 라이브로 만드세요." 에서 시작합니다.
이는 weblog-from-webdav 또는 osdi-inclusion-engine보다 의도적으로 범위가 좁습니다. 해당 스킬들은 모든 요청에서 콘텐츠를 실시간으로 렌더링합니다(전용 VSP 내의 WebDAV 컬렉션 열거, 또는 WebDAV 소스 HTML을 감싸는 공유 XSLT 스킨). 이 스킬의 콘텐츠는 도착하기 전에 이미 완전히 렌더링되었습니다. 게시는 단순한 WebDAV PUT과 정적 파일 VHOST_DEFINE이며, VSP 실행이나 실시간 SPARQL 쿼리가 포함되지 않습니다. 이러한 선택의 이유와 변경 시점에 대해서는 references/webdav-website-engine-gate.md를 참조하십시오.
차단 게이트 — 로컬 파일은 유효한 완료가 아닙니다
사용자가 생성된 사이트를 게시, 배포 또는 "라이브로 만들라"고 요청할 때, 무슨 일이 일어날지에 대한 설명이나 파일이 로컬에 존재한다는 주장은 유효한 완료가 아닙니다. 단, 사용자가 명시적으로 로컬/미리보기 확인만을 요청한 경우는 예외입니다. 기본 제공물은 다음 중 하나입니다:
- 라이브로 확인된 게시 사이트: 대상 경로가 로컬
generated/출력과 동일한 콘텐츠를 반환합니다. - 완전한 배포 가능 번들:
generated/*.html, 사이트의assets/(site.css,theme.js), 경로가 대체된templates/deploy-website-route.sql, 그리고 README/실행 노트 파일 —scripts/validate_generated_website_bundle.py가 이에 대해 통과해야 합니다.
둘 중 하나를 주장하기 전에 references/webdav-website-engine-gate.md를 읽으십시오. 배포 자격 증명(WebDAV 및/또는 isql)을 사용할 수 없는 경우 배포 가능한 번들에서 중단하고 라이브 게시가 인증된 접근 권한 부족으로 차단되었다고 명확히 말하십시오. 가상의 성공을 설명하지 마십시오.
첫 번째 결정
무엇을 게시하기 전에 다음을 설정하십시오:
- 소스 파이프라인 디렉토리 (예:
{LLM_ROOT}/Claude Generated/sites/openlink/) 및rdf/build.py를 먼저 (재)실행해야 하는지, 아니면generated/가 이미 최신 상태인지 여부. - 대상 DAV 컬렉션 (예:
/DAV/home/kidehen/sites/openlink/). - 공개 경로 (예:
https://linkeddata.uriburner.com/sites/openlink/). - ID 모드: SQL 사용자명/비밀번호,
isqlWebID-TLS, WebID-TLS + 위임, WebDAV 사용자명/비밀번호, WebDAV mTLS, 또는 WebDAV mTLS +On-Behalf-Of. - 이것이 첫 번째 경로 부트스트랩(
isql+deploy-website-route.sql필요)인지, 아니면 기존 경로에 대한 콘텐츠만 재게시하는 것(경로 구성은 건드리지 않고 WebDAV 게시만,references/webdav-publish-mode.md의 범위 외 경계 참조)인지 여부.
워크플로우
- 소스
generated/출력이 최신인지 확인합니다. (재)빌드를 요청받은 경우 파이프라인 자체의rdf/validate_shacl.py를 실행한 다음rdf/build.py를 변경 없이 실행하십시오. 이 스킬은 해당 검증을 재구현하거나 우회하지 않습니다.references/rdf-content-mode.md를 참조하십시오. - 어떤 항목을 작성하기 전에, 이전 메모리/작업에서
validate_generated_weblog_bundle,VHOST_DEFINE,DAV_RES_UPLOAD_STRSES_INT,website-from-webdav를 검색하십시오. 입증된 수정 사항을 재사용하고 다시 발견하지 마십시오. - 대상 경로가 이미 존재하는지 확인합니다(
isql을 통해 대상 경로에 대해DB.DBA.HTTP_PATH및WS.WS.SYS_DAV_RES를 쿼리). 존재하지 않으면 부트스트랩합니다:templates/deploy-website-route.sql을 실제 DAV 경로/경로/제목으로 패치한 다음isql로 실행합니다.references/isql-route-mode.md를 참조하십시오. - 게시하기 전에
scripts/validate_generated_website_bundle.py로 번들을 검증합니다. 이는 차단 단계입니다. scripts/publish_static_bundle.py를 사용하여 WebDAV를 통해 게시합니다.generated/*.html및assets/*를 재귀적으로 PUT하고, 각 쓰기를 후속 GET/PROPFIND 비교로 확인합니다.references/webdav-publish-mode.md를 참조하십시오.- 확인: 라이브 경로를 가져오고, 제공된 바이트가 로컬
generated/파일과 일치하는지 확인합니다(공백/속성 순서 차이만 허용, 파이프라인 자체의 Phase 1 검증과 동일한 허용 오차),assets/site.css/theme.js가 올바른 MIME 유형으로 로드되는지 확인합니다. - 정확히 무엇이 발생했는지 보고합니다: 경로가 부트스트랩되었거나 재사용되었는지, 게시된 파일과 해당 DAV 경로, 확인 결과 — 또는 자격 증명이 누락된 경우 배포 가능한 번들 위치와 라이브 게시가 발생하지 않았다는 명시적 진술.
모드 참조
- 경로 부트스트랩 및
isqlTLS/WebID 구문에 대해서는references/isql-route-mode.md를 읽으십시오. - WebDAV 게시 및 범위 외 경계에 대해서는
references/webdav-publish-mode.md를 읽으십시오. - 파이프라인 경계(이 스킬이
rdf/에서 다루고 다루지 않는 부분)에 대해서는references/rdf-content-mode.md를 읽으십시오. - 실시간 SPARQL/VSP 렌더링이 선택되지 않은 이유에 대해서는
references/webdav-website-engine-gate.md를 읽으십시오. - 에이전트 호출 가능 작업에 대해서는
references/opal-tool-mode.md를 읽으십시오. v1에서는 구현되지 않았으며, 확장 지점으로 문서화되어 있습니다.
실용적인 가드레일
- 경고를 억제하거나
--skip-validate스타일의 단축키와 함께rdf/build.py의 SHACL 검증을 실행하지 마십시오. 게이트 실패는 콘텐츠를 게시할 준비가 되지 않았다는 의미이지, 우회할 장애물이 아닙니다. DB.DBA.DAV_RES_UPLOAD_STRSES_INT(정적 파일이 아닌 단계에 사용되는 경우)는 일반 문자열이 아닌http(content, stream)을 통해 채워진string_output()스트림이 필요합니다.isql을 통해 로드되는 모든 SQL에서$1,$2및 유사한 토큰을 피하십시오. 매크로 대체를 트리거할 수 있습니다.- 정적 파일
VHOST_DEFINE은is_dav=>1,is_brws=>0,def_page=>'index.html'을 사용합니다. VSP 진입점이 실제로 존재하지 않는 한def_page=>'index.vsp'를 설정하지 마십시오. 존재하지 않는 VSP 리소스를 가리키는def_page는 사이트 대신 원시 소스 또는 404를 제공합니다. - 동일한 호스트/경로에 대한 이전 충돌
VHOST_DEFINE을 재정의하기 전에 삭제하십시오.weblog-from-webdav의 경로-제거-후-재정의 패턴과 동일합니다. - 인증서 기반 ID와 위임된 주체를 별도의 사실로 취급하십시오:
-X/--cert는 호출 에이전트를 식별하고,-W/On-Behalf-Of는 ACL 권한이 평가되어야 하는 WebID 주체를 식별합니다. - 자격 증명을 스킬, 생성된 SQL, 로그 또는 커밋된 파일에 절대 작성하지 마십시오.
- 원격 업로드 및 제거는 동일한 HTTP → WebDAV → iSQL 순서 및 주체 PKCS#12 패턴(
howto/remote-webdav-upload.ttl,howto/remote-resource-removal.ttl, 환경설정 단계 215–216)을 따릅니다. URIBurner 쓰기/삭제는 포트 5443으로 이동합니다. PUT 후:5443GET과 공개 443 GET을 별도로 보고하십시오. DELETE 후에는 사용자 이름 URL, 슬래시 변형,:5443GET 및 폴더 목록을 확인한 후에만 제거를 주장하십시오.
안전한 Virtuoso ISQL 오류 출력
이 워크플로우가 OpenLink의 네이티브 Virtuoso isql 클라이언트를 호출할 때마다 베어 클라이언트 옵션 COMMAND_TEXT_ON_ERROR=OFF를 전달하십시오. 예: isql {host}:{port} {user} {password} COMMAND_TEXT_ON_ERROR=OFF {script.sql}. SQL 입력, 스크립트 인수 또는 -i 앞에 배치하십시오. OFF는 클라이언트의 내부 값 0에 매핑되며, 클라이언트가 실패한 전체 명령을 오류 출력에 추가하는 것을 방지합니다. 클라이언트는 OFF/ON을 허용합니다. 리터럴 0은 거부됩니다. 이 설정에 -u를 사용하지 마십시오(-u는 U 인수 배열을 채웁니다). 이는 서버 진단, 셸 기록 또는 프로세스 인수에서 비밀을 삭제하지 않으므로 SQL 텍스트와 로그에 자격 증명을 보관하지 마십시오. 이 Virtuoso 특정 옵션을 unixODBC/iODBC isql 클라이언트에 적용하지 마십시오.