お客様との不具合・要望のやり取りに使う課題管理ツール「ムシトリ」を作り、オープンソース(MITライセンス)で公開した。名前は「バグ(ムシ)取り」から。
GitHub で見る
画面の会社名・人名・課題はすべて架空。
■背景と目的
- お客様とのやり取りで使うツールを探していた。不具合の報告を受けて、状態を管理しながら返事をする、という用途
- Redmineは設置の手間が大きい。Rubyの実行環境から整える必要がある
- Backlogは機能が多く、いちばん安いプランでも月額の費用が負担に感じた
- 使いたいのは不具合のやり取りの部分だけだったので、そこだけに絞って作った
■できること
- お客様がスクリーンショットを貼り付けて起票する。Ctrl+Vでの貼り付け、ドラッグ&ドロップ、スマホは写真を選ぶ
- 種別(不具合・要望・質問)を選ぶと、「操作手順」「期待する動作」「実際の動作」などの記入欄が本文に入る。何を書けばよいか、お客様が迷わない
- 状態は「未対応→処理中→処理済み→完了」の4つ。担当者・優先度・期限日を変えると、コメントと一緒に履歴が残る
- 起票やコメントがあると、関係者にメールで知らせる
- 社内用とお客様用で、画面もログインも分けた。お客様には自社のプロジェクトしか見えない
- スマホでは、一覧が表からカードに変わる
■作りで決めたこと
- お客様にはパスワードを持たせない。メールアドレスを入れると6桁の認証コードが届き、それでログインする。パスワードを忘れた、という問い合わせがなくなる
- お客様に見せてはいけない課題は、「権限がありません」ではなく「ページが見つかりません」にした。他社の課題がそこにあること自体を知らせないため
- 同じブラウザで社内用とお客様用の両方にログインしていても、片方のログアウトでもう片方が切れないようにした
- 画面は外部のサイトを読み込まない。Bootstrapやフォントも同梱し、CDNを使っていない
- そのため、セキュリティ設定(CSP)は
default-src 'self' の厳しい内容のまま動く。インラインのスクリプトやスタイルも使っていない
- 設置したあとは、インターネットにつながらない社内LANでも画面が動く。ただし、インストールと更新(git clone・composer)にはインターネット接続が、メールでの通知には送信に使うメールサーバーが要る
- 大きな写真はブラウザ側で縮小してから送る。長辺2560pxを超える画像は縮めるが、スクリーンショットの文字はつぶさないようにした
- 社内用画面のURLは、推測されにくい文字列にできる
■設置
- SSHでログインしてコマンドを実行できるサーバーが必要。VPSやクラウド、SSHが使えるレンタルサーバー
install.sh を実行して質問に答えると、データベースの作成、メール送信の設定、最初の管理者の登録まで進む。Nginxの設定とcron(毎日のバックアップ)も作れる
- データベースはMySQLかSQLite。少人数ならSQLiteで、データベースの準備も要らない
- アップデートは
update.sh 1つ。更新前に自動でバックアップを取り、失敗したら更新を止める
■公開の方針
- ライセンスはMIT。社内で使うのも、手を加えるのも自由
- 不具合の報告・要望はGitHubのIssuesで受け付ける。プルリクエストは当面受け付けていない
- 設置の代行や機能の追加は、お問い合わせから相談を受けている
■技術構成
- PHP 8.3以上、Laravel 13、MySQL 8.0またはSQLite、Nginx + PHP-FPM
- 画面はBladeとAlpine.js(CSP対応版)。ビルドの工程はない
- メール送信はSMTPかAmazon SES
- 自動テストはPest
■課題
- 画面と説明は日本語だけ。英語は要望があれば考える
- SSHが使えない共用のレンタルサーバーには置けない
- ガントチャート、Wiki、作業時間の記録などはない。入れると、絞った意味がなくなる
■所感
- 機能を足すより、お客様に迷わせない方に時間を使った。記入欄のテンプレート、パスワードなしのログイン、見えてはいけない物は存在ごと隠す、といった部分
- これからお客様とのやり取りで使っていき、使いにくい所は直していく