Threads Analytics は PostgreSQL データベースを使う Next.js アプリです。自分で管理するサーバーなら、Docker Compose がいちばん手軽です。ファイル 1 つでアプリとデータベースをまとめて起動できます。ビルド済みの Docker イメージを既存のデータベースにつないで動かすことも、ソースからビルドすることも、Vercel にデプロイして Cron ジョブで同期することもできます。このページでは、それぞれに必要なもの、投稿を自動で同期し続ける方法、更新の手順をまとめます。

手作業で設定したくない場合は、Railway・Vercel 向けのワンクリックテンプレートとエージェント用プロンプトがすべて代わりに行います。

必要なもの

  • PostgreSQL データベース。マネージドサービスでも自分のサーバー上のものでもかまいません。アプリが使うのは接続文字列だけです。Docker Compose なら一緒に用意されます。
  • アプリを動かす場所。Docker イメージ(amd64 または arm64)を実行できるサーバー、Vercel、または Node.js 22.12 以上か 24 以上が入ったマシン。
  • Threads アクセストークン。デプロイ後にダッシュボードで貼り付けます。取得方法はトークンガイドで解説しています。

環境変数

どの方法で動かす場合も、次の変数を設定します。Docker なら env ファイル、Vercel ならプロジェクト設定、ソースから動かすなら .env.local に書きます。

変数必須用途
APP_PASSWORDはいダッシュボードにログインするためのパスワード。
DATABASE_URLはいPostgreSQL の接続文字列。
TOKEN_ENCRYPTION_KEYはいデータベースに保存する Threads アクセストークンを暗号化します。openssl rand -hex 32 で生成できます。
SYNC_SCHEDULER_ENABLEDいいえtrue にすると内蔵の同期スケジューラが起動します。Docker・VPS・Railway では設定し、Vercel では設定しません。
CRON_SECRETいいえCron ジョブが同期のために呼び出す /api/cron/sync を保護します。Vercel では必須です。

Docker や VPS 向けの env ファイルは、たとえば次のようになります。

APP_PASSWORD=choose-a-long-password
DATABASE_URL=postgresql://user:password@your-db-host:5432/threads_analytics
TOKEN_ENCRYPTION_KEY=paste-the-output-of-openssl-rand-hex-32
SYNC_SCHEDULER_ENABLED=true

Docker Compose

リポジトリの docker-compose.yml は、ダッシュボードを専用の PostgreSQL と一緒に起動します。先にデータベースを用意する必要はありません。サーバー上の空のフォルダでファイルをダウンロードし、隣に .env を作ります。

curl -fsSLO https://raw.githubusercontent.com/ridemountainpig/threads-analytics/main/docker-compose.yml
cat > .env <<EOF
APP_PASSWORD=$(openssl rand -hex 12)
TOKEN_ENCRYPTION_KEY=$(openssl rand -hex 32)
POSTGRES_PASSWORD=$(openssl rand -hex 16)
EOF
grep APP_PASSWORD .env
docker compose up -d

grep で表示される APP_PASSWORD がサインイン用のパスワードなので、控えておいてください。自分で決めたい場合は .env を書き換えて、もう一度 docker compose up -d を実行します。Compose はデータベースの準備を待ってマイグレーションを実行し、ポート 3000 でダッシュボードを提供します。同期スケジューラも最初からオンなので、DATABASE_URL と SYNC_SCHEDULER_ENABLED を自分で設定する必要はありません。.env に書いたほかの変数(CRON_SECRET など)もアプリに渡されます。

投稿とアカウントは postgres-data ボリュームに保存され、再起動や更新をしても残ります。サーバーのログは docker compose logs -f app で確認できます。

Docker

すでに PostgreSQL があり、アプリのコンテナだけを動かす場合は、GitHub Container Registry で amd64 と arm64 向けに公開されているイメージを使います。変数を .env.local に書いてから起動します。

docker run -d --name threads-analytics --restart unless-stopped \
  -p 3000:3000 --env-file .env.local \
  ghcr.io/ridemountainpig/threads-analytics:latest

コンテナは起動のたびに未適用のデータベースマイグレーションを実行してから、ポート 3000 でダッシュボードを提供します。HTTPS で公開するには、前段にリバースプロキシを置いてください。

イメージを自分でビルドする場合は、リポジトリをクローンしたディレクトリで次を実行します。

docker build -t threads-analytics .
docker run -d --name threads-analytics --restart unless-stopped \
  -p 3000:3000 --env-file .env.local threads-analytics

ソースから実行

Node.js 22.12 以上か 24 以上と、pnpm が必要です。

git clone https://github.com/ridemountainpig/threads-analytics.git
cd threads-analytics
pnpm install
pnpm prisma:generate
cp .env.example .env.local  # 続けて環境変数を設定
pnpm build
pnpm start

pnpm start は未適用のマイグレーションを実行してから、ポート 3000 でサーバーを起動します。常駐させるには systemd や pm2 などのプロセスマネージャーを使います。

Vercel

Vercel ではリクエストの合間にプロセスを動かし続けられないため、内蔵の同期スケジューラは動きません。代わりに Vercel Cron Jobs から /api/cron/sync を定期的に呼び出して同期します。

Vercel エージェントデプロイガイドでは、Vercel MCP を通じてビルド済みイメージをデプロイし、Neon データベース、環境変数、この Cron ジョブまでまとめて設定します。Cron ジョブを自分で追加する場合は、プロジェクトのルートに vercel.json を置きます。

{
  "crons": [{ "path": "/api/cron/sync", "schedule": "0 0 * * *" }]
}

続いて、プロジェクトの環境変数に CRON_SECRET を追加します。Vercel は Cron の実行ごとに Authorization: Bearer <CRON_SECRET> を付けて呼び出し、これがないリクエストはエンドポイントが拒否します。

Hobby プランでは Cron ジョブは 1 日 1 回までしか実行できないため、毎日 1 回のスケジュールのままにしてください。有料プランなら、設定画面で選んだ同期間隔に合わせてもっと頻繁に実行できます。

投稿を同期し続ける

同期間隔を選ぶまで、自動同期はオフのままです。デプロイ後、ダッシュボードの設定 → 自動同期で頻度を選びます。1 時間ごと、6 時間ごと、毎日、または任意の分数を指定できます。同期のたびに、表示中のアカウントだけでなく接続済みのすべてのアカウントが対象になります。

同期を動かす仕組みは、アプリを動かす場所によって変わります。

  • Docker・VPS・Railway:SYNC_SCHEDULER_ENABLED=true を設定します(Docker Compose では設定済み)。スケジューラはサーバーとともに起動し、同期の時期が来たアカウントを定期的に確認します。
  • Vercel:上記の Cron ジョブを使います。
  • そのほかの環境:どのスケジューラからでも、CRON_SECRET を付けてエンドポイントを呼び出せます。
curl -fsS -H "Authorization: Bearer $CRON_SECRET" https://analytics.example.com/api/cron/sync

同期間隔より頻繁に呼び出しても問題ありません。まだ時期が来ていないアカウントはスキップされます。

更新

新しいバージョンは新しい Docker イメージとして公開され、データベースマイグレーションも起動時に自動で実行されます。そのため、更新に必要なのは新しいイメージかコードを取得することだけです。投稿・インサイト・アカウントはデータベースにそのまま残ります。

Docker Compose では、docker-compose.yml のあるフォルダで次を実行します。

docker compose pull
docker compose up -d

Docker だけで動かしている場合は、新しいイメージを取得し、同じオプションでコンテナを作り直します。

docker pull ghcr.io/ridemountainpig/threads-analytics:latest
docker rm -f threads-analytics
docker run -d --name threads-analytics --restart unless-stopped \
  -p 3000:3000 --env-file .env.local \
  ghcr.io/ridemountainpig/threads-analytics:latest
  • ソースから実行:git pull のあと pnpm install、pnpm prisma:generate、pnpm build を実行し、pnpm start で再起動します。
  • Railway:Railway のダッシュボードから再デプロイします。
  • Vercel:プロジェクトを再デプロイします。

デプロイしたら

  1. アプリを開き、APP_PASSWORD でログインします。
  2. 設定 → Threads アカウントを追加でアクセストークンを貼り付けます。最初の同期はすぐに始まり、数分かかることがあります。
  3. 設定 → 自動同期で同期間隔を選びます。

Claude などの AI エージェントからデータを調べたい場合は、内蔵の MCP サーバー(/api/mcp)に接続してください。