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_BYTES、TM_IMPORT_MAX_BYTES、TM_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 の稼働確認とバージョン表示- ログ出力を添えてイシューを作成する