Hono、TypeScript、Cloudflare Workersで構築されたシンプルなActivityPubリレーサーバーです。
- Cloudflareアカウント - Workersへのデプロイ用
- Wrangler CLI - Cloudflare Workers CLI(開発依存としてインストール済み)
- ActivityPubプロトコルサポート: コアとなるActivityPubリレー機能を実装
- HTTP署名検証: セキュリティのため、受信するアクティビティの署名を検証
- アクティビティタイプ: Follow、Undo、Create、Announceアクティビティに対応
- Cloudflare D1: フォロワーの関係性を保存するためのD1データベースを使用
- WebFinger & NodeInfo: フェデレーション検出のための
.well-known
エンドポイントを実装
プロジェクトの依存関係をインストールします:
pnpm install
ActivityPubアクティビティの署名用にRSAキーペアを生成します:
# 秘密鍵を生成
openssl genpkey -algorithm RSA -out private_key.pem -pkeyopt rsa_keygen_bits:2048
# 公開鍵を抽出
openssl rsa -pubout -in private_key.pem -out public_key.pem
.dev.vars.example
をコピーして.dev.vars
を作成し、実際の値を設定します:
cp .dev.vars.example .dev.vars
.dev.vars
を編集して以下を設定:
PUBLICKEY=-----BEGIN PUBLIC KEY-----
<公開鍵の内容>
-----END PUBLIC KEY-----
PRIVATEKEY=-----BEGIN PRIVATE KEY-----
<秘密鍵の内容>
-----END PRIVATE KEY-----
API_KEY=<強力なAPIキー>
Cloudflare Workersにシークレットを登録します:
# 公開鍵を登録
wrangler secret put PUBLICKEY
# プロンプトで公開鍵の内容を貼り付け
# 秘密鍵を登録
wrangler secret put PRIVATEKEY
# プロンプトで秘密鍵の内容を貼り付け
# APIキーを登録
wrangler secret put API_KEY
# プロンプトでAPIキーを貼り付け
wrangler.toml
を編集してD1データベースとホスト名を設定します:
[vars]
HOSTNAME = "relay.example.com" # リレーのドメイン
[[d1_databases]]
binding = "DB"
database_name = "activitypub-relay"
database_id = "your-database-id"
重要: PUBLICKEY
、PRIVATEKEY
、API_KEY
はwrangler.toml
に含めず、必ずwrangler secret put
コマンドで登録してください。
リレー用のD1データベースを作成します:
# データベースを作成
npx wrangler d1 create activitypub-relay
# 出力されたdatabase_idをwrangler.tomlにコピー
データベーススキーマを初期化します(必要に応じてマイグレーションの作成やSQLコマンドの実行を行ってください)。
開発サーバーを起動します:
pnpm run dev
サーバーはホットリロードを有効にしてローカルで実行されます。
リレーをCloudflare Workersにデプロイします:
pnpm run deploy
POST /inbox
- ActivityPubアクティビティを受信GET /actor
- アクター情報エンドポイントGET /.well-known/webfinger
- アクター検出用のWebFingerエンドポイントGET /.well-known/nodeinfo
- NodeInfo検出エンドポイントGET /nodeinfo/2.1.json
- NodeInfo 2.1メタデータGET /.well-known/host-meta
- ホストメタデータエンドポイント
プロジェクトではBiomeをリントとフォーマットに使用しています:
# コードをチェック
pnpm run check
# 問題を自動修正
pnpm run fix
# unsafe fixを含めて修正
pnpm run fix-unsafe
詳細はLICENSEファイルを参照してください。
A simple ActivityPub relay server built with Hono, TypeScript, and Cloudflare Workers.
- Cloudflare account - For deploying to Workers
- Wrangler CLI - Cloudflare Workers CLI (installed as dev dependency)
- ActivityPub Protocol Support: Implements core ActivityPub relay functionality
- HTTP Signature Verification: Verifies incoming activity signatures for security
- Activity Types: Supports Follow, Undo, Create, and Announce activities
- Cloudflare D1: Uses D1 database for storing follower relationships
- WebFinger & NodeInfo: Implements
.well-known
endpoints for federation discovery
Install the project dependencies:
pnpm install
Generate an RSA key pair for signing ActivityPub activities:
# Generate a private key
openssl genpkey -algorithm RSA -out private_key.pem -pkeyopt rsa_keygen_bits:2048
# Extract the public key
openssl rsa -pubout -in private_key.pem -out public_key.pem
Copy .dev.vars.example
to .dev.vars
and set your actual values:
cp .dev.vars.example .dev.vars
Edit .dev.vars
to set:
PUBLICKEY=-----BEGIN PUBLIC KEY-----
<your public key content>
-----END PUBLIC KEY-----
PRIVATEKEY=-----BEGIN PRIVATE KEY-----
<your private key content>
-----END PRIVATE KEY-----
API_KEY=<your-strong-api-key>
Register secrets to Cloudflare Workers:
# Register public key
wrangler secret put PUBLICKEY
# Paste your public key content when prompted
# Register private key
wrangler secret put PRIVATEKEY
# Paste your private key content when prompted
# Register API key
wrangler secret put API_KEY
# Paste your API key when prompted
Edit wrangler.toml
to set up your D1 database and hostname:
[vars]
HOSTNAME = "relay.example.com" # Your relay domain
[[d1_databases]]
binding = "DB"
database_name = "activitypub-relay"
database_id = "your-database-id"
Important: Do NOT include PUBLICKEY
, PRIVATEKEY
, or API_KEY
in wrangler.toml
. Always use wrangler secret put
command to register them.
Create a D1 database for your relay:
# Create the database
npx wrangler d1 create activitypub-relay
# Copy the database_id from the output to wrangler.toml
Initialize the database schema (create a migration or execute SQL commands as needed).
Start the development server:
pnpm run dev
The server will be running locally with hot-reload enabled.
Deploy your relay to Cloudflare Workers:
pnpm run deploy
POST /inbox
- Receive ActivityPub activitiesGET /actor
- Actor information endpointGET /.well-known/webfinger
- WebFinger endpoint for actor discoveryGET /.well-known/nodeinfo
- NodeInfo discovery endpointGET /nodeinfo/2.1.json
- NodeInfo 2.1 metadataGET /.well-known/host-meta
- Host metadata endpoint
The project uses Biome for linting and formatting:
# Check code
pnpm run check
# Fix issues automatically
pnpm run fix
# Fix issues including unsafe fixes
pnpm run fix-unsafe
See LICENSE file for details.