Color mode

記事とサイトのリポジトリ分離

Riebeckite では、記事とサイトを同じ Repository に置く必要はありません。

たとえば、

text
記事
  → Markdown / Obsidian Vault
 
サイト
  → Application / Config / Theme / Plugin

を別々に管理できます。

この Guide では、

  • そもそも Repository を分けるべきか
  • どのような構成にするか
  • 外部 Vault を Site から読む方法
  • Private Repository の記事を CI から読む方法
  • 記事更新から Site を再デプロイする方法
  • 公開してよい Content をどう制御するか

を説明します。

repository_dispatch、外部 Checkout、notify-site.yml などの詳細な GitHub Actions 構成は リポジトリ分離の詳細編 を参照してください。

この構成が向いている人

Repository の分離は、特に次のような場合に便利です。

  • Obsidian Vault と Site Code を別々に管理したい
  • 記事 Repository は Private、Site Repository は Public にしたい
  • 1つの Vault を複数の Site から利用したい
  • 記事の更新と Site Code の更新を分けたい
  • 記事 Repository の Push から Site を自動デプロイしたい

一方、小さな個人 Site を1つの Repository で管理するだけなら、無理に分離する必要はありません。

まずは1 Repository で始める

通常の Riebeckite Site は、

text
site/
├─ content/
├─ app/
├─ riebeckite.config.ts
└─ package.json

という構成です。

create-riebeckite で Site を作成した場合も、基本的にはこの形から始まります。

Diagram source
text
flowchart LR
    Repo["Site Repository"]
 
    Repo --> App["app/"]
    Repo --> Content["content/"]
    Repo --> Config["riebeckite.config.ts"]

既存の Obsidian Vault を利用するなど、明確に分離する理由がなければ、最初はこの構成で十分です。

Repository を分けるとどうなる?

分離すると、

text
site repository          content repository
├─ app/                  ├─ article-a.md
├─ riebeckite.config.ts  ├─ article-b.md
├─ package.json          ├─ attachments/
└─ ...                   └─ ...

のようになります。

役割も明確に分かれます。

Repository 主な内容
Site Application、Config、Theme、Plugin、Deploy
Content Markdown、Obsidian Vault、添付ファイル
Diagram source
text
flowchart LR
    Content["Content Repository<br/>Markdown / Vault"]
    Site["Site Repository<br/>Code / Config / Theme"]
    Build["Riebeckite Build"]
    Public["Public Site"]
 
    Content --> Build
    Site --> Build
    Build --> Public

Riebeckite Build が両方を組み合わせて、最終的な Site を生成します。

どの構成を選ぶ?

大きく3つの構成があります。

パターン 構成 公開範囲 向いているケース
A. 1 Repository Site と content/ を同じ Repository に置く 同じ 小さな個人 Site
B. 同じ Repository 内で分離 site/ と vault/ を並べる 同じ 履歴は共有しつつ場所を分けたい
C. 別 Repository Site と Content を別 Repository にする 別々に設定可能 Private Vault、独立した更新、複数 Site

迷った場合は、次のように選べます。

Diagram source
text
flowchart TD
    Start{"Repositoryを分ける必要がある?"}
 
    Start -->|"特にない"| A["A. 1 Repository"]
    Start -->|"フォルダだけ分けたい"| B["B. 同Repository内"]
    Start -->|"記事をPrivateにしたい"| C["C. 別Repository"]
    Start -->|"更新を独立させたい"| C
    Start -->|"Vaultを複数Siteで使いたい"| C

特に、

記事 Repository 自体を公開したくないなら C

が分かりやすい構成です。

以下では C の構成を説明します。

A と B でも Content の設定方法は基本的に同じですが、外部 Repository の Checkout や Repository Dispatch は必要ありません。

記事は Site の外に置ける

Riebeckite の content.directory は、Site Root からの相対 Path で外部 Directory を指定できます。

たとえば、

text
workspace/
├─ vault/
│  ├─ article-a.md
│  └─ article-b.md
│
└─ site/
   ├─ app/
   ├─ riebeckite.config.ts
   └─ package.json

なら、

ts
// site/riebeckite.config.ts
 
export default defineConfig({
  content: {
    directory: "../vault",
  },
});

とできます。

記事を Site Directory の内部へコピーする必要はありません。

content.directory の基準は Site の appRoot です。

詳しい Root の解決規則は Configuration の「Filesystem root と外部 Vault」を参照してください。

何をどこへ置く?

たとえば次のように分けられます。

内容 置き場所
Markdown Vault
画像・添付ファイル Vault の attachments/ など
Obsidian 設定 Vault の .obsidian/
Site Code Site Repository
Riebeckite Config Site Repository
Theme / Plugin 設定 Site Repository
Deploy 設定 Site Repository
非公開 Note Vault 内の private/ など

Riebeckite が公開対象として扱う範囲は、後述する publishStrategy と exclude で制御します。

別 Repository 構成を作る

ここからは、

text
notes
  → Content Repository
 
my-site
  → Site Repository

として説明します。

1. Content Repository を作る

まず記事用の Repository を用意します。

sh
mkdir notes
cd notes
git init

Obsidian を利用する場合は、この Directory を Vault として開きます。

最初の記事を作ります。

md
---
title: はじめまして
publish: true
---
 
最初のノートです。

既定の explicit Publish Strategy では、

yaml
publish: true

が付いた Note だけが公開対象になります。

.gitignore

OS の一時 File や Obsidian の Workspace State を Git 管理したくない場合は .gitignore に追加します。

gitignore
.DS_Store
Thumbs.db
 
.obsidian/workspace.json
.obsidian/workspace-mobile.json

.obsidian/ 自体を Git 管理しても構いません。

Site の Content として読みたくないものは、後で exclude から除外できます。

Private Repository にする

記事そのものを公開したくない場合は、Content Repository を GitHub の Private Repository にします。

sh
git add .
git commit -m "最初のノート"
 
git remote add origin \
  git@github.com:<you>/notes.git
 
git push -u origin main

これによって、

text
Content Repository
  → Private
 
Site Repository
  → Public

という構成にできます。

2. Site を作る

GitHub Actions を利用する場合は、Content Repository と Site Repository を指定して Site を生成できます。対話式の CLI では Separate GitHub repository を選び、Content repository と Site repository を入力するのと同じ構成になります(GitHub Actions のデプロイ設定は自動です)。

sh
npx create-riebeckite my-site \
  --github-actions \
  --content-repository <you>/notes \
  --site-repository <you>/my-site
 
cd my-site
npm install

Preset は必要に応じて --preset で変更できます。

既定の starter から始めても問題ありません。

この構成では、Deploy Workflow が Content Repository を Site の、

text
content/

へ Checkout します。

また、外部 Content Repository 用の、

text
content-updated
repository_dispatch
github/notify-site.yml

も生成されます。

ローカルでの配置

開発環境では、

text
workspace/
├─ notes/
└─ my-site/

のように兄弟 Directory として配置すると扱いやすくなります。

ただし、CI では Site Checkout 内の、

text
my-site/
└─ content/

へ Content Repository を Checkout します。

ローカル配置と CI 配置が同じとは限らない点に注意してください。

3. content.directory を設定する

生成された Deploy Workflow に合わせる場合は、

ts
export default defineConfig({
  // ...
 
  content: {
    directory: "content",
 
    exclude: [
      ".obsidian/**",
      "Templates/**",
      "private/**",
    ],
  },
 
  // ...
});

とします。

directory: "content" は CI が Content Repository を Checkout する場所です。

exclude には Site へ読み込ませたくないものを指定します。

典型的には、

text
.obsidian/**
Templates/**
private/**

などです。

exclude と publish: true は別物

この2つは役割が異なります。

Diagram source
text
flowchart LR
    Vault["Vault"]
 
    Vault --> Exclude{"exclude に一致?"}
    Exclude -->|"Yes"| Ignore["読み込まない"]
    Exclude -->|"No"| Read["読み込む"]
 
    Read --> Publish{"公開条件を満たす?"}
    Publish -->|"Yes"| Public["公開"]
    Publish -->|"No"| Hidden["非公開"]

exclude は、

そもそも Content として読み込ませない

ための設定です。

publish: true は、

読み込んだ Content のうち何を公開するか

を決めます。

Private Content を扱う場合は、両方を利用して公開境界を明確にしておくのがおすすめです。

4. Content が読めているか確認する

表示を確認する前に CLI で状態を確認できます。

sh
npm exec riebeckite check
npm exec riebeckite doctor
npm exec riebeckite inspect config
npm exec -- riebeckite inspect content --list

それぞれの役割は次のとおりです。

Command 確認すること
check Config と Plugin Contract
doctor Content Source などの問題
inspect config 解決済み Config
inspect content --list 実際に読み込まれた Content

特に、

sh
npm exec riebeckite inspect config

の Directory を確認してください。

ここには解決済みの絶対 Path が表示されます。

text
期待する Vault
       ↑
Directory がここを指しているか確認

また、

sh
npm exec -- riebeckite inspect content --list

では読み込まれた Note の PATH を確認できます。

想定より多い・少ない場合は exclude を確認してください。

記事が読み込まれているのに公開されない場合は、publish: true も確認します。

5. CI を理解する

別 Repository 構成では、特に重要な違いがあります。

「CI が Content Repository を読める」ことと、「Content の更新で Deploy が起動する」ことは別です。

Diagram source
text
flowchart TD
    Push["Content Repository<br/>push"]
 
    Notify["notify-site.yml"]
    Dispatch["repository_dispatch<br/>content-updated"]
 
    Deploy["Site Deploy Workflow"]
    CheckoutSite["Site Checkout"]
    CheckoutContent["Content Checkout"]
 
    Build["riebeckite check<br/>riebeckite build"]
    Publish["Deploy"]
 
    Push --> Notify
    Notify --> Dispatch
    Dispatch --> Deploy
 
    Deploy --> CheckoutSite
    CheckoutSite --> CheckoutContent
    CheckoutContent --> Build
    Build --> Publish

外部 Checkout だけ設定しても、Content Repository の Push から Site Workflow は起動しません。

外部 Checkout が解決するのは、

text
Site CI が Content を読める

という問題です。

Repository Dispatch が解決するのは、

text
Content が更新されたら
Site CI を起動する

という問題です。

この2つを混同しないでください。

6. Content Repository から Site へ通知する

生成された、

text
github/notify-site.yml

を Content Repository の、

text
.github/workflows/notify-site.yml

へ配置します。

Content Repository の main に Push されると、Site Repository へ、

text
content-updated

を送信します。

Site 側では、

yaml
repository_dispatch:
  types:
    - content-updated

を受け取って Deploy Workflow を起動します。

SITE_DISPATCH_TOKEN

Content Repository 側には、

text
SITE_DISPATCH_TOKEN

を Secret として設定します。

これは Content Repository から Site Repository へ Dispatch を送るための Token です。

Fine-grained PAT を利用する場合は、

text
対象
  → Site Repository のみ
 
権限
  → Contents: read and write

が必要です。

Classic PAT の repo Scope や、Contents: write を持つ GitHub App Installation Token も利用できます。

Fine-grained PAT も Classic PAT も、GitHub の Settings → Developer settings → Personal access tokens から作成できます。作成した値は、この Content Repository の Settings → Secrets and variables → Actions に SITE_DISPATCH_TOKEN という名前で登録します。

RIEBECKITE_CONTENT_READ_TOKEN

Content Repository が Private または Internal の場合は、Site Repository 側に、

text
RIEBECKITE_CONTENT_READ_TOKEN

を登録します。

これは Site CI が Content Repository を Checkout するための Token です。

Fine-grained PAT の場合は、

text
対象
  → Content Repository のみ
 
権限
  → Contents: read

とします。

Content Repository が Public なら、この Secret は不要です。

Site Repository の通常の GITHUB_TOKEN では、別の Private / Internal Repository を読むことはできません。

この Token は Site Repository の Settings → Secrets and variables → Actions に登録します。

2つの Token の違い

名前が似ていますが、役割はまったく異なります。

Secret 置く場所 目的
SITE_DISPATCH_TOKEN Content Repository Site Workflow を起動する
RIEBECKITE_CONTENT_READ_TOKEN Site Repository Private Content を Checkout する
Diagram source
text
flowchart LR
    Content["Content Repository"]
    Site["Site Repository"]
 
    Content -->|"SITE_DISPATCH_TOKEN<br/>Deployを起動"| Site
    Site -->|"RIEBECKITE_CONTENT_READ_TOKEN<br/>Contentを読む"| Content

この関係を覚えておくと CI の問題を切り分けやすくなります。

7. Deploy の流れ

Repository Dispatch を利用した場合は、最終的に次の順番になります。

text
1. Content Repository に push
 
2. notify-site.yml が実行
 
3. Site Repository へ
   content-updated を送信
 
4. Site Deploy Workflow が起動
 
5. Site Repository を checkout
 
6. Content Repository を
   content/ へ checkout
 
7. riebeckite check
 
8. riebeckite build
 
9. Deploy

処理は次の順番で進みます。

text
通知
  ↓
起動
  ↓
Checkout
  ↓
Build

他の運用方法

Repository Dispatch 以外の方法も利用できます。

方法 Content Push で Deploy 特徴
同じ Repository される 最も単純
別 Repository + Dispatch される Content 更新を即時反映
別 Repository + Schedule 遅れて反映 Dispatch Token 不要
Manual されない 必要なときだけ実行
Git Submodule されない Site 側で参照 Commit の更新が必要

Schedule

Site Workflow に schedule を追加すれば、定期的に Content Repository の最新状態を取得できます。

この場合、

text
SITE_DISPATCH_TOKEN

は不要です。

ただし Content 更新から Deploy まで遅延します。

Git Submodule

Content Repository を Git Submodule として管理することもできます。

sh
git submodule add \
  git@github.com:<you>/notes.git \
  content

この場合、

text
site/
└─ content/
   └─ → notes repository

という関係になります。

CI では actions/checkout に、

yaml
submodules: recursive

を設定します。

ただし Content を更新しただけでは Site の Submodule Reference は更新されません。

Content 更新後に Site 側でも、

sh
cd my-site
cd content
git pull
cd ..
 
git add content
git commit -m "記事を更新"
git push

という操作が必要です。

そのため、記事 Push だけで自動 Deploy したい場合は Repository Dispatch の方が向いています。

日常の運用

Repository Dispatch を設定した後は、記事側では通常どおり編集して Push します。

sh
cd notes
 
# Obsidianなどで編集
 
git add .
git commit -m "記事を追加"
git push

その後、

text
Content Push
     ↓
notify-site
     ↓
repository_dispatch
     ↓
Site Build
     ↓
Deploy

が自動で実行されます。

Site Code を変更するときは Site Repository を通常どおり編集して Push します。

手元で確認する

Site は Site Directory から実行します。

sh
cd my-site
 
npm run dev
npm run check
npm run doctor

riebeckite build も Site Directory で実行します。

Content Repository は入力であり、Riebeckite Application 自体を実行する場所ではありません。

公開のルール

Repository を分離しても、Repository の公開範囲と Riebeckite の公開判定は別物です。

たとえば Private Repository に Note が存在していても、

yaml
publish: true

が付けば、Build 後の Public Site に内容が出る可能性があります。

逆に Public Repository に置いている Note は、Site に出さなくても Repository 自体から読むことができます。

この2つを分けて考えてください。

Diagram source
text
flowchart TD
    Repo["Git Repository"]
 
    Repo --> RepoVisibility["Repository Visibility<br/>public / private"]
 
    Repo --> Riebeckite["Riebeckite"]
 
    Riebeckite --> Exclude["exclude"]
    Exclude --> Strategy["publishStrategy"]
    Strategy --> Site["Public Site"]

publishStrategy

公開対象は、

text
content.filters.publishStrategy

で決まります。

既定は explicit です。

Strategy 公開条件 向いている用途
explicit publish: true がある 公開対象を明示的に選ぶ
selective private: true / draft: true がない 基本すべて公開する

Private Vault を利用する場合は explicit が安全側の設定です。

text
explicit
 
公開し忘れる
  → あり得る
 
公開指定していないNoteが
意図せずSiteに出る
  → 起こりにくい

公開境界を二重にする

Private Content を扱う場合は、

text
exclude
+
publishStrategy: explicit

を組み合わせます。

たとえば、

ts
content: {
  directory: "content",
 
  exclude: [
    ".obsidian/**",
    "Templates/**",
    "private/**",
  ],
 
  filters: {
    publishStrategy: "explicit",
  },
},

とします。

そして公開する Note だけに、

yaml
publish: true

を付けます。

Obsidian で除外した方がよいもの

一般的には、

text
.obsidian/**
Templates/**
private/**

などを exclude に指定します。

特に .obsidian/ には Workspace State や Obsidian 固有の設定が含まれるため、Content として読み込ませないようにします。

添付ファイルに注意する

Vault 内の Asset は、content image と attachment / media で公開方法が異なります。

種類 対象 URL 公開の担当
Content image 画像(png、jpg、svg など) /<Vault からの相対 logical path> build 時に generated output として書き出される
Attachment / Media Markdown でも画像でもないファイル /assets/attachments/<Vault からの相対 logical path> Site 側の Prebuild

Content image は、公開ページから参照されているものだけが build の出力に含まれるため、手動で public/ へコピーする必要はありません。

一方の attachment / media について、

md
![[attachments/report.pdf]]

が URL に変換されても、実際の report.pdf が Public Output に存在しなければ Browser では 404 になります。

Diagram source
text
flowchart LR
    Image["content image<br/>assets/logo.png"]
    Attach["![[attachments/report.pdf]]"]
 
    Image -->|"build が書き出す"| Output["Public Output"]
    Attach -->|"URL だけ生成"| Prebuild["Prebuild Copy"]
    Prebuild --> Output

公開する attachment / media だけをコピーする Prebuild 処理を Site 側に用意してください。

Riebeckite Repository 内では、

text
apps/web/scripts/build_images.ts

が参照実装です。

詳しい Asset の扱いは リポジトリ分離の詳細編 を参照してください。

よくある質問

Site 内の content/ のまま一部だけ非公開にできる?

できます。

Repository 分離は、公開・非公開を制御するために必須ではありません。

text
Repositoryを物理的に分ける
  → Repository構成の問題
 
何をSiteに公開するか
  → publishStrategy / exclude の問題

同じ Repository の content/ を使いながら、

  • 非公開 Note に publish: true を付けない
  • Private Directory を exclude する

という運用もできます。

Vault を移動したら記事が表示されなくなった

content.directory を確認してください。

相対 Path は Site Root を基準に解決されます。

sh
npm exec riebeckite inspect config

で解決済み Directory を確認できます。

絶対 Path も利用できますが、開発端末と CI で環境が異なりやすいため、通常は相対 Path の方が扱いやすくなります。

記事は表示されるのに Asset だけ 404 になる

まず、どの種類の Asset かを区別してください。

画像が 404 になる場合は、その画像が公開ページから参照されているか確認します。content image は公開ページから参照されているものだけが build の出力に含まれるため、参照が漏れていないかを先に確認します。

Attachment / Media が 404 になる場合は Copy 処理を確認してください。URL が生成されていても、実ファイルが、

text
public/assets/attachments/

などの Public Directory に存在しなければ表示できません。

CI でだけ Vault が見つからない

CI 上に Content Repository が存在するか確認してください。

別 Repository の場合は、

  • 外部 Checkout
  • Submodule

などで CI Workspace に Content を取得する必要があります。

そのうえで content.directory が CI 上の配置と一致しているか確認します。

Windows でも同じ設定を使える?

はい。

exclude Pattern は / 区切りで記述します。

実際の OS の Path Separator には依存しません。

トラブルシューティング

症状 確認すること
記事が表示されない publish: true、exclude、inspect content --list
Directory が違う inspect config と content.directory
CI で Vault が見つからない 外部 Checkout / Submodule
Content Push で Deploy されない notify-site.yml / SITE_DISPATCH_TOKEN / repository_dispatch
Private Content を Checkout できない RIEBECKITE_CONTENT_READ_TOKEN
画像だけ 404 公開ページからの参照があるか、build の出力を確認
Attachment / Media だけ 404 Prebuild の Asset Copy
ローカルと CI で Path が違う Site Root を基準にした相対 Path
Submodule が更新されない Site 側の Submodule Reference

問題を切り分ける

問題が起きた場合は、次の順番で確認すると原因を絞りやすくなります。

Diagram source
text
flowchart TD
    Start["記事が公開されない"]
 
    Start --> Source{"Contentを読めている?"}
 
    Source -->|No| Directory["content.directory<br/>外部Checkoutを確認"]
    Source -->|Yes| Exclude{"excludeされていない?"}
 
    Exclude -->|Yes| Config["excludeを確認"]
    Exclude -->|No| Publish{"publish条件を満たす?"}
 
    Publish -->|No| Frontmatter["publish: true を確認"]
    Publish -->|Yes| Build{"Build成功?"}
 
    Build -->|No| Diagnostics["check / doctor"]
    Build -->|Yes| Deploy{"Deployされた?"}
 
    Deploy -->|No| CI["Dispatch / Workflowを確認"]
    Deploy -->|Yes| Asset{"画像だけ問題?"}
 
    Asset -->|Yes| Copy["Asset Copyを確認"]

より詳しい CI 認証、Root 解決、Asset、GitHub Actions の問題については リポジトリ分離の詳細編 を参照してください。

まとめ

最初から Repository を分離する必要はありません。

text
単純なSite
  → Site + content を1 Repository
 
既存Vaultを使う
  → 外部Directoryも選択肢
 
記事をPrivateにする
  → Contentを別Private Repository
 
Content Pushで自動Deploy
  → Repository Dispatch

別 Repository にする場合は、特に次の4つを分けて考えることが重要です。

Diagram source
text
flowchart LR
    Read["1. Contentを読む<br/>Checkout"]
    Trigger["2. Buildを起動<br/>Dispatch"]
    Publish["3. 公開対象を選ぶ<br/>publishStrategy / exclude"]
    Assets["4. Assetを公開<br/>Prebuild Copy"]

Repository を分離すること自体は、Riebeckite の公開判定を変更しません。

Repository の境界、Content の読み込み、Deploy の起動、Site への公開は、それぞれ別の責務です。

関連資料

  • リポジトリ分離の詳細編 — Root 解決、CI 認証、Assets、GitHub Actions、トラブル対応
  • Configuration — appRoot / configRoot / contentRoot
  • Guides — その他の利用 Guide
  • Cloudflare デプロイテンプレート — Deploy Workflow

History

1 changesCollapseExpand
1 + # 記事とサイトのリポジトリ分離
2 +
3 + Riebeckite では、**記事とサイトを同じ Repository に置く必要はありません。**
4 +
5 + たとえば、
6 +
7 + ```text
8 + 記事
9 + → Markdown / Obsidian Vault
10 +
11 + サイト
12 + → Application / Config / Theme / Plugin
13 + ```
14 +
15 + を別々に管理できます。
16 +
17 + この Guide では、
18 +
19 + - そもそも Repository を分けるべきか
20 + - どのような構成にするか
21 + - 外部 Vault を Site から読む方法
22 + - Private Repository の記事を CI から読む方法
23 + - 記事更新から Site を再デプロイする方法
24 + - 公開してよい Content をどう制御するか
25 +
26 + を説明します。
27 +
28 + `repository_dispatch`、外部 Checkout、`notify-site.yml` などの詳細な GitHub Actions 構成は [リポジトリ分離の詳細編](./deployment/separate-content-repository.ja.md) を参照してください。
29 +
30 + ## この構成が向いている人
31 +
32 + Repository の分離は、特に次のような場合に便利です。
33 +
34 + - Obsidian Vault と Site Code を別々に管理したい
35 + - 記事 Repository は Private、Site Repository は Public にしたい
36 + - 1つの Vault を複数の Site から利用したい
37 + - 記事の更新と Site Code の更新を分けたい
38 + - 記事 Repository の Push から Site を自動デプロイしたい
39 +
40 + 一方、小さな個人 Site を1つの Repository で管理するだけなら、無理に分離する必要はありません。
41 +
42 + ## まずは1 Repository で始める
43 +
44 + 通常の Riebeckite Site は、
45 +
46 + ```text
47 + site/
48 + ├─ content/
49 + ├─ app/
50 + ├─ riebeckite.config.ts
51 + └─ package.json
52 + ```
53 +
54 + という構成です。
55 +
56 + `create-riebeckite` で Site を作成した場合も、基本的にはこの形から始まります。
57 +
58 + ```mermaid
59 + flowchart LR
60 + Repo["Site Repository"]
61 +
62 + Repo --> App["app/"]
63 + Repo --> Content["content/"]
64 + Repo --> Config["riebeckite.config.ts"]
65 + ```
66 +
67 + 既存の Obsidian Vault を利用するなど、明確に分離する理由がなければ、最初はこの構成で十分です。
68 +
69 + ## Repository を分けるとどうなる?
70 +
71 + 分離すると、
72 +
73 + ```text
74 + site repository content repository
75 + ├─ app/ ├─ article-a.md
76 + ├─ riebeckite.config.ts ├─ article-b.md
77 + ├─ package.json ├─ attachments/
78 + └─ ... └─ ...
79 + ```
80 +
81 + のようになります。
82 +
83 + 役割も明確に分かれます。
84 +
85 + | Repository | 主な内容 |
86 + | --- | --- |
87 + | Site | Application、Config、Theme、Plugin、Deploy |
88 + | Content | Markdown、Obsidian Vault、添付ファイル |
89 +
90 + ```mermaid
91 + flowchart LR
92 + Content["Content Repository<br/>Markdown / Vault"]
93 + Site["Site Repository<br/>Code / Config / Theme"]
94 + Build["Riebeckite Build"]
95 + Public["Public Site"]
96 +
97 + Content --> Build
98 + Site --> Build
99 + Build --> Public
100 + ```
101 +
102 + Riebeckite Build が両方を組み合わせて、最終的な Site を生成します。
103 +
104 + ## どの構成を選ぶ?
105 +
106 + 大きく3つの構成があります。
107 +
108 + | パターン | 構成 | 公開範囲 | 向いているケース |
109 + | --- | --- | --- | --- |
110 + | A. 1 Repository | Site と `content/` を同じ Repository に置く | 同じ | 小さな個人 Site |
111 + | B. 同じ Repository 内で分離 | `site/` と `vault/` を並べる | 同じ | 履歴は共有しつつ場所を分けたい |
112 + | C. 別 Repository | Site と Content を別 Repository にする | 別々に設定可能 | Private Vault、独立した更新、複数 Site |
113 +
114 + 迷った場合は、次のように選べます。
115 +
116 + ```mermaid
117 + flowchart TD
118 + Start{"Repositoryを分ける必要がある?"}
119 +
120 + Start -->|"特にない"| A["A. 1 Repository"]
121 + Start -->|"フォルダだけ分けたい"| B["B. 同Repository内"]
122 + Start -->|"記事をPrivateにしたい"| C["C. 別Repository"]
123 + Start -->|"更新を独立させたい"| C
124 + Start -->|"Vaultを複数Siteで使いたい"| C
125 + ```
126 +
127 + 特に、
128 +
129 + **記事 Repository 自体を公開したくないなら C**
130 +
131 + が分かりやすい構成です。
132 +
133 + 以下では C の構成を説明します。
134 +
135 + A と B でも Content の設定方法は基本的に同じですが、外部 Repository の Checkout や Repository Dispatch は必要ありません。
136 +
137 + ## 記事は Site の外に置ける
138 +
139 + Riebeckite の `content.directory` は、Site Root からの相対 Path で外部 Directory を指定できます。
140 +
141 + たとえば、
142 +
143 + ```text
144 + workspace/
145 + ├─ vault/
146 + │ ├─ article-a.md
147 + │ └─ article-b.md
148 + │
149 + └─ site/
150 + ├─ app/
151 + ├─ riebeckite.config.ts
152 + └─ package.json
153 + ```
154 +
155 + なら、
156 +
157 + ```ts
158 + // site/riebeckite.config.ts
159 +
160 + export default defineConfig({
161 + content: {
162 + directory: "../vault",
163 + },
164 + });
165 + ```
166 +
167 + とできます。
168 +
169 + 記事を Site Directory の内部へコピーする必要はありません。
170 +
171 + `content.directory` の基準は Site の `appRoot` です。
172 +
173 + 詳しい Root の解決規則は [Configuration](../reference/configuration.ja.md) の「Filesystem root と外部 Vault」を参照してください。
174 +
175 + ## 何をどこへ置く?
176 +
177 + たとえば次のように分けられます。
178 +
179 + | 内容 | 置き場所 |
180 + | --- | --- |
181 + | Markdown | Vault |
182 + | 画像・添付ファイル | Vault の `attachments/` など |
183 + | Obsidian 設定 | Vault の `.obsidian/` |
184 + | Site Code | Site Repository |
185 + | Riebeckite Config | Site Repository |
186 + | Theme / Plugin 設定 | Site Repository |
187 + | Deploy 設定 | Site Repository |
188 + | 非公開 Note | Vault 内の `private/` など |
189 +
190 + Riebeckite が公開対象として扱う範囲は、後述する `publishStrategy` と `exclude` で制御します。
191 +
192 + ## 別 Repository 構成を作る
193 +
194 + ここからは、
195 +
196 + ```text
197 + notes
198 + → Content Repository
199 +
200 + my-site
201 + → Site Repository
202 + ```
203 +
204 + として説明します。
205 +
206 + ## 1. Content Repository を作る
207 +
208 + まず記事用の Repository を用意します。
209 +
210 + ```sh
211 + mkdir notes
212 + cd notes
213 + git init
214 + ```
215 +
216 + Obsidian を利用する場合は、この Directory を Vault として開きます。
217 +
218 + 最初の記事を作ります。
219 +
220 + ```md
221 + ---
222 + title: はじめまして
223 + publish: true
224 + ---
225 +
226 + 最初のノートです。
227 + ```
228 +
229 + 既定の `explicit` Publish Strategy では、
230 +
231 + ```yaml
232 + publish: true
233 + ```
234 +
235 + が付いた Note だけが公開対象になります。
236 +
237 + ## `.gitignore`
238 +
239 + OS の一時 File や Obsidian の Workspace State を Git 管理したくない場合は `.gitignore` に追加します。
240 +
241 + ```gitignore
242 + .DS_Store
243 + Thumbs.db
244 +
245 + .obsidian/workspace.json
246 + .obsidian/workspace-mobile.json
247 + ```
248 +
249 + `.obsidian/` 自体を Git 管理しても構いません。
250 +
251 + Site の Content として読みたくないものは、後で `exclude` から除外できます。
252 +
253 + ## Private Repository にする
254 +
255 + 記事そのものを公開したくない場合は、Content Repository を GitHub の Private Repository にします。
256 +
257 + ```sh
258 + git add .
259 + git commit -m "最初のノート"
260 +
261 + git remote add origin \
262 + git@github.com:<you>/notes.git
263 +
264 + git push -u origin main
265 + ```
266 +
267 + これによって、
268 +
269 + ```text
270 + Content Repository
271 + → Private
272 +
273 + Site Repository
274 + → Public
275 + ```
276 +
277 + という構成にできます。
278 +
279 + ## 2. Site を作る
280 +
281 + GitHub Actions を利用する場合は、Content Repository と Site Repository を指定して Site を生成できます。対話式の CLI では `Separate GitHub repository` を選び、Content repository と Site repository を入力するのと同じ構成になります(GitHub Actions のデプロイ設定は自動です)。
282 +
283 + ```sh
284 + npx create-riebeckite my-site \
285 + --github-actions \
286 + --content-repository <you>/notes \
287 + --site-repository <you>/my-site
288 +
289 + cd my-site
290 + npm install
291 + ```
292 +
293 + Preset は必要に応じて `--preset` で変更できます。
294 +
295 + 既定の `starter` から始めても問題ありません。
296 +
297 + この構成では、Deploy Workflow が Content Repository を Site の、
298 +
299 + ```text
300 + content/
301 + ```
302 +
303 + へ Checkout します。
304 +
305 + また、外部 Content Repository 用の、
306 +
307 + ```text
308 + content-updated
309 + repository_dispatch
310 + github/notify-site.yml
311 + ```
312 +
313 + も生成されます。
314 +
315 + ## ローカルでの配置
316 +
317 + 開発環境では、
318 +
319 + ```text
320 + workspace/
321 + ├─ notes/
322 + └─ my-site/
323 + ```
324 +
325 + のように兄弟 Directory として配置すると扱いやすくなります。
326 +
327 + ただし、CI では Site Checkout 内の、
328 +
329 + ```text
330 + my-site/
331 + └─ content/
332 + ```
333 +
334 + へ Content Repository を Checkout します。
335 +
336 + ローカル配置と CI 配置が同じとは限らない点に注意してください。
337 +
338 + ## 3. `content.directory` を設定する
339 +
340 + 生成された Deploy Workflow に合わせる場合は、
341 +
342 + ```ts
343 + export default defineConfig({
344 + // ...
345 +
346 + content: {
347 + directory: "content",
348 +
349 + exclude: [
350 + ".obsidian/**",
351 + "Templates/**",
352 + "private/**",
353 + ],
354 + },
355 +
356 + // ...
357 + });
358 + ```
359 +
360 + とします。
361 +
362 + `directory: "content"` は CI が Content Repository を Checkout する場所です。
363 +
364 + `exclude` には Site へ読み込ませたくないものを指定します。
365 +
366 + 典型的には、
367 +
368 + ```text
369 + .obsidian/**
370 + Templates/**
371 + private/**
372 + ```
373 +
374 + などです。
375 +
376 + ## `exclude` と `publish: true` は別物
377 +
378 + この2つは役割が異なります。
379 +
380 + ```mermaid
381 + flowchart LR
382 + Vault["Vault"]
383 +
384 + Vault --> Exclude{"exclude に一致?"}
385 + Exclude -->|"Yes"| Ignore["読み込まない"]
386 + Exclude -->|"No"| Read["読み込む"]
387 +
388 + Read --> Publish{"公開条件を満たす?"}
389 + Publish -->|"Yes"| Public["公開"]
390 + Publish -->|"No"| Hidden["非公開"]
391 + ```
392 +
393 + `exclude` は、
394 +
395 + **そもそも Content として読み込ませない**
396 +
397 + ための設定です。
398 +
399 + `publish: true` は、
400 +
401 + **読み込んだ Content のうち何を公開するか**
402 +
403 + を決めます。
404 +
405 + Private Content を扱う場合は、両方を利用して公開境界を明確にしておくのがおすすめです。
406 +
407 + ## 4. Content が読めているか確認する
408 +
409 + 表示を確認する前に CLI で状態を確認できます。
410 +
411 + ```sh
412 + npm exec riebeckite check
413 + npm exec riebeckite doctor
414 + npm exec riebeckite inspect config
415 + npm exec -- riebeckite inspect content --list
416 + ```
417 +
418 + それぞれの役割は次のとおりです。
419 +
420 + | Command | 確認すること |
421 + | --- | --- |
422 + | `check` | Config と Plugin Contract |
423 + | `doctor` | Content Source などの問題 |
424 + | `inspect config` | 解決済み Config |
425 + | `inspect content --list` | 実際に読み込まれた Content |
426 +
427 + 特に、
428 +
429 + ```sh
430 + npm exec riebeckite inspect config
431 + ```
432 +
433 + の `Directory` を確認してください。
434 +
435 + ここには解決済みの絶対 Path が表示されます。
436 +
437 + ```text
438 + 期待する Vault
439 + ↑
440 + Directory がここを指しているか確認
441 + ```
442 +
443 + また、
444 +
445 + ```sh
446 + npm exec -- riebeckite inspect content --list
447 + ```
448 +
449 + では読み込まれた Note の `PATH` を確認できます。
450 +
451 + 想定より多い・少ない場合は `exclude` を確認してください。
452 +
453 + 記事が読み込まれているのに公開されない場合は、`publish: true` も確認します。
454 +
455 + ## 5. CI を理解する
456 +
457 + 別 Repository 構成では、特に重要な違いがあります。
458 +
459 + **「CI が Content Repository を読める」ことと、「Content の更新で Deploy が起動する」ことは別です。**
460 +
461 + ```mermaid
462 + flowchart TD
463 + Push["Content Repository<br/>push"]
464 +
465 + Notify["notify-site.yml"]
466 + Dispatch["repository_dispatch<br/>content-updated"]
467 +
468 + Deploy["Site Deploy Workflow"]
469 + CheckoutSite["Site Checkout"]
470 + CheckoutContent["Content Checkout"]
471 +
472 + Build["riebeckite check<br/>riebeckite build"]
473 + Publish["Deploy"]
474 +
475 + Push --> Notify
476 + Notify --> Dispatch
477 + Dispatch --> Deploy
478 +
479 + Deploy --> CheckoutSite
480 + CheckoutSite --> CheckoutContent
481 + CheckoutContent --> Build
482 + Build --> Publish
483 + ```
484 +
485 + 外部 Checkout だけ設定しても、Content Repository の Push から Site Workflow は起動しません。
486 +
487 + 外部 Checkout が解決するのは、
488 +
489 + ```text
490 + Site CI が Content を読める
491 + ```
492 +
493 + という問題です。
494 +
495 + Repository Dispatch が解決するのは、
496 +
497 + ```text
498 + Content が更新されたら
499 + Site CI を起動する
500 + ```
501 +
502 + という問題です。
503 +
504 + この2つを混同しないでください。
505 +
506 + ## 6. Content Repository から Site へ通知する
507 +
508 + 生成された、
509 +
510 + ```text
511 + github/notify-site.yml
512 + ```
513 +
514 + を Content Repository の、
515 +
516 + ```text
517 + .github/workflows/notify-site.yml
518 + ```
519 +
520 + へ配置します。
521 +
522 + Content Repository の `main` に Push されると、Site Repository へ、
523 +
524 + ```text
525 + content-updated
526 + ```
527 +
528 + を送信します。
529 +
530 + Site 側では、
531 +
532 + ```yaml
533 + repository_dispatch:
534 + types:
535 + - content-updated
536 + ```
537 +
538 + を受け取って Deploy Workflow を起動します。
539 +
540 + ## `SITE_DISPATCH_TOKEN`
541 +
542 + Content Repository 側には、
543 +
544 + ```text
545 + SITE_DISPATCH_TOKEN
546 + ```
547 +
548 + を Secret として設定します。
549 +
550 + これは Content Repository から Site Repository へ Dispatch を送るための Token です。
551 +
552 + Fine-grained PAT を利用する場合は、
553 +
554 + ```text
555 + 対象
556 + → Site Repository のみ
557 +
558 + 権限
559 + → Contents: read and write
560 + ```
561 +
562 + が必要です。
563 +
564 + Classic PAT の `repo` Scope や、`Contents: write` を持つ GitHub App Installation Token も利用できます。
565 +
566 + Fine-grained PAT も Classic PAT も、[GitHub の Settings → Developer settings → Personal access tokens](https://github.com/settings/tokens) から作成できます。作成した値は、この Content Repository の **Settings → Secrets and variables → Actions** に `SITE_DISPATCH_TOKEN` という名前で登録します。
567 +
568 + ## `RIEBECKITE_CONTENT_READ_TOKEN`
569 +
570 + Content Repository が Private または Internal の場合は、Site Repository 側に、
571 +
572 + ```text
573 + RIEBECKITE_CONTENT_READ_TOKEN
574 + ```
575 +
576 + を登録します。
577 +
578 + これは Site CI が Content Repository を Checkout するための Token です。
579 +
580 + Fine-grained PAT の場合は、
581 +
582 + ```text
583 + 対象
584 + → Content Repository のみ
585 +
586 + 権限
587 + → Contents: read
588 + ```
589 +
590 + とします。
591 +
592 + Content Repository が Public なら、この Secret は不要です。
593 +
594 + Site Repository の通常の `GITHUB_TOKEN` では、別の Private / Internal Repository を読むことはできません。
595 +
596 + この Token は **Site Repository の Settings → Secrets and variables → Actions** に登録します。
597 +
598 + ## 2つの Token の違い
599 +
600 + 名前が似ていますが、役割はまったく異なります。
601 +
602 + | Secret | 置く場所 | 目的 |
603 + | --- | --- | --- |
604 + | `SITE_DISPATCH_TOKEN` | Content Repository | Site Workflow を起動する |
605 + | `RIEBECKITE_CONTENT_READ_TOKEN` | Site Repository | Private Content を Checkout する |
606 +
607 + ```mermaid
608 + flowchart LR
609 + Content["Content Repository"]
610 + Site["Site Repository"]
611 +
612 + Content -->|"SITE_DISPATCH_TOKEN<br/>Deployを起動"| Site
613 + Site -->|"RIEBECKITE_CONTENT_READ_TOKEN<br/>Contentを読む"| Content
614 + ```
615 +
616 + この関係を覚えておくと CI の問題を切り分けやすくなります。
617 +
618 + ## 7. Deploy の流れ
619 +
620 + Repository Dispatch を利用した場合は、最終的に次の順番になります。
621 +
622 + ```text
623 + 1. Content Repository に push
624 +
625 + 2. notify-site.yml が実行
626 +
627 + 3. Site Repository へ
628 + content-updated を送信
629 +
630 + 4. Site Deploy Workflow が起動
631 +
632 + 5. Site Repository を checkout
633 +
634 + 6. Content Repository を
635 + content/ へ checkout
636 +
637 + 7. riebeckite check
638 +
639 + 8. riebeckite build
640 +
641 + 9. Deploy
642 + ```
643 +
644 + 処理は次の順番で進みます。
645 +
646 + ```text
647 + 通知
648 + ↓
649 + 起動
650 + ↓
651 + Checkout
652 + ↓
653 + Build
654 + ```
655 +
656 + ## 他の運用方法
657 +
658 + Repository Dispatch 以外の方法も利用できます。
659 +
660 + | 方法 | Content Push で Deploy | 特徴 |
661 + | --- | --- | --- |
662 + | 同じ Repository | される | 最も単純 |
663 + | 別 Repository + Dispatch | される | Content 更新を即時反映 |
664 + | 別 Repository + Schedule | 遅れて反映 | Dispatch Token 不要 |
665 + | Manual | されない | 必要なときだけ実行 |
666 + | Git Submodule | されない | Site 側で参照 Commit の更新が必要 |
667 +
668 + ## Schedule
669 +
670 + Site Workflow に `schedule` を追加すれば、定期的に Content Repository の最新状態を取得できます。
671 +
672 + この場合、
673 +
674 + ```text
675 + SITE_DISPATCH_TOKEN
676 + ```
677 +
678 + は不要です。
679 +
680 + ただし Content 更新から Deploy まで遅延します。
681 +
682 + ## Git Submodule
683 +
684 + Content Repository を Git Submodule として管理することもできます。
685 +
686 + ```sh
687 + git submodule add \
688 + git@github.com:<you>/notes.git \
689 + content
690 + ```
691 +
692 + この場合、
693 +
694 + ```text
695 + site/
696 + └─ content/
697 + └─ → notes repository
698 + ```
699 +
700 + という関係になります。
701 +
702 + CI では `actions/checkout` に、
703 +
704 + ```yaml
705 + submodules: recursive
706 + ```
707 +
708 + を設定します。
709 +
710 + ただし Content を更新しただけでは Site の Submodule Reference は更新されません。
711 +
712 + Content 更新後に Site 側でも、
713 +
714 + ```sh
715 + cd my-site
716 + cd content
717 + git pull
718 + cd ..
719 +
720 + git add content
721 + git commit -m "記事を更新"
722 + git push
723 + ```
724 +
725 + という操作が必要です。
726 +
727 + そのため、記事 Push だけで自動 Deploy したい場合は Repository Dispatch の方が向いています。
728 +
729 + ## 日常の運用
730 +
731 + Repository Dispatch を設定した後は、記事側では通常どおり編集して Push します。
732 +
733 + ```sh
734 + cd notes
735 +
736 + # Obsidianなどで編集
737 +
738 + git add .
739 + git commit -m "記事を追加"
740 + git push
741 + ```
742 +
743 + その後、
744 +
745 + ```text
746 + Content Push
747 + ↓
748 + notify-site
749 + ↓
750 + repository_dispatch
751 + ↓
752 + Site Build
753 + ↓
754 + Deploy
755 + ```
756 +
757 + が自動で実行されます。
758 +
759 + Site Code を変更するときは Site Repository を通常どおり編集して Push します。
760 +
761 + ## 手元で確認する
762 +
763 + Site は Site Directory から実行します。
764 +
765 + ```sh
766 + cd my-site
767 +
768 + npm run dev
769 + npm run check
770 + npm run doctor
771 + ```
772 +
773 + `riebeckite build` も Site Directory で実行します。
774 +
775 + Content Repository は入力であり、Riebeckite Application 自体を実行する場所ではありません。
776 +
777 + ## 公開のルール
778 +
779 + Repository を分離しても、**Repository の公開範囲と Riebeckite の公開判定は別物**です。
780 +
781 + たとえば Private Repository に Note が存在していても、
782 +
783 + ```yaml
784 + publish: true
785 + ```
786 +
787 + が付けば、Build 後の Public Site に内容が出る可能性があります。
788 +
789 + 逆に Public Repository に置いている Note は、Site に出さなくても Repository 自体から読むことができます。
790 +
791 + この2つを分けて考えてください。
792 +
793 + ```mermaid
794 + flowchart TD
795 + Repo["Git Repository"]
796 +
797 + Repo --> RepoVisibility["Repository Visibility<br/>public / private"]
798 +
799 + Repo --> Riebeckite["Riebeckite"]
800 +
801 + Riebeckite --> Exclude["exclude"]
802 + Exclude --> Strategy["publishStrategy"]
803 + Strategy --> Site["Public Site"]
804 + ```
805 +
806 + ## `publishStrategy`
807 +
808 + 公開対象は、
809 +
810 + ```text
811 + content.filters.publishStrategy
812 + ```
813 +
814 + で決まります。
815 +
816 + 既定は `explicit` です。
817 +
818 + | Strategy | 公開条件 | 向いている用途 |
819 + | --- | --- | --- |
820 + | `explicit` | `publish: true` がある | 公開対象を明示的に選ぶ |
821 + | `selective` | `private: true` / `draft: true` がない | 基本すべて公開する |
822 +
823 + Private Vault を利用する場合は `explicit` が安全側の設定です。
824 +
825 + ```text
826 + explicit
827 +
828 + 公開し忘れる
829 + → あり得る
830 +
831 + 公開指定していないNoteが
832 + 意図せずSiteに出る
833 + → 起こりにくい
834 + ```
835 +
836 + ## 公開境界を二重にする
837 +
838 + Private Content を扱う場合は、
839 +
840 + ```text
841 + exclude
842 + +
843 + publishStrategy: explicit
844 + ```
845 +
846 + を組み合わせます。
847 +
848 + たとえば、
849 +
850 + ```ts
851 + content: {
852 + directory: "content",
853 +
854 + exclude: [
855 + ".obsidian/**",
856 + "Templates/**",
857 + "private/**",
858 + ],
859 +
860 + filters: {
861 + publishStrategy: "explicit",
862 + },
863 + },
864 + ```
865 +
866 + とします。
867 +
868 + そして公開する Note だけに、
869 +
870 + ```yaml
871 + publish: true
872 + ```
873 +
874 + を付けます。
875 +
876 + ## Obsidian で除外した方がよいもの
877 +
878 + 一般的には、
879 +
880 + ```text
881 + .obsidian/**
882 + Templates/**
883 + private/**
884 + ```
885 +
886 + などを `exclude` に指定します。
887 +
888 + 特に `.obsidian/` には Workspace State や Obsidian 固有の設定が含まれるため、Content として読み込ませないようにします。
889 +
890 + ## 添付ファイルに注意する
891 +
892 + Vault 内の Asset は、content image と attachment / media で公開方法が異なります。
893 +
894 + | 種類 | 対象 | URL | 公開の担当 |
895 + | --- | --- | --- | --- |
896 + | Content image | 画像(png、jpg、svg など) | `/<Vault からの相対 logical path>` | build 時に generated output として書き出される |
897 + | Attachment / Media | Markdown でも画像でもないファイル | `/assets/attachments/<Vault からの相対 logical path>` | Site 側の Prebuild |
898 +
899 + Content image は、公開ページから参照されているものだけが build の出力に含まれるため、手動で `public/` へコピーする必要はありません。
900 +
901 + 一方の attachment / media について、
902 +
903 + ```md
904 + ![[attachments/report.pdf]]
905 + ```
906 +
907 + が URL に変換されても、実際の `report.pdf` が Public Output に存在しなければ Browser では `404` になります。
908 +
909 + ```mermaid
910 + flowchart LR
911 + Image["content image<br/>assets/logo.png"]
912 + Attach["![[attachments/report.pdf]]"]
913 +
914 + Image -->|"build が書き出す"| Output["Public Output"]
915 + Attach -->|"URL だけ生成"| Prebuild["Prebuild Copy"]
916 + Prebuild --> Output
917 + ```
918 +
919 + 公開する attachment / media だけをコピーする Prebuild 処理を Site 側に用意してください。
920 +
921 + Riebeckite Repository 内では、
922 +
923 + ```text
924 + apps/web/scripts/build_images.ts
925 + ```
926 +
927 + が参照実装です。
928 +
929 + 詳しい Asset の扱いは [リポジトリ分離の詳細編](./deployment/separate-content-repository.ja.md) を参照してください。
930 +
931 + ## よくある質問
932 +
933 + ### Site 内の `content/` のまま一部だけ非公開にできる?
934 +
935 + できます。
936 +
937 + Repository 分離は、公開・非公開を制御するために必須ではありません。
938 +
939 + ```text
940 + Repositoryを物理的に分ける
941 + → Repository構成の問題
942 +
943 + 何をSiteに公開するか
944 + → publishStrategy / exclude の問題
945 + ```
946 +
947 + 同じ Repository の `content/` を使いながら、
948 +
949 + - 非公開 Note に `publish: true` を付けない
950 + - Private Directory を `exclude` する
951 +
952 + という運用もできます。
953 +
954 + ### Vault を移動したら記事が表示されなくなった
955 +
956 + `content.directory` を確認してください。
957 +
958 + 相対 Path は Site Root を基準に解決されます。
959 +
960 + ```sh
961 + npm exec riebeckite inspect config
962 + ```
963 +
964 + で解決済み `Directory` を確認できます。
965 +
966 + 絶対 Path も利用できますが、開発端末と CI で環境が異なりやすいため、通常は相対 Path の方が扱いやすくなります。
967 +
968 + ### 記事は表示されるのに Asset だけ `404` になる
969 +
970 + まず、どの種類の Asset かを区別してください。
971 +
972 + 画像が `404` になる場合は、その画像が公開ページから参照されているか確認します。content image は公開ページから参照されているものだけが build の出力に含まれるため、参照が漏れていないかを先に確認します。
973 +
974 + Attachment / Media が `404` になる場合は Copy 処理を確認してください。URL が生成されていても、実ファイルが、
975 +
976 + ```text
977 + public/assets/attachments/
978 + ```
979 +
980 + などの Public Directory に存在しなければ表示できません。
981 +
982 + ### CI でだけ Vault が見つからない
983 +
984 + CI 上に Content Repository が存在するか確認してください。
985 +
986 + 別 Repository の場合は、
987 +
988 + - 外部 Checkout
989 + - Submodule
990 +
991 + などで CI Workspace に Content を取得する必要があります。
992 +
993 + そのうえで `content.directory` が CI 上の配置と一致しているか確認します。
994 +
995 + ### Windows でも同じ設定を使える?
996 +
997 + はい。
998 +
999 + `exclude` Pattern は `/` 区切りで記述します。
1000 +
1001 + 実際の OS の Path Separator には依存しません。
1002 +
1003 + ## トラブルシューティング
1004 +
1005 + | 症状 | 確認すること |
1006 + | --- | --- |
1007 + | 記事が表示されない | `publish: true`、`exclude`、`inspect content --list` |
1008 + | `Directory` が違う | `inspect config` と `content.directory` |
1009 + | CI で Vault が見つからない | 外部 Checkout / Submodule |
1010 + | Content Push で Deploy されない | `notify-site.yml` / `SITE_DISPATCH_TOKEN` / `repository_dispatch` |
1011 + | Private Content を Checkout できない | `RIEBECKITE_CONTENT_READ_TOKEN` |
1012 + | 画像だけ `404` | 公開ページからの参照があるか、build の出力を確認 |
1013 + | Attachment / Media だけ `404` | Prebuild の Asset Copy |
1014 + | ローカルと CI で Path が違う | Site Root を基準にした相対 Path |
1015 + | Submodule が更新されない | Site 側の Submodule Reference |
1016 +
1017 + ## 問題を切り分ける
1018 +
1019 + 問題が起きた場合は、次の順番で確認すると原因を絞りやすくなります。
1020 +
1021 + ```mermaid
1022 + flowchart TD
1023 + Start["記事が公開されない"]
1024 +
1025 + Start --> Source{"Contentを読めている?"}
1026 +
1027 + Source -->|No| Directory["content.directory<br/>外部Checkoutを確認"]
1028 + Source -->|Yes| Exclude{"excludeされていない?"}
1029 +
1030 + Exclude -->|Yes| Config["excludeを確認"]
1031 + Exclude -->|No| Publish{"publish条件を満たす?"}
1032 +
1033 + Publish -->|No| Frontmatter["publish: true を確認"]
1034 + Publish -->|Yes| Build{"Build成功?"}
1035 +
1036 + Build -->|No| Diagnostics["check / doctor"]
1037 + Build -->|Yes| Deploy{"Deployされた?"}
1038 +
1039 + Deploy -->|No| CI["Dispatch / Workflowを確認"]
1040 + Deploy -->|Yes| Asset{"画像だけ問題?"}
1041 +
1042 + Asset -->|Yes| Copy["Asset Copyを確認"]
1043 + ```
1044 +
1045 + より詳しい CI 認証、Root 解決、Asset、GitHub Actions の問題については [リポジトリ分離の詳細編](./deployment/separate-content-repository.ja.md) を参照してください。
1046 +
1047 + ## まとめ
1048 +
1049 + 最初から Repository を分離する必要はありません。
1050 +
1051 + ```text
1052 + 単純なSite
1053 + → Site + content を1 Repository
1054 +
1055 + 既存Vaultを使う
1056 + → 外部Directoryも選択肢
1057 +
1058 + 記事をPrivateにする
1059 + → Contentを別Private Repository
1060 +
1061 + Content Pushで自動Deploy
1062 + → Repository Dispatch
1063 + ```
1064 +
1065 + 別 Repository にする場合は、特に次の4つを分けて考えることが重要です。
1066 +
1067 + ```mermaid
1068 + flowchart LR
1069 + Read["1. Contentを読む<br/>Checkout"]
1070 + Trigger["2. Buildを起動<br/>Dispatch"]
1071 + Publish["3. 公開対象を選ぶ<br/>publishStrategy / exclude"]
1072 + Assets["4. Assetを公開<br/>Prebuild Copy"]
1073 + ```
1074 +
1075 + Repository を分離すること自体は、Riebeckite の公開判定を変更しません。
1076 +
1077 + **Repository の境界、Content の読み込み、Deploy の起動、Site への公開は、それぞれ別の責務です。**
1078 +
1079 + ### 関連資料
1080 +
1081 + - [リポジトリ分離の詳細編](./deployment/separate-content-repository.ja.md) — Root 解決、CI 認証、Assets、GitHub Actions、トラブル対応
1082 + - [Configuration](../reference/configuration.ja.md) — `appRoot` / `configRoot` / `contentRoot`
1083 + - [Guides](./README.ja.md) — その他の利用 Guide
1084 + - Cloudflare デプロイテンプレート — Deploy Workflow
1085 +
1086 +