Skip to content

Latest commit

 

History

History
343 lines (232 loc) · 21.4 KB

README.ja.md

File metadata and controls

343 lines (232 loc) · 21.4 KB
📢 EdgeChat パートナーシップ・広告枠

EdgeChat は開発者、Cloudflare ユーザー、セルフホストコミュニティを対象としており、現在 GitHub で 666 Star を獲得しています。README も継続的に多くの方に閲覧されています。

製品やサービスが 開発者ツール、クラウドサービス、セルフホストアプリ、オープンソースエコシステム に関連する場合、README への広告掲載をご検討いただけます。

  • Sponsor — $5 / 月 Sponsors セクションにロゴ、名称、リンクを掲載します。
  • Featured Sponsor — $10 / 月 より上位の掲載位置、大きなロゴ、1 行の紹介文をご利用いただけます。

読者との関連性を保つため、掲載内容は開発者ツール、クラウドサービス、セルフホスト製品、オープンソースエコシステムに関連するブランドに限定します。

掲載をご希望の場合は、Telegram コミュニティまたは Issue からお問い合わせください。

EdgeChat

自分のチャットスペースを、サーバーの保守から始める必要はありません。

Cloudflare を基盤としたオープンソースのセルフホスト型チームチャットシステム

リアルタイムのグループチャットとダイレクトメッセージ · Telegram 双方向ブリッジ · 音声とファイル · メッセージと添付ファイルのサーバーサイド暗号化

license stars forks last commit Cloudflare Workers

中文 · English · 日本語 · オンラインデモ · プロジェクトドキュメント · Telegram コミュニティ


EdgeChat は Cloudflare 上で動作するオープンソースのチームチャットシステムです。 チーム、プロジェクト、または小さなコミュニティのために独立したチャットスペースを構築できます。議論はグループに、個人的な話はダイレクトメッセージに、音声やファイルも手軽に共有できます。

常時稼働するサーバーを別途保守する必要はありません。アプリケーションとデータリソースは自分の Cloudflare アカウントにデプロイされ、GitHub Actions によって自動的にデプロイ・更新されます。メンバーがすでに Telegram を使っている場合は、両方のグループを接続し、それぞれ慣れたチャット入口を使い続けることもできます。

インターフェースプレビュー · オンラインデモ · Telegram ブリッジ · 機能 · プライバシーと暗号化 · デプロイ · ローカル開発

インターフェースプレビュー

チャット画面 管理画面
EdgeChat チャット画面のプレビュー EdgeChat 管理画面のプレビュー

オンラインデモ

EdgeChat オンラインデモを開く →

まず画面を確認してから、デプロイするか決めてください。

デモサイトは正式プロジェクトの Vue ページ、ルーティング、状態管理、リアルタイムメッセージ処理を再利用しています。ただし API、WebSocket、ファイルアップロード、Telegram からの転送はすべてブラウザー内のメモリ上でシミュレートされており、実際のバックエンドに接続するマルチユーザーチャットではありません。

ページを更新するか、右上の「デモデータをリセット」をクリックすると初期状態に戻ります。デモでの操作が正式 Worker にアクセスしたり、D1、KV、R2 に書き込んだりすることはありません。

EdgeChat を選ぶ理由

EdgeChat は、自分のチャットスペースを持ちたいが、そのためにサーバー、データベース、一式の実行環境を長期的に保守したくないというニーズに応えます。

気になること EdgeChat の方法
デプロイと保守 Cloudflare Workers を基盤とし、常時稼働サーバーの別途保守は不要。GitHub Actions による自動デプロイに対応
メンバーと管理 独立したアカウント、公開・非公開グループ、ダイレクトメッセージ、管理画面を提供
既存の Telegram グループ Bot による双方向ブリッジで、両側のメンバーが慣れた入口を使い続けられる
自分で変更・拡張 ソースコードを公開しており、ニーズに合わせて画面や機能を調整可能

プロジェクト自体は無料のオープンソースです。クラウドサービスの料金は Cloudflare のプラン、リソース構成、実際の使用量によって異なります。

Telegram 双方向ブリッジ

全員を同じアプリに移行させる必要はありません。

管理者は EdgeChat のグループと Telegram のグループを紐付け、Telegram Bot を介してメッセージを双方向に転送できます。Web 上で送信したメッセージは Telegram に同期され、Telegram グループのメッセージも EdgeChat に戻ってきます。

Telegram グループがすでにあり、同時に独立した Web チャット入口も必要とするチームやコミュニティに適しています。

EdgeChat と Telegram の双方向メッセージブリッジのデモ
2 つのチャット入口、1 つの議論。

機能

💬 チャットと会話

  • 公開グループ、非公開グループ、一対一のダイレクトメッセージ。
  • リアルタイムメッセージ、履歴のページング、音声メッセージ、ファイル共有。
  • メッセージへの返信、引用ジャンプ、@ メンションと返信通知。
  • ダイレクトメッセージの連絡先のブロックと解除。ブロック中は双方ともダイレクトメッセージを送信できません。
  • 期限切れメッセージの定期的な完全削除に対応。

🎨 日常の使いやすさ

  • Liquid Glass スタイルのインターフェース。デスクトップとモバイルに対応。
  • 音声録音、波形による進捗表示、再生速度変更。
  • Web フロントエンドでサイト内メッセージ通知を提供。バックグラウンドではブラウザーのシステム通知を利用できますが、ユーザーの許可が必要です。
  • ファイルアップロード、アバター管理、基本的なアクセシビリティ対応。

🛠 インスタンス管理

  • ダッシュボード、ユーザー管理、登録招待、サイト設定。
  • 永久 BAN と、日・時間・分単位の一時 BAN に対応。一時 BAN は期限切れ後に自動復旧し、追加の定期タスクは不要です。
  • ブラウザー上でソースコードリポジトリと直接比較し、現在のデプロイに更新があるか確認。

🔌 接続と拡張

  • Telegram グループとの双方向メッセージブリッジ。音声メッセージの同期にも対応。
  • WebMCP サイトツール:対応クライアント環境で、ログイン、会話の検索、メッセージの読み取り・送信などを提供。

プライバシーと暗号化

EdgeChat は新たに書き込まれるメッセージ本文と新たにアップロードされる添付ファイルに AES-256-GCM のサーバーサイド保存時暗号化を使用します。履歴の平文データはそのまま保持され、読み取り時には新旧データの両方に対応します。デプロイやバックグラウンドタスクで一括暗号化することはありません。

管理画面にはグループやダイレクトメッセージの本文を閲覧する入口はありませんが、メッセージ数などの集計統計は確認できます。

Note

これはサーバーサイド暗号化であり、エンドツーエンド暗号化ではありません。 Worker はセッション権限を検証した後に内容を復号します。Cloudflare の実行環境と鍵を管理するデプロイ担当者は、引き続き信頼する必要があります。管理画面にメッセージ閲覧入口がないことは、デプロイ担当者が技術的に内容へアクセスできないことを意味しません。

Telegram ブリッジを有効にすると、転送されたメッセージも対応する Telegram 会話に入ります。

鍵の管理とローテーションについて

GitHub Actions はサーバーサイド暗号化の Worker Secrets を管理します。初回デプロイ時に対象 Worker に暗号化 Secret が存在しない場合、ワークフローはランダムな 32 バイト AES 鍵を自動生成し、独立したバージョン付き Secret として注入し、現在の active key ID を記録します。その後の通常デプロイではこれらの Secret の存在だけを確認し、再生成、上書き、ローテーションは行いません。

本番環境にすでに存在する EDGECHAT_ENCRYPTION_KEYRING JSON 鍵リングはそのまま保持され、引き続き互換性があります。

鍵を手動で指定する場合は、EDGECHAT_ENCRYPTION_KEYRING という名前の GitHub Repository Secret を作成できます。

{"activeKeyId":"v1","keys":{"v1":"BASE64_ENCODED_32_BYTE_KEY"}}

初回デプロイではこの値がそのまま採用されます。

既存 Worker で自動的に増分ローテーションするには、Deploy Worker を手動実行し、rotate_encryption_key にチェックを入れます。ワークフローはバージョン付きの鍵 Secret を 1 つだけ追加し、active key ID を新しいバージョンへ切り替えます。すべての旧 Secret と旧 JSON 鍵リングは変更されません。新しいメッセージには新しい鍵を使用し、旧暗号文は各エンベロープの key ID に対応する鍵で復号します。

apply_encryption_keyring は手動で上書きするための予備の入口です。使用時は Repository Secret に完全な JSON 鍵リングを指定し、keys に履歴の暗号文から引き続き参照されるすべての旧 key ID を残したうえで、新しい鍵を追加し activeKeyId を更新する必要があります。

旧 key を削除すると、対応する履歴の暗号文を永久に読み取れなくなります。 apply_encryption_keyring と rotate_encryption_key は同じ実行で同時に有効化できません。

技術スタック

部分 技術
フロントエンド Vue 3、Vue Router、Vite
バックエンド Cloudflare Workers、Hono
リアルタイム通信 Durable Objects、WebSocket Hibernation
データベース Cloudflare D1
セッションストレージ Cloudflare KV
ファイルストレージ Cloudflare R2
ビルドとデプロイ Wrangler、GitHub Actions

実装の詳細は TECHNICAL.md を参照してください。

デプロイ

GitHub Actions による自動デプロイ

デプロイとその後の更新には、リポジトリに組み込まれた GitHub Actions ワークフローの利用を推奨します。

ドキュメントに従って Cloudflare の認証とリポジトリ設定を完了すると、Deploy Worker を手動実行できます。また、master または main ブランチにコードをプッシュしてデプロイをトリガーすることもできます。ワークフローファイルは .github/workflows/deploy-worker.yml です。

クイックスタート · GitHub Actions デプロイチュートリアル

手動デプロイと Docker

ローカル手動デプロイのリソース準備、設定方法、注意事項は デプロイドキュメント を参照してください。

Docker の説明は DOCKER.md を参照してください。

Android クライアント

クライアント、インストール、ビルドの説明を見る

capacitor/ クライアントは APK に Vue Web UI を内蔵し、少量の Kotlin コードでシステムのファイル選択、通知、マイク権限、通知からの会話移動、外部リンクに接続します。パッケージ名は com.aozorae.edgechat.web で、初回ログイン時に自分の EdgeChat HTTPS サービスアドレスを入力します。特定のデプロイには紐付きません。

  • インストールパッケージ:GitHub Releases から edgechat-*.apk をダウンロードし、SHA256SUMS.txt を確認。
  • 初回利用:自分の EdgeChat HTTPS サービスアドレス、アカウント、パスワードを入力。
  • ローカルビルド:JDK 21 と Android SDK 36 を準備し、npm run build:capacitor を実行。
  • Debug APK:capacitor/android/app/build/outputs/apk/debug/app-debug.apk。
  • CI:.github/workflows/capacitor-android-ci.yml が edgechat-capacitor-debug をアップロード。
  • リリース:android-v* タグをプッシュするか Android Release を手動実行し、4 つの ANDROID_KEYSTORE_* Secrets で署名済み APK/AAB をビルド。
  • サービス切り替え:ログアウト後にアドレスを変更できます。インスタンス切り替え時には旧インスタンスのトークンを自動消去します。

現在、Room オフラインデータベース、WorkManager Outbox、FCM は含まれていません。アプリが停止してメッセージを受信できない場合、バックグラウンドでの即時通知は保証されません。

ネイティブ android/ Kotlin + Jetpack Compose クライアントは一時的に廃止され、既定のリリース版ではありません。ソース、API v1 契約、独立した CI は一時的に保持しています。

詳細は Android クライアントドキュメント を参照してください。

ローカル開発

# ソースコードを取得
git clone https://github.com/aozorae/Edgechat.git
cd Edgechat

# 依存関係をインストール
npm install

# クラウドリソースを先にデプロイせず、フロントエンドのみのデモを起動
npm run dev:demo

実際のバックエンドに接続して開発またはデプロイする前に、ドキュメントに従って対応する Cloudflare リソースと設定を準備してください。

# フロントエンド開発
npm run dev:frontend

# ローカルビルド
npm run build

# ローカル手動リリース
npm run deploy
デモサイトのビルド、デプロイ、CI 環境変数
# デモサイトを独立してビルド
npm run build:demo

# 独立したデモ Worker をデプロイ
npm run deploy:demo

デモサイトは wrangler.demo.toml と .github/workflows/deploy-demo.yml を使用し、Worker 名は edgechat-demo です。GitHub Actions は手動トリガーのみをサポートし、DEMO_CLOUDFLARE_ACCOUNT_ID、DEMO_CLOUDFLARE_API_TOKEN を読み取ります。既存の本番デプロイワークフローは変更しません。

非対話環境でデプロイする場合は、あらかじめ CLOUDFLARE_API_TOKEN を設定してください。

管理画面の更新チェックは、ビルド時に現在の GitHub リポジトリ、ブランチ、コミットを自動記録します。正確な結果を得るには、手動デプロイを、すでにプッシュされたクリーンなコミットに基づく Git リポジトリ内で実行してください。ソースコードリポジトリは公開状態である必要があり、ブラウザーが GitHub Compare API を直接呼び出せます。この処理で定期タスクが作成されることはありません。

PowerShell の例:

$env:CLOUDFLARE_API_TOKEN = "your-token"
npm run deploy

プロジェクト構成

主要ディレクトリを見る
Edgechat/
├─ assets/previews/       # インターフェースプレビュー
├─ frontend/              # Vue フロントエンドとブラウザー内デモ
├─ worker/
│  ├─ schema.sql         # データベーススキーマ
│  ├─ migrations/        # データベースマイグレーション
│  └─ src/               # API、認証、Durable Objects
├─ capacitor/            # Web UI ベースの Android クライアント
├─ android/              # 一時的に保持されるネイティブ Android クライアント
├─ .github/workflows/    # 自動デプロイと CI
├─ wrangler.toml
├─ wrangler.demo.toml
├─ package.json
├─ README.md
├─ README.en.md
├─ README.ja.md
└─ LICENSE

交流と貢献

問題がある場合、機能について議論したい場合、または独自の使い方を共有したい場合は、Issue を提出してください。Telegram コミュニティ への参加も歓迎します。

コード、ドキュメント、翻訳、フィードバックはすべてプロジェクトの改善に役立ちます。Pull Request を歓迎します。

EdgeChat を支援してくださったすべての貢献者に感謝します:

貢献者

Star History

Star History Chart

ライセンス

本プロジェクトは GNU GPL v3.0 or later を採用しています。詳細は LICENSE を参照してください。

謝辞

プロジェクトの普及にご協力くださった linux do に感謝します。

免責事項

EdgeChat はセルフホスト型のオープンソースプロジェクトです。プロジェクトメンテナーはソフトウェア自体のみを提供し、ユーザーが自分でデプロイしたインスタンスの運用、管理、制御は行いません。

インスタンスのデプロイ担当者と利用者は、デプロイ方法、利用行為、そこで生成されるコンテンツとデータについて自ら責任を負うものとします。

プロジェクトメンテナーは、個別にデプロイされたインスタンスの利用または悪用について責任を負いません。