はじめに
SaaSプロダクトや個人開発のサービスを運営していると、ユーザーフィードバックの管理は避けて通れない課題です。
定番ツールのCannyは使いやすい反面、2026年時点で月額$99〜$299という価格帯は、ブートストラップの個人開発者やスモールチームには重い負担です。しかもユーザー数が増えるほど費用が上がる「成功税」モデルで、プロダクトが成長するほどコストが膨らむ構造になっています。
この記事では、その代替となるOSS FeedLog のDockerセルフホスト手順を完全解説します。
FeedLogはMITライセンスのオープンソースプロジェクトで、以下の三つのモジュールを持ちます:
- Feedback — AI自動分類・重複排除付きのフィードバック収集
- Roadmap — 公開プロダクトロードマップ(ユーザー可視)
- Changelog — プロダクト更新ログ
GitHub: https://github.com/linkcraftstudio/feedlog
目次
- FeedLogの技術スタック概要
- なぜFeedLogを選んだか(Canny / UserVoiceとの比較)
- 前提条件・必要な環境
- リポジトリのクローンとディレクトリ構成
- 環境変数の設定(詳細解説)
- Dockerで起動する
- データベースマイグレーション
- 動作確認
- Nginxリバースプロキシ+HTTPS設定
- AI自動分類機能の仕組みと設定
- データバックアップの設定
- アップデート手順
- つまづきポイントとトラブルシューティング
- Vercel / Cloudflare Workersデプロイとの使い分け
- 導入後に変わったこと
1. FeedLogの技術スタック概要
デプロイ前にアーキテクチャを把握しておくと、トラブル時の判断がスムーズになります。
| レイヤー | 技術 |
|---|---|
| フロントエンド | Next.js(App Router) |
| バックエンドAPI | Hono / Node.js |
| データベース | PostgreSQL 15 |
| ORM | Prisma |
| AI分類エンジン | OpenAI API(Embeddings) |
| 認証 | NextAuth.js |
| コンテナ | Docker + Docker Compose |
| エッジデプロイ対応 | Cloudflare Workers、Vercel |
2. なぜFeedLogを選んだか
Canny・UserVoiceとの機能比較
| 機能 | FeedLog | Canny | UserVoice |
|---|---|---|---|
| フィードバック収集ボード | ✅ | ✅ | ✅ |
| ユーザー投票 / アップボート | ✅ | ✅ | ✅ |
| AI自動重複排除・分類 | ✅ ネイティブ対応 | ❌ なし | ❌ なし |
| 公開ロードマップ | ✅ | ✅ | ✅ |
| Changelog | ✅ | ✅ | ✅ |
| セルフホスト対応 | ✅ | ❌ | ❌ |
| オープンソース | ✅ MITライセンス | ❌ | ❌ |
| データ完全自己管理 | ✅ | ❌ | ❌ |
| 無料利用 | ✅(セルフホスト) | ❌ 廃止済み | ❌ |
| 月額費用目安 | 〜$8(インフラのみ) | $99〜$299 | $999〜 |
| ネイティブSlack / Jira連携 | ⚠️ 成長中 | ✅ | ✅ |
選定の判断基準
今回FeedLogを選んだ主な理由は以下の通りです:
- ユーザーフィードバックデータを自社インフラに置きたかった:フィードバックデータには製品戦略上の機密情報が含まれるため、第三者サーバーへの依存を避けたかった
- AI自動分類で優先度判断を自動化したかった:バラバラなチャンネルから来る重複フィードバックを手動タグ付けせずに整理したかった
- ユーザー増加に伴うコストスケーリングを避けたかった:成長するほど費用が増える構造を排除したかった
- MITライセンスでコードを監査・改変できること:ブラックボックスなSaaSに依存したくなかった
3. 前提条件・必要な環境
OS : Ubuntu 20.04 / 22.04 LTS(推奨)
Docker : >= 20.x
Docker Compose : >= 2.x
Git : インストール済み
空きポート : 3000(フロントエンド)、8787(API)
ドメイン : 本番運用の場合(HTTPS設定のため)
OpenAI APIキー : AI分類機能を使う場合(任意)
Dockerがインストールされているか確認:
docker --version
# Docker version 24.0.5, build ced0996
docker compose version
# Docker Compose version v2.20.2
未インストールの場合(Ubuntu):
# Dockerのインストール
curl -fsSL https://get.docker.com | sh
# 現在のユーザーをdockerグループに追加(sudoなしで実行できるようにする)
sudo usermod -aG docker $USER
newgrp docker
4. リポジトリのクローンとディレクトリ構成
git clone https://github.com/linkcraftstudio/feedlog.git
cd feedlog
ディレクトリ構成の確認:
feedlog/
├── apps/
│ ├── web/ # Next.js フロントエンド
│ └── server/ # Hono バックエンドAPI
├── docker-compose.yml
├── .env.example
├── prisma/
│ └── schema.prisma # DBスキーマ定義
└── README.md
5. 環境変数の設定(詳細解説)
.env.exampleをコピーして編集します:
cp .env.example .env
各設定項目の詳細:
# ===== データベース設定 =====
DATABASE_URL="postgresql://feedlog:your_password@db:5432/feedlog"
# Docker Composeの場合、ホスト名は"db"のまま変更不要
# your_passwordは必ず強固なパスワードに変更すること
# ===== 認証設定 =====
NEXTAUTH_SECRET="ランダムな文字列をここに入れる"
# 生成コマンド: openssl rand -base64 32
# 例: kH8mP2xQnR4vY7wZ1jF5tA9cL3bN6eS0
NEXTAUTH_URL="https://feedback.your-domain.com"
# 本番ドメインに変更必須
# ローカルテストなら: http://localhost:3000
# ===== AI機能設定 =====
OPENAI_API_KEY="sk-xxxxxxxxxxxxxxxxxxxxxxxx"
# フィードバックのAI自動分類・重複排除に使用
# 未設定でも動作するが、AI分類機能は無効になり手動分類のみになる
# ===== メール通知設定(任意) =====
SMTP_HOST="smtp.your-provider.com"
SMTP_PORT="465"
SMTP_USER="your@email.com"
SMTP_PASS="your_email_password"
NEXTAUTH_SECRETの生成コマンド:
openssl rand -base64 32
# 出力例: kH8mP2xQnR4vY7wZ1jF5tA9cL3bN6eS0
6. Dockerで起動する
設定が完了したら、一コマンドで起動します:
docker compose up -d
初回はイメージのビルド・プルが入るため、ネットワーク環境によって1〜5分かかります。
起動状態の確認:
docker compose ps
正常起動時の出力例:
NAME IMAGE STATUS PORTS
feedlog-web-1 feedlog-web Up 3 minutes 0.0.0.0:3000->3000/tcp
feedlog-server-1 feedlog-server Up 3 minutes 0.0.0.0:8787->8787/tcp
feedlog-db-1 postgres:15 Up 3 minutes 5432/tcp
三つのサービスがすべて Up になっていれば起動成功です。
ログをリアルタイムで確認する場合:
# 全サービスのログ
docker compose logs -f
# フロントエンドのみ
docker compose logs -f web
# バックエンドのみ
docker compose logs -f server
# DBのみ
docker compose logs -f db
7. データベースマイグレーション
初回起動後、DBスキーマを適用します:
docker compose exec server npx prisma migrate deploy
正常終了時の出力:
Environment variables loaded from .env
Prisma schema loaded from prisma/schema.prisma
Datasource "db": PostgreSQL database "feedlog"
1 migration found in prisma/migrations
The following migration was applied:
20250101000000_init/
All migrations have been applied.
8. 動作確認
ブラウザで以下のURLにアクセスします:
http://your-server-ip:3000
初期設定画面(管理者アカウント作成)が表示されれば、デプロイ成功です。
管理画面のURLは以下の通りです:
フィードバック管理 : http://your-server-ip:3000/dashboard
公開Roadmap : http://your-server-ip:3000/roadmap
公開Changelog : http://your-server-ip:3000/changelog
9. Nginxリバースプロキシ+HTTPS設定
本番環境ではHTTPS化が必須です。Nginxとcertbotを使った設定手順を示します。
Nginxの設定ファイル(/etc/nginx/sites-available/feedlog):
server {
listen 80;
server_name feedback.your-domain.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name feedback.your-domain.com;
ssl_certificate /etc/letsencrypt/live/feedback.your-domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/feedback.your-domain.com/privkey.pem;
# セキュリティヘッダー
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
# フロントエンドへのプロキシ
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 300s;
proxy_connect_timeout 300s;
}
# APIへのプロキシ
location /api/ {
proxy_pass http://127.0.0.1:8787;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
設定を有効化してSSL証明書を取得:
# シンボリックリンクの作成
sudo ln -s /etc/nginx/sites-available/feedlog /etc/nginx/sites-enabled/
# 設定ファイルの文法チェック
sudo nginx -t
# Nginxの再起動
sudo systemctl reload nginx
# Let's EncryptでSSL証明書を取得
sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d feedback.your-domain.com
# 自動更新の確認
sudo certbot renew --dry-run
HTTPS化が完了したら、.envのNEXTAUTH_URLもHTTPSのURLに更新して、コンテナを再起動します:
# .envを編集後
docker compose down && docker compose up -d
10. AI自動分類機能の仕組みと設定
FeedLogのAI分類は、フィードバックのテキストをOpenAI Embeddings APIで数値化し、意味的に近いフィードバックを自動クラスタリングします。
処理フロー
ユーザーがフィードバックを投稿
↓
テキストをOpenAI Embeddings APIでベクトル化
↓
既存クラスターとのコサイン類似度を計算
↓
┌─────────────────────────────────┐
│ 類似度 > しきい値 │ 類似度 ≤ しきい値 │
│ ↓ │ ↓ │
│既存クラスターに │ 新規クラスターを │
│ マージ │ 作成 │
└─────────────────────────────────┘
↓
管理画面でクラスター単位で確認・優先度設定
実際の効果例
過去3ヶ月分のフィードバック60件をインポートした際の結果:
処理前: 60件の個別フィードバック(手動タグなし)
処理後: 22のテーマクラスターに整理
├── クラスター1: 15件(同一機能要望が異なる表現で投稿)
├── クラスター2: 8件(UIの特定箇所への不満)
├── クラスター3: 6件(パフォーマンス関連)
└── ... 以下19クラスター
発見: 「たまにある要望」だと認識していた機能が
実は最多クラスター(15件)だったことが判明
→ 次スプリントの最優先タスクに変更
OpenAI API費用目安
| 月間フィードバック件数 | 概算API費用 |
|---|---|
| 〜100件 | $1未満 |
| 〜500件 | $2〜5 |
| 〜2000件 | $5〜15 |
11. データバックアップの設定
PostgreSQLの定期バックアップをcronで自動化します。
手動バックアップのコマンド:
docker compose exec -T db pg_dump -U feedlog feedlog \
> backup_$(date +%Y%m%d_%H%M%S).sql
cron設定(毎日AM2:00に自動バックアップ):
# crontabを編集
crontab -e
# 以下を追加(パスは環境に合わせて変更)
0 2 * * * cd /path/to/feedlog && \
docker compose exec -T db pg_dump -U feedlog feedlog \
> /backup/feedlog_$(date +\%Y\%m\%d).sql 2>> /var/log/feedlog-backup.log
バックアップファイルを7日分だけ保持する場合:
# crontabに追加
0 3 * * * find /backup -name "feedlog_*.sql" -mtime +7 -delete
バックアップからのリストア手順:
# DBコンテナにsqlファイルをコピー
docker cp backup_20260101_020000.sql feedlog-db-1:/tmp/
# リストア実行
docker compose exec db psql -U feedlog -d feedlog \
-f /tmp/backup_20260101_020000.sql
12. アップデート手順
FeedLogを最新版にアップデートする手順:
cd feedlog
# 最新コードを取得
git pull origin main
# コンテナを停止
docker compose down
# イメージを再ビルドして起動
docker compose up -d --build
# DBマイグレーション(スキーマ変更がある場合)
docker compose exec server npx prisma migrate deploy
# 動作確認
docker compose ps
docker compose logs -f --tail=50
13. つまづきポイントとトラブルシューティング
❶ 起動後に3000番ポートへ接続できない
# コンテナの起動状態を確認
docker compose ps
# ポートの使用状況を確認
sudo lsof -i :3000
# ファイアウォールの設定を確認(UFW使用の場合)
sudo ufw status
sudo ufw allow 3000
sudo ufw allow 8787
# コンテナを再起動
docker compose restart
❷ DBマイグレーションで "relation does not exist" エラー
# DBコンテナのログを確認
docker compose logs db
# DBが完全に起動してからマイグレーションを再実行
sleep 10 && docker compose exec server npx prisma migrate deploy
# それでも解決しない場合(データが消えるため注意)
docker compose down -v
docker compose up -d
docker compose exec server npx prisma migrate deploy
❸ AI分類が動作しない
# .envのOPENAI_API_KEYを確認
cat .env | grep OPENAI
# 環境変数を再読み込み
docker compose down && docker compose up -d
# OpenAIのAPI使用状況・残高を確認
# https://platform.openai.com/usage
❹ NEXTAUTH_URLのミスマッチエラー
本番ドメインでHTTPS設定後にログインできない場合:
# .envを確認
cat .env | grep NEXTAUTH_URL
# NEXTAUTH_URL="https://feedback.your-domain.com" になっているか確認
# 修正後、コンテナ再起動
docker compose down && docker compose up -d
❺ Nginxで502 Bad Gatewayが出る
# フロントエンドコンテナが起動しているか確認
docker compose ps
# ポートバインディングを確認
docker compose port web 3000
# Nginxのエラーログを確認
sudo tail -f /var/log/nginx/error.log
14. Vercel / Cloudflare Workersデプロイとの使い分け
FeedLogは三つのデプロイ方式に対応しています。用途に応じて選択してください。
| デプロイ方式 | 適したケース | 費用感 | 初期設定の複雑さ |
|---|---|---|---|
| Docker(本記事) | 本番運用、データ完全自己管理 | VPS費用(月$5〜10) | ⭐⭐ 中程度 |
| Vercel | 検証・個人利用、素早く試したい | 無料枠で対応可能なことが多い | ⭐ 簡単 |
| Cloudflare Workers | グローバル低レイテンシ、エッジ処理 | 無料枠が大きい | ⭐⭐ 中程度 |
本番環境でデータ自己管理を重視するならDockerが最適。
まず試したいだけなら、VercelでForkしてワンクリックデプロイが最速です。
15. 導入後に変わったこと
技術的な手順だけでなく、実際の運用変化も記録しておきます。
フィードバックの見え方が変わった
AI分類により、「個別の声」が「テーマ単位の課題」として見えるようになりました。優先度判断の根拠が「声が大きい人」から「実際の件数」に変わり、スプリント計画の品質が上がりました。
ユーザーの行動が変わった
公開Roadmapを設置してから「あの機能いつ入りますか」という問い合わせが減り、代わりにRoadmapへのコメントが増えました。ユーザーが受動的な使用者から能動的な参加者になった感覚があります。
チームの動き方が変わった
Changelogを毎リリース書くようにしたことで、「何を誰のために作ったか」を言語化する習慣ができました。ユーザーから「ちゃんと見てくれてたんですね」という反応が来たとき、フィードバックループが閉じたと実感しました。
まとめ
| 項目 | 内容 |
|---|---|
| 推奨デプロイ方式 | Docker + Docker Compose |
| 月額インフラコスト目安 | 〜$8(VPS $6 + OpenAI API $2程度) |
| Canny比較コスト削減 | 月$90〜$290相当 |
| AI分類の仕組み | OpenAI Embeddings + コサイン類似度クラスタリング |
| データ所有権 | 完全自社管理(セルフホスト時) |
| ライセンス | MIT(商用利用可・改変可) |
FeedLogはCannyの単純な代替ツールではなく、「フィードバック収集→AI整理→公開Roadmap→Changelog」というフィードバック全体のループを設計として持っているプラットフォームです。
技術スタックはモダンで、今回紹介したDockerデプロイであれば既存のサーバー運用スキルで対応できます。
Cannyの代替を検討しているチームや、自前のフィードバック管理基盤を持ちたいエンジニアに、一度試してみることをおすすめします。
関連リンク:
- 公式サイト:https://feedlog.ai/
- GitHub(⭐いただけると励みになります):https://github.com/linkcraftstudio/feedlog
デプロイ時に詰まった点やご質問があれば、コメント欄またはGitHub Issuesへどうぞ。実際の運用事例もぜひ聞かせてください。