ReLINEは、休眠状態のグループチャットを活性化するインテリジェントなLINE Botサービスです。かわいい猫のマスコットが魅力的なメッセージを送信します。LINEグループが一定期間非アクティブになると、Botが自動的に会話のきっかけとなるメッセージを送信し、メンバーの再参加とコミュニティの交流を促進します。
④の管理ダッシュボードに表示している数値・グループ名は画面イメージ用のサンプルです。
各項目の詳細は以下のセクションで説明します。
- 🤖 自動グループ監視 - グループの活動を追跡し、休眠状態を検出
- 💬 スマートメッセージ配信 - 最適なタイミングで文脈に応じた会話のきっかけを送信
- 📊 管理ダッシュボード - グループの管理とエンゲージメント指標の監視
- 🔐 セキュアな認証 - ロールベースの権限による保護された管理者アクセス
- 📱 PWA対応 - インストール可能・オフライン対応のWebフロントエンド
- 📈 可観測性 - ヘルスチェック / Prometheusメトリクス / 構造化ログ
| Webランディングページ | QRコード画面 | LINEアプリ連携 |
|---|---|---|
![]() |
![]() |
![]() |
| マスコットと「友だち追加」ボタンのあるメインランディングページ | PC用QRコード表示 | モバイルアプリ連携画面 |
| 技術 | バージョン | 用途 |
|---|---|---|
| 4.0.5 | コア言語 | |
| 8.1.3 | Webフレームワーク | |
| 8.0+ | データベース(全環境) | |
| 2.x | メッセージング連携 |
- 認証 - Rails 8
has_secure_password- bcryptによるセキュアな管理者ログイン - 認可 -
pundit- ポリシーベースのアクセス制御 - レート制限 -
rack-attack- ブルートフォース攻撃対策とリクエストスロットリング - メッセージング -
line-bot-api- LINE Messaging API連携 - 監視 -
prometheus-client- メトリクス収集と監視 - ログ -
lograge- リクエストIDつき構造化ログ
- テストフレームワーク -
rspec-rails- 包括的なテストスイート - ブラウザ自動化 -
selenium-webdriver- ヘッドレスChromeによるシステムテスト - コード品質 -
rubocop(Rails、Performance、RSpec拡張付き) - テストデータ -
factory_bot_rails、faker- ファクトリとフィクスチャ生成 - セキュリティ -
brakeman、bundler-audit- セキュリティ脆弱性スキャン - カバレッジ -
simplecov-COVERAGE=trueまたはCI=trueでの実行時に計測し、行・ブランチともに100%を必須とする
| 技術 | 用途 |
|---|---|
| レスポンシブUIフレームワーク | |
| クライアントサイドインタラクティビティ | |
| JavaScriptフレームワーク | |
| SPA風ナビゲーション | |
| Service Workerモジュールのユニットテスト |
- JSバンドル -
jsbundling-rails(esbuild使用) - CSSバンドル -
cssbundling-rails(Bootstrap使用) - アセット配信 -
propshaft- モダンなアセットパイプライン
単一のエンドポイントで複数のLINE Messaging APIイベントを処理します。
LINE SDK(line-bot-api v2)に触れる箇所はLineMessagingへ寄せ、コントローラーは受け口に徹しています。
| クラス / モジュール | 責務 |
|---|---|
CatLineBot |
Webhookイベントの振り分け |
LineMessaging |
LINE Messaging APIとのやり取り(送信・退出・人数取得) |
MessageEvent |
メッセージイベントの処理(合言葉への応答・1対1トーク) |
LineGroup |
グループの記録と、次に働きかける日の管理 |
Scheduler |
定期的な働きかけの組み立て |
LineReminderJob / LineWelcomeMessageJob |
LINEへの送信(通信エラー時は指数バックオフで再試行) |
ErrorSanitizer |
ログ・通知からの資格情報の除去 |
Webhookの署名検証とイベントのパースは、SDKのLine::Bot::V2::WebhookParserがまとめて担当します。
グループのメンバー数はRails.cacheに短時間だけ保持し、イベントごとの問い合わせを抑えています。
Sorceryからの移行後、認証はRails 8標準のhas_secure_passwordで構成されています。
Authentication- ログイン・ログアウトとログイン状態の保持(コントローラーconcern)BruteForceProtection- 失敗回数によるアカウントロック(モデルconcern)Operator-normalizesによるメールアドレスの正規化と、パスワードの複雑性検証
Webフロントエンドはインストール可能なPWAとして動作します。
- Service Worker -
app/javascript/serviceworker.js(esbuildでpublic/serviceworker.jsへバンドル) - キャッシュ戦略 -
cache-first/network-first/network-onlyをStrategyRouterが振り分け - 設定の外部化 -
config/pwa_config.ymlで環境ごとのキャッシュ戦略・マニフェストを定義し、GET /api/pwa/configで配信 - マニフェスト -
GET /manifest.jsonをI18n対応で動的生成 - オフライン表示 -
public/offline.html - クライアント計測 -
POST /api/client_logs・POST /api/metricsでブラウザ側のログ/メトリクスを収集
| エンドポイント | 用途 |
|---|---|
GET /health |
Liveness用の軽量チェック |
GET /health/deep |
DB接続とディスク空き容量を含む詳細チェック |
GET /health/ready |
Readiness用のDB接続チェック |
GET /metrics |
Prometheusテキスト形式のメトリクス(本番はBasic認証) |
- RSpec - モデル / コントローラー / ジョブ / リクエスト / システムスペックを網羅
- SimpleCov -
COVERAGE=trueまたはCI=trueでの実行時のみ計測され、行・ブランチともに100%を下回るとテストが失敗(通常のbundle exec rspecでは計測されません) - Selenium - ヘッドレスChromeによるシステムテスト
- Jest - Service Workerモジュール(
app/javascript/pwa/**)のユニットテスト
テストコマンドやカバレッジ設定の詳細はTESTING.mdを参照してください。
- Docker & Docker Compose
- LINE開発者アカウント(こちらで作成)
- リポジトリをクローン
git clone https://github.com/Tsuchiya2/ReLINE.git
cd ReLINE- 環境変数と資格情報を設定
.env.exampleをコピーして.envを作成します。
cp .env.example .envLINEのチャネル情報やWebhookのコールバックパスはRailsの暗号化credentialsで管理します。
config/routes.rbがcredentials.callback_routeを参照するため、アプリケーションを起動する前に設定してください。
まだコンテナを起動していないため、execではなくrun --rmでワンショット実行します。
docker compose run --rm -e EDITOR=vi web bin/rails credentials:editすでに
docker compose upでコンテナが起動している場合はdocker compose exec -e EDITOR=vi web bin/rails credentials:editでも編集できます。
必要なキーは以下のとおりです。
# LINE Messaging API
channel_secret: YOUR_CHANNEL_SECRET # Webhookの署名検証に使用
channel_token: YOUR_CHANNEL_TOKEN # チャネルアクセストークン
callback_route: your_webhook_path # POST /operator/<callback_route> になります
# db:seed で使用する初期データ
guest:
email: guest@example.com
password: your_guest_password
operator:
email: operator@example.com
password: your_operator_password
content:
movie: https://example.com/movie
alarmcontent:
url: https://example.com/alarm
# 本番のメール送信(config/environments/production.rb)
gmail:
user_name: your_email@gmail.com
password: your_app_password- アプリケーションを起動
docker compose upこれにより:
- MySQL 8.0データベースコンテナが起動
- Railsアプリケーションがビルドされ起動
- http://localhost:3000でアプリが実行
- データベースを準備
docker compose exec web bin/rails db:create db:schema:load
docker compose exec web bin/rails db:seed便利なDockerコマンド:
# バックグラウンドで起動
docker compose up -d
# ログを表示
docker compose logs -f web
# Railsコンソールを実行
docker compose exec web bin/rails console
# コンテナを停止
docker compose down
# Gemfile/package.json変更後に再ビルド
docker compose build
# テストを実行
docker compose exec web bundle exec rspec
# カバレッジ付きでテストを実行
docker compose exec web bash -c "COVERAGE=true bundle exec rspec"
# システムテストのみを実行
docker compose exec web bundle exec rspec spec/system
# JavaScript(Service Worker)のテストを実行
docker compose exec web npm test
# コード品質チェック
docker compose exec web bundle exec rubocop
# セキュリティ監査
docker compose exec web bundle exec brakeman
docker compose exec web bundle exec bundler-audit
# ルートを表示
docker compose exec web bin/rails routes詳細なテストコマンドとオプションはTESTING.mdを参照してください。
グループへの働きかけはRakeタスクとして提供されています。cronなどのスケジューラから実行してください。
# 短いスパンでの働きかけ(Scheduler.call_notice)
docker compose exec web bin/rails call_notice:call_reminds
# 不定期な働きかけ(Scheduler.wait_notice)
docker compose exec web bin/rails wait_notice:wait_remindsLINE Messaging APIのWebhookは、メッセージ・参加・退出・フォローなど複数の種類のイベントを単一のエンドポイントへ送ります。それぞれ処理が異なるうえ、LINEへの応答は速やかに返す必要があります。
解決策:
- 振り分けと送信の分離 -
CatLineBotがイベントの種類を判定し、LINEへの送信はLineReminderJob/LineWelcomeMessageJobへ委譲。Webhookの応答が外部APIの応答時間に引きずられないようにしています - SDKに触れる箇所の集約 -
Line::Bot::V2::*を直接扱うのはLineMessagingだけに限定し、SDKの変更の影響範囲を閉じ込めています - 失敗への備え - 通信エラーはActiveJobの
retry_onで指数バックオフ再送。処理できなかったイベントは、資格情報を伏せたうえで運用者へメール通知します - Railsの語彙で表現する - モデル・concern・ジョブといったRails標準の置き場に収め、独自のレイヤーを増やさない構成にしています
このアーキテクチャは以下を通じて形になりました:
- 経験豊富なエンジニアからのフィードバック
- 「パーフェクトRuby on Rails」のベストプラクティスの学習
- Fat ControllerとFat Modelの両方を避けるための反復的なリファクタリング
- 厳格なRubocop準拠と、行・ブランチともに100%のテストカバレッジ
- TESTING.md - テストの実行方法とカバレッジ方針
- spec/system/PWA_TESTING_README.md - PWAシステムテストのガイド
- spec/javascript/README.md - Service WorkerのJestテストガイド
コントリビューションを歓迎します!お気軽にプルリクエストを送信してください。
- リポジトリをフォーク
- フィーチャーブランチを作成(
git checkout -b feature/amazing-feature) - 変更をコミット(
git commit -m 'Add some amazing feature') - ブランチにプッシュ(
git push origin feature/amazing-feature) - プルリクエストを開く
Tsuchiya Yuji
- GitHub: @Tsuchiya2
- Qiita: @Tsuchiya2








