概要
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 クライアントの作成
- Google Cloud Console で新規プロジェクトを作成する
- 「API とサービス」→ Google Calendar API を有効化する
- OAuth 同意画面を設定する(User Type: External、公開ステータスは「テスト」のままでよい。テストユーザーに自分の Gmail を追加する)
-
認証情報 → 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_name、vars.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.html。
apps/web/wrangler.jsonc の
not_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_id を apps/sync/wrangler.jsonc の
d1_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_SECRET と TOKEN_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 キー付き)の提供を検討している。それまでは「自分の分は自分でデプロイ」が最も安全な使い方。