Website From WebDAV
使用此技能將一個靜態、已產生的 HTML/CSS/JS 網站——即 RDF-Turtle + SHACL + Jinja2 管線(例如 sites/openlink/rdf/build.py)的輸出——發佈到 Virtuoso WebDAV 根目錄,並映射一條公開路由。該網站的內容模型(本體、SHACL 形狀、排序)是在此技能上游編寫和驗證的;此技能的工作從「這裡有一個 generated/ 資料夾,裡面是完成好的 HTML,讓它上線」開始。
此技能的範圍刻意比 weblog-from-webdav 或 osdi-inclusion-engine 更窄:那些技能每次請求都會即時渲染內容(在自訂 VSP 內列舉 WebDAV 集合,或使用共享 XSLT 樣式表包裹 WebDAV 來源的 HTML)。此技能的內容在到達之前已完全渲染——將其發佈僅是純粹的 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/。 - 身分模式: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 發佈——PUT 上傳generated/*.html和assets/*,並對每次寫入進行後續 GET/PROPFIND 比較以驗證。請參閱references/webdav-publish-mode.md。 - 驗證:提取即時路由,確認服務的位元組與本機
generated/檔案相符(僅允許空白/屬性順序差異,與管線自身的第一階段驗證使用相同的容差),確認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的路由移除-然後-重新定義模式相同。 - 將持有憑證的身分和受委派的主體視為兩個獨立的事實:
-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 用戶端時,請傳遞 bare 用戶端選項 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 引數陣列)。這不會從伺服器診斷、shell 歷史記錄或程序引數中刪除機密資訊,因此請將憑證保留在 SQL 文字和日誌之外。請勿將此 Virtuoso 特有的選項套用於 unixODBC/iODBC isql 用戶端。