0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

OSSでCanny代替!FeedLogをDockerでセルフホストしてAI駆動のユーザーフィードバック管理システムを構築する完全ガイド

0
Posted at

はじめに

SaaSプロダクトや個人開発のサービスを運営していると、ユーザーフィードバックの管理は避けて通れない課題です。

定番ツールのCannyは使いやすい反面、2026年時点で月額$99〜$299という価格帯は、ブートストラップの個人開発者やスモールチームには重い負担です。しかもユーザー数が増えるほど費用が上がる「成功税」モデルで、プロダクトが成長するほどコストが膨らむ構造になっています。

この記事では、その代替となるOSS FeedLog のDockerセルフホスト手順を完全解説します。

FeedLogはMITライセンスのオープンソースプロジェクトで、以下の三つのモジュールを持ちます:

  • Feedback — AI自動分類・重複排除付きのフィードバック収集
  • Roadmap — 公開プロダクトロードマップ(ユーザー可視)
  • Changelog — プロダクト更新ログ

GitHub: https://github.com/linkcraftstudio/feedlog

目次

  1. FeedLogの技術スタック概要
  2. なぜFeedLogを選んだか(Canny / UserVoiceとの比較)
  3. 前提条件・必要な環境
  4. リポジトリのクローンとディレクトリ構成
  5. 環境変数の設定(詳細解説)
  6. Dockerで起動する
  7. データベースマイグレーション
  8. 動作確認
  9. Nginxリバースプロキシ+HTTPS設定
  10. AI自動分類機能の仕組みと設定
  11. データバックアップの設定
  12. アップデート手順
  13. つまづきポイントとトラブルシューティング
  14. Vercel / Cloudflare Workersデプロイとの使い分け
  15. 導入後に変わったこと

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化が完了したら、.envNEXTAUTH_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の代替を検討しているチームや、自前のフィードバック管理基盤を持ちたいエンジニアに、一度試してみることをおすすめします。

関連リンク:

デプロイ時に詰まった点やご質問があれば、コメント欄またはGitHub Issuesへどうぞ。実際の運用事例もぜひ聞かせてください。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?