TraderMemos

FAQ とトラブルシューティング

セルフホストを始めた人が実際につまずくポイントへの回答 — ログイン、CORS、ポート、アップロード、データ。

セットアップとログイン

ログイン画面に「Could not reach API — check Server URL」と表示される

SPA が API に到達できていません。Docker 一体型構成の場合は、サーバー欄を空のままに してください(UI は同一オリジンの /api/v1 を使います)。CDN + API 分離構成の場合は、 サーバー欄に API のオリジン(例: https://api.example.com)を設定します — /api/v1 は 自動的に付加されます。

セットアップウィザードが表示されない/「setup already complete」と出る

ウィザードはデータベースにユーザーが 1 人もいない場合にのみ表示されます。ユーザーが存在する 場合は通常どおりサインインしてください。完全にゼロから始めるにはデータボリュームを削除する必要が あります(docker compose down -v — これはジャーナルを削除します)。

なぜ他の人が登録できないのですか?

仕様です。オーナー作成後は、TM_ALLOW_REGISTRATION=true を設定しない限り POST /auth/register は 403 を返します。管理者は CLI からユーザーを追加することもできます。 docker compose exec api /tradermemos create-user --email … --password …

パスワードが拒否される

パスワードは10 文字以上である必要があります。

パスワードを忘れた

セルフサービスのリセット機能はありません(サーバーにメール送信手段がないため)。API コンテナ内の管理 CLI でリセットしてください:

docker compose exec api /tradermemos reset-password --email you@example.com --password '…'

サーバーとデプロイ

API が「insecure JWT secret」と表示して起動しない

意図された動作です。実運用のシークレットを設定してください (TM_JWT_SECRET=$(openssl rand -hex 32))。使い捨てのローカル実行に限っては TM_ALLOW_INSECURE_JWT=true も使えます(同梱の Compose は初回起動の利便性のためにこれを 設定しています。本番では解除してください)。

ポート 3000(または 8080)がすでに使用中

docker-compose.yml のホスト側ポートマッピングを変更してください(例: web"3001:80")。 API 自身のポートは TM_HTTP_PORT です。

ブラウザのコンソールに CORS エラーが出る

CORS が必要なのは分離構成(UI と API が別オリジン)だけです。API 側の TM_CORS_ORIGINS に SPA のオリジンを正確に設定してください — https://*.vercel.app のようなワイルドカードも使えます。 同一オリジン構成(Docker 一体型、エッジリライト)では空のままにしてください。

API を Vercel や Cloudflare Workers で動かせますか?

いいえ。Go + SQLite + ファイルアップロードという構成のため、実ディスクが必要です。API は Docker、 VPS、NAS、または Railway(ボリューム付き)でホストしてください。ワンクリックボタンがデプロイ するのはWeb UI のみです。 フォークしてデプロイを参照してください。

私のデータは正確にはどこにありますか?

Docker の場合は tm_data ボリュームの中です — /data/tradermemos.db/data/attachments。 このボリュームがあなたのジャーナルそのものです。 バックアップと復元を参照してください。

SQLite と Postgres のどちらを選ぶべきですか?

個人インスタンスには SQLite(既定)が適しています — 余計な構成要素がなく、バックアップ対象は 1 ファイルだけです。Postgres(make up-postgres)は複数ユーザーや既存インフラがある構成に 向いています。両者間の移行は、ZIP でエクスポートして再インポートするだけです。

機能について

アップロードが 413 で失敗する

ファイルが上限を超えています。API 側の上限は既定でそれぞれ 10 MiB です (TM_ATTACH_MAX_BYTESTM_IMPORT_MAX_BYTESTM_OCR_MAX_BYTES)。同梱の nginx は 20 MB まで許可しています。該当する上限と、リバースプロキシの client_max_body_size を引き上げてください。 設定を参照してください。

同じファイルを 2 回インポートしてしまいました — 重複しますか?

いいえ。約定は「銘柄 + 売買方向 + 数量 + 価格 + タイムスタンプ」で重複排除され、重複分は スキップとして数えられます。誤ったインポートは、インポートページからバッチ単位で取り消すことも できます。

私の証券会社が対応リストにありません

まず対応ブローカーを確認してください。主要プラットフォームは プリセットでカバーされ、MT4/MT5 の明細はそのままインポートできます。それ以外でも、銘柄/売買方向/ 数量/価格/日付の列を含む CSV であれば、列マッピングで インポートできます。自動検出は一般的なヘッダー名のほとんどを認識します。

スクリーンショットのスキャンがタイムアウトする/エラーになる

設定 → AI → テストを確認し、モデルが画像入力(vision)に対応しているか確かめてください。 低速なモデルやローカルモデルの場合は、TM_OCR_VISION_TIMEOUT_SEC とプロキシの読み取り タイムアウトを引き上げてください(リバースプロキシを参照)。 「503 not configured」は、有効化・ベース URL・API キーのいずれかが保存されていないことを意味します。

私のトレードデータはどこかへ送信されますか?

いいえ。すべてあなたのサーバー内にとどまります。例外はすべてあなたの管理下にあります。AI 機能は あなたが設定したエンドポイントを呼び出します。マーケットデータ(既定で有効、 TM_MARKET_DATA_ENABLED)と経済指標カレンダー(既定で有効、TM_ECON_CALENDAR_ENABLED)は それぞれのプロバイダーから公開データを取得します。作成したアラートチャネルは、あなたの Webhook URL や Expo プッシュへ配信します。また、作成したシェアリンクは取り消すまで そのスタッツページを公開します(TM_SHARE_LINKS_ENABLED、既定はオフ)。

それでも解決しない場合

  • API のログを確認する: make logs(または docker compose logs -f api
  • curl http://localhost:3000/healthz — API の稼働確認とバージョン表示
  • ログ出力を添えてイシューを作成する

このページの内容