Guide

セルフホスト手順

kichijitsu は MIT ライセンスのオープンソース。自分の Cloudflare アカウントにデプロイして、カレンダーの認可情報を自分だけで管理する手順をまとめた。

概要

kichijitsu は 自分の Cloudflare アカウントに自分でデプロイして使うことを基本線にしている、MIT ライセンスのオープンソースソフトウェア。あなたのカレンダーの認可情報 (Google の refresh token) は、あなた自身のアカウントの D1 にだけ保存され、運営者を信頼する必要が無い。

公式インスタンス (kichijitsu.love-rox.cc) は招待制で運用している。自分のデータの置き場所を自分で管理したい場合は、このガイドでセルフホストすること。

必要なもの

  • Cloudflare アカウント(無料プランで動く。Durable Object は SQLite バックエンドを使っているため有料プランは不要)
  • Cloudflare に載せたドメイン1つ(例: kichijitsu.example.com)。Web と API を同一オリジンで配信する構成のため、カスタムドメインは必須 (*.workers.dev のみでの運用は現状サポート外)
  • Google Cloud のアカウント(無料。自分専用の OAuth クライアントを作る)
  • Node.js 26 / pnpm(リポジトリの mise.toml を使う場合は mise install だけで揃う)

1. リポジトリの準備

git clone https://github.com/love-rox/kichijitsu.git
cd kichijitsu
mise install   # または Node 26 を自前で用意
pnpm install

2. Google OAuth クライアントの作成

  1. Google Cloud Console で新規プロジェクトを作成する
  2. 「API とサービス」→ Google Calendar API を有効化する
  3. OAuth 同意画面を設定する(User Type: External、公開ステータスは「テスト」のままでよい。テストユーザーに自分の Gmail を追加する)
  4. 認証情報 → OAuth クライアント ID(ウェブアプリケーション)を作成し、承認済みリダイレクト URI に以下を追加する。
    • http://localhost:8787/auth/callback(ローカル開発用)
    • https://<あなたのドメイン>/auth/callback(本番用)

自分(+テストユーザーに追加した人)しか使わないなら、Google の審査は不要。

3. 設定を自分の環境に合わせる

以下の3箇所を自分の値に書き換える。

ファイル 書き換える箇所
apps/web/wrangler.jsonc name(任意)、routes[0].pattern → あなたのドメイン
apps/sync/wrangler.jsonc name(任意)、routes の2つの pattern と zone_namevars.APP_URL
apps/sync/wrangler.jsonc d1_databases[0].database_id → 次の手順で作る実 ID

運営者情報(規約・プライバシーポリシー)

プライバシーポリシー利用規約 はあなたのドメインでもそのまま配信される。このインスタンスの運営者はあなた自身なので、あなたの情報を設定すること。ビルド時の環境変数で差し込む。

export KICHIJITSU_OPERATOR_NAME="あなたの名前 / 組織名"
export KICHIJITSU_OPERATOR_CONTACT="you@example.com"   # 未設定なら mailto: リンクは出ない
export KICHIJITSU_INSTANCE_HOST="cal.example.com"

未設定のままでも、kichijitsu 公式 (love-rox) の運営者名・連絡先があなたのインスタンスの規約に出ることはない。該当箇所は「本インスタンスの運営者情報は設定されていません。」という表示になる。

同梱の規約・ポリシーは公式インスタンスのものをひな形として付けているだけ。 内容が自分の運用に合っているかは自分で確認・修正すること (法的な責任はインスタンスの運営者にある)。

この紹介サイトはあなたのインスタンスには入らない

いま読んでいるこのページを含む公式サイトの紹介ページ ―― ランディング (/)・MCP 接続ガイド (/mcp/)・セルフホスト手順 (/self-hosting/) ―― は別パッケージ apps/site にあり、pnpm build の成果物には含まれない。 apps/web/dist はまるごと配信されるので、同居させているとあなたのドメインで kichijitsu 公式インスタンスの宣伝ページが配信されてしまうため。あなたが何もしなくてもそうならない。

あなたのインスタンスで配信されるのは次の4つだけ。

パス 内容
/app/ アプリ本体
/ /app/ へのリンクだけを置いた最小のページ
/privacy.html プライバシーポリシー(運営者情報は上記の環境変数で差し込み)
/terms.html 利用規約(同上)

/ の実体は apps/web/index.htmlapps/web/wrangler.jsoncnot_found_handling: "single-page-application" により、存在しないパスへのアクセスにもこのページが返る。

トップに独自の紹介ページを出したいなら、このファイルを差し替えればよい (/app/ へ即リダイレクトさせたいだけなら meta refresh を足すのが最短。ただし打ち間違えた URL も一緒に飛ぶ点には注意)。

4. デプロイ

まず Cloudflare にログインし、D1 データベースの実体を作る。

pnpm --filter sync exec wrangler login
pnpm --filter sync exec wrangler d1 create <あなたのD1名>   # → database_id を wrangler.jsonc へ

出力された database_idapps/sync/wrangler.jsoncd1_databases[0].database_id に反映してから、マイグレーションを本番 D1 に適用する。

pnpm --filter sync exec wrangler d1 migrations apply <あなたのD1名> --remote

続けて Secrets を登録する。

pnpm --filter sync exec wrangler secret put GOOGLE_CLIENT_ID
pnpm --filter sync exec wrangler secret put GOOGLE_CLIENT_SECRET
pnpm --filter sync exec wrangler secret put SESSION_SECRET   # ランダムな長い文字列
pnpm --filter sync exec wrangler secret put TOKEN_ENC_KEY     # openssl rand -base64 32 (refresh_token 暗号化鍵)

SESSION_SECRETTOKEN_ENC_KEY は、openssl rand -base64 32 などで新規に生成した、ローカル開発用とは別のランダム値を使うこと。

TOKEN_ENC_KEY は D1 に保存する refresh_token の at-rest 暗号化 (AES-256-GCM) に使う鍵。これを失う、または変更すると既存ユーザーの refresh_token が復号できなくなり全員再連携が必要になるので、生成した値は安全な場所 (パスワードマネージャ等) に控えておくこと。

最後に apps/web をビルドしてから、両方の Worker をデプロイする。

pnpm --filter web build
pnpm run deploy:sync
pnpm run deploy:web

5. セキュリティ設定

  • ALLOWED_EMAILS(apps/sync/wrangler.jsonc の vars)に自分のメールアドレスを設定しておくと、OAuth 設定を誤って公開した場合でもサーバー側で登録を拒否できる。
  • Cloudflare ダッシュボードで /auth/* /api/* への Rate Limiting ルールを追加すると、さらに安心(無料枠あり)。

ローカル開発

cp apps/sync/.dev.vars.example apps/sync/.dev.vars   # 値を記入
pnpm --filter sync dev    # localhost:8787
pnpm dev                  # localhost:5173 (API は自動でプロキシ)

公式インスタンスとの関係

  • 公式インスタンス(kichijitsu.love-rox.cc)は招待制で運用している。
  • 将来的に、審査済みの公式 API(レート制限・API キー付き)の提供を検討している。それまでは「自分の分は自分でデプロイ」が最も安全な使い方。