Hono、TypeScript、Cloudflare Workersで構築されたシンプルなActivityPubリレーサーバーです。
このプロジェクトはpnpm workspacesを使用したモノレポ構成になっています:
packages/contract- ORPC型定義と契約(フロントエンドとバックエンドで共有)packages/relay- バックエンド(Cloudflare Workers)packages/frontend- フロントエンド(Vue 3 + Vite)
- Cloudflareアカウント
- Node.js 18以上
- pnpm 9以上
- 基本的な投稿リレー機能
- HTTP署名
- WebFingerおよびNodeInfoのサポート
- 管理用ダッシュボード(Vue 3)
- ドメインルール管理(ホワイトリスト/ブラックリスト)
- フォローリクエスト管理
- Queue機能
- レート制限機能
プロジェクトの依存関係をインストールします:
pnpm installActivityPubアクティビティの署名用にRSAキーペアを生成します:
# 秘密鍵を生成
openssl genpkey -algorithm RSA -out private_key.pem -pkeyopt rsa_keygen_bits:2048
# 公開鍵を抽出
openssl rsa -pubout -in private_key.pem -out public_key.pemrelayパッケージ内の.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コマンドの実行を行ってください)。
Prismaスキーマを生成してマイグレーションを実行:
# スキーマ生成
pnpm db:generate
# ローカルマイグレーション
pnpm db:migrate開発サーバーを起動します:
pnpm devこれにより以下が起動します:
- バックエンド: http://localhost:3000
- フロントエンド: http://localhost:5173
詳細な開発ガイドは DEVELOPMENT.md を参照してください。
リレーをCloudflare Workersにデプロイします:
pnpm deploy詳細な開発ガイドは development.md を参照してください。
# 全体開発サーバー起動
pnpm dev
# 個別起動
pnpm dev:relay # バックエンドのみ
pnpm dev:frontend # フロントエンドのみ
# ビルド
pnpm build
# デプロイ
pnpm deploy
# DB操作
pnpm db:generate # Prismaスキーマ生成
pnpm db:migrate # ローカルマイグレーション
pnpm db:migrate:prod # 本番マイグレーション
# コード品質
pnpm check # Biomeチェック
pnpm fix # 自動修正
pnpm fix-unsafe # unsafe fixを含めて修正詳細はLICENSEファイルを参照してください。
A simple ActivityPub relay server built with Hono, TypeScript, and Cloudflare Workers.
This project uses pnpm workspaces monorepo structure:
packages/contract- ORPC type definitions and contracts (shared between frontend and backend)packages/relay- Backend (Cloudflare Workers)packages/frontend- Frontend (Vue 3 + Vite)
- Cloudflare account
- Node.js 18+
- pnpm 9+
- Basic post relay functionality
- HTTP Signatures
- WebFinger and NodeInfo support
- Admin dashboard (Vue 3)
- Domain rule management (whitelist/blacklist)
- Follow request management
- Queue functionality
- Rate limiting
Install the project dependencies:
pnpm installGenerate 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.pemCopy .dev.vars.example to .dev.vars and set your actual values:
cp .dev.vars.example .dev.varsEdit .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 promptedEdit 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.tomlInitialize the database schema (create a migration or execute SQL commands as needed).
Start the development server:
pnpm run devThe server will be running locally with hot-reload enabled.
Deploy your relay to Cloudflare Workers:
pnpm run deployPOST /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-unsafeSee LICENSE file for details.