通知基盤比較:Novu vs Ntfy vs Apprise で通知を一元管理する
オープンソースラボ編集部 ・ 2026年6月13日
通知基盤比較:Novu vs Ntfy vs Apprise で通知を一元管理する
メール・プッシュ通知・Slack・SMS・Webhookなど複数チャネルの通知を一元管理するオープンソース通知基盤は、プロダクト開発の重要なインフラです。Novu(デベロッパーファースト・マルチチャネル通知プラットフォーム)・Ntfy(HTTP PUBSUBシンプル通知)・Apprise(Python通知ライブラリ・100+チャネル対応)の3つが2026年のOSS通知ツールの主要選択肢です。
通知基盤を自前で持つ理由
- コスト削減: Twilio($0.0075/SMS)・SendGrid($14.95/月〜)→セルフホストで大幅削減
- 通知チャネル統合: メール・Slack・Discord・LINE・プッシュを1つのAPIで管理
- 監査ログ: 誰に何の通知がいつ届いたかを完全追跡
- レート制限・抑制: 通知の重複配信・過剰通知をコード不要でコントロール
主要ツールの概要
Novu
2022年公開、TypeScript製のOSSです。GitHubスター36k+。メール・SMS・プッシュ通知・Slack・Discord・Webhook等20+チャネルを統合管理するオープンソース通知インフラプラットフォームで、ノーコードワークフロービルダー・通知履歴・サブスクリプション管理・テンプレートエンジンを提供します。
# docker-compose.yml: Novu(Community)
version: "3.8"
services:
novu-api:
image: ghcr.io/novuhq/novu/api:latest
restart: unless-stopped
ports:
- "3000:3000"
environment:
NODE_ENV: production
API_ROOT_URL: https://novu-api.example.com
FRONT_BASE_URL: https://novu.example.com
MONGO_URL: mongodb://novu:${MONGO_PASS}@mongo:27017/novu
REDIS_HOST: redis
REDIS_PORT: 6379
JWT_SECRET: ${JWT_SECRET}
STORE_ENCRYPTION_KEY: ${ENCRYPTION_KEY}
NEW_RELIC_ENABLED: "false"
depends_on: [mongo, redis]
novu-worker:
image: ghcr.io/novuhq/novu/worker:latest
environment:
NODE_ENV: production
MONGO_URL: mongodb://novu:${MONGO_PASS}@mongo:27017/novu
REDIS_HOST: redis
REDIS_PORT: 6379
JWT_SECRET: ${JWT_SECRET}
STORE_ENCRYPTION_KEY: ${ENCRYPTION_KEY}
novu-web:
image: ghcr.io/novuhq/novu/web:latest
ports:
- "4200:4200"
environment:
REACT_APP_API_URL: https://novu-api.example.com
mongo:
image: mongo:6
environment:
MONGO_INITDB_ROOT_USERNAME: novu
MONGO_INITDB_ROOT_PASSWORD: ${MONGO_PASS}
volumes:
- mongo_data:/data/db
redis:
image: redis:7-alpine
volumes:
mongo_data:
# Python: Novu SDK でマルチチャネル通知を送信
from novu.api import EventApi
from novu.config import NovuConfig
NovuConfig.configure('https://novu-api.example.com', 'your-api-key')
def send_order_notification(user_id: str, order_id: str, amount: float) -> dict:
'''注文完了通知をメール+Slackで同時送信(Novuワークフロー経由)'''
event_api = EventApi()
result = event_api.trigger(
name='order-completed', # Novuダッシュボードで定義したワークフロー名
recipients=user_id, # Novu subscriber_id
payload={
'order_id': order_id,
'amount': f'¥{amount:,.0f}',
'delivery_date': '2026-06-20',
},
)
return result.data
def bulk_notify_users(user_ids: list, message: str, workflow: str) -> list:
'''複数ユーザーへの一括通知送信'''
event_api = EventApi()
results = []
for uid in user_ids:
r = event_api.trigger(name=workflow, recipients=uid, payload={'message': message})
results.append({'user_id': uid, 'status': r.data.get('status')})
return results
Ntfy
2021年公開、Go製のOSSです。GitHubスター19k+。HTTP PUBSUBプロトコルでシンプルなプッシュ通知を実現するOSSツールで、curl -d "デプロイ完了" ntfy.sh/mytopicのようなシンプルなHTTP POSTで任意のデバイス・サービスにプッシュ通知を送信できます。Androidアプリ・iOS・Webブラウザ通知対応。
# docker-compose.yml: Ntfy(セルフホスト)
version: "3.8"
services:
ntfy:
image: binwiederhier/ntfy:latest
restart: unless-stopped
ports:
- "80:80"
volumes:
- ntfy_cache:/var/cache/ntfy
- ntfy_etc:/etc/ntfy
command: serve
environment:
TZ: Asia/Tokyo
# Python: Ntfy でCI/CD完了通知・サーバー監視アラートを送信
import requests
import subprocess
NTFY_URL = 'https://ntfy.example.com'
TOPIC = 'myserver-alerts'
def notify(message: str, title: str = 'Alert', priority: str = 'default',
tags: list = None) -> requests.Response:
'''Ntfyでプッシュ通知を送信(スマホアプリに即時配信)'''
return requests.post(
f'{NTFY_URL}/{TOPIC}',
data=message.encode('utf-8'),
headers={
'Title': title,
'Priority': priority, # 'min'|'low'|'default'|'high'|'max'
'Tags': ','.join(tags or []),
'Actions': 'view, 詳細確認, https://grafana.example.com',
},
)
def monitor_disk_usage(threshold_pct: float = 90.0) -> None:
'''ディスク使用率が閾値を超えたらNtfyでアラート送信'''
result = subprocess.run(['df', '-h', '/'], capture_output=True, text=True)
for line in result.stdout.split('
')[1:]:
parts = line.split()
if parts and parts[4].endswith('%'):
usage = float(parts[4].rstrip('%'))
if usage >= threshold_pct:
notify(
f'ディスク使用率: {usage}% ({parts[3]}空き)',
title='ディスク容量警告',
priority='high',
tags=['warning', 'hard_drive'],
)
Apprise
2017年公開、Python製のOSSです。GitHubスター12k+。100+の通知サービス(Slack・Discord・LINE・Telegram・メール・SMS・プッシュ等)を統一APIで呼び出せるPython通知ライブラリで、セルフホストWebサービスとしても動作します。設定はapprise://スキーマのURLで統一管理できます。
# Python: Apprise で複数チャネルに通知(1行で100+サービス対応)
import apprise
def setup_notification_channels() -> apprise.Apprise:
'''Appriseで複数の通知チャネルを設定'''
ap = apprise.Apprise()
# Slack通知
ap.add('slack://tokenA/tokenB/tokenC/#general')
# Discord Webhook
ap.add('discord://webhook-id/webhook-token/')
# メール(SMTP)
ap.add('mailtos://user:pass@smtp.gmail.com/?to=admin@example.com&from=noreply@example.com')
# LINE Notify
ap.add('line://your-line-notify-token/')
# Telegram
ap.add('tgram://bot-token/chat-id/')
# Ntfy(セルフホスト)
ap.add('ntfy://ntfy.example.com/myserver-alerts/')
return ap
def send_deploy_alert(version: str, status: str) -> bool:
'''デプロイ完了/失敗アラートを全チャネルに一括送信'''
ap = setup_notification_channels()
emoji = 'V' if status == 'success' else 'X'
return ap.notify(
title=f'[{emoji}] デプロイ: v{version}',
body=f'ステータス: {status}
バージョン: {version}
時刻: 現在時刻',
)
# Apprise APIサーバー(セルフホスト)でのWebhook受信
# docker run -p 8000:8000 caronc/apprise:latest
# curl -X POST http://localhost:8000/notify/mykey # -d '{"title":"Alert","body":"Server down!"}' # -H 'Content-Type: application/json'
機能比較表
| 比較項目 | Novu | Ntfy | Apprise |
|---|---|---|---|
| マルチチャネル統合 | ✅ 20+ | △ | ✅ 100+ |
| ダッシュボード | ✅ Web UI | △ | △ |
| セットアップ難易度 | 高 | ✅ 最易 | ✅ |
| SaaS代替 | SendGrid/Twilio | プッシュ通知専門 | 汎用ライブラリ |
| GitHub Stars | 36k+ | 19k+ | 12k+ |
通知基盤はDevOpsカテゴリ/categories/devopsのCI/CDパイプライン・監視(Prometheus/Grafana)と統合してデプロイ通知・アラート・インシデント通知を自動化します。その他カテゴリ/categories/miscのプロジェクト管理ツールとWebhookで連携してタスク完了・コメント追加などのイベントをSlackやメールにリアルタイム通知します。
FAQ
Q. Novuで「ユーザーが通知をオフにできる」サブスクリプション管理を実装するには?
A. NovuのSubscriber Preference APIで通知チャネル・ワークフロー別の配信設定をユーザーが管理できるUIを実装します。フロントエンド実装: ①@novu/notification-center(ReactコンポーネントまたはWeb Component)を組み込み②<NovuProvider subscriberId={userId} applicationIdentifier="your-app-id">でラップ③<NotificationCenter>コンポーネントが通知ベル・通知リスト・設定を自動レンダリング。Preference管理: Subscriber Preference APIでPUT /v1/subscribers/{subscriberId}/preferences→{channel: {email: false}}でメール通知をオフ→次回トリガー時にNovuが自動的にメールチャネルをスキップ。バックエンド: GET /v1/subscribers/{subscriberId}/preferencesで現在の設定を取得→フロントエンドのトグルUIと同期。
Q. NtfyでCI/CDパイプラインのデプロイ完了通知を設定するには?
A. GitHub Actions・GitLab CI・JenkinsのパイプラインにNtfy通知ステップを追加して、デプロイ成功/失敗をスマホにプッシュ通知します。GitHub Actions設定: .github/workflows/deploy.ymlにnotifyジョブを追加→if: always()で成功/失敗どちらでも実行→curl -d "デプロイ${{ job.status }}: ${{ github.ref }}" -H "Title: ${{ github.repository }}" -H "Priority: high" https://ntfy.example.com/ci-alerts。セルフホストNtfyのアクセストークン設定: /etc/ntfy/server.ymlにauth-file: /etc/ntfy/user.db→ntfy user add myuser→ntfy token add myuser→ActionsのSecretsにNTFY_TOKENを登録→-H "Authorization: Bearer ${{ secrets.NTFY_TOKEN }}"でセキュアな認証。
Q. Appriseで設定ファイルを使って複数プロジェクトの通知を管理するには?
A. Appriseの設定ファイル(YAML/TEXT形式)で通知先チャネルをプロジェクト別に管理してコードから分離します。設定ファイル(~/.apprise/apprise.yml): version: 1→urls:以下にURLスキーマを一覧。読み込み: ap = apprise.AppriseConfig()→ap.add('~/.apprise/apprise.yml')→a = apprise.Apprise()→a.add(ap)。タグ管理: URLにtag: production・tag: devを付与→a.notify("メッセージ", tag="production")で本番環境の通知チャネルのみに送信。Apprise APIサーバー: docker run -p 8000:8000 -v ~/apprise:/config caronc/apprise:latest→curl -X POST http://localhost:8000/notify/config-key -d '{"title":"Deploy Done","body":"v1.2.3"}'でWebhookから複数チャネルに同時通知。
Q. NovuとAppriseをどのように使い分けるべきですか?
A. プロダクトのユーザー向け通知基盤にはNovu、インフラ・運用・開発ツールの通知自動化にはApprise、シンプルなプッシュ通知・モバイル連携にはNtfyが適しています。Novu優位: ①ユーザーへの通知(注文確認・アカウント変更・マーケティング)を一元管理②Webダッシュボードで通知テンプレートを非エンジニアが編集③通知履歴・開封率・エラーをダッシュボードで可視化④購読管理(ユーザー自身が通知をオフにできる)。Apprise優位: ①cronやスクリプトから1行で100+サービスに通知→コード量最小②CI/CD通知・サーバー監視アラート・バッチ処理完了通知→開発・運用用途に最適③設定ファイルでチャネルを一元管理→セキュリティキーをコードに書かない。Ntfy優位: ①自前のプッシュ通知サーバーを最短構築→スマホアプリで受信②LINE/Slackなど外部サービス依存なし→完全自己完結した通知基盤③HTTP POSTのみで通知→シェルスクリプトからも簡単利用。
まとめ
| ユースケース | 推奨ツール |
|---|---|
| プロダクトのユーザー通知基盤 | Novu |
| シンプルなプッシュ通知・インフラ監視 | Ntfy |
| 100+チャネル統合・Python自動化 | Apprise |