TraderMemos
セルフホスティング

バックアップと復元

データはすべて 1 つのボリュームにあります — SQLite データベースと添付ファイルディレクトリを、必ずまとめてバックアップしてください。

あなたのジャーナルはディスク上の 2 つの要素で構成されており、まとめてバックアップする必要が あります。

対象既定の場所(Docker)
データベースtm_data ボリューム内の /data/tradermemos.db(SQLite)
添付ファイル・ノートメディア同じボリューム内の /data/attachments

添付ファイルのメタデータはデータベースに保存されています。どちらか一方だけを復元すると、 スクリーンショットが壊れたり、孤立したファイルが残ったりします。

組み込み — 定期スナップショット(SQLite)

API は SQLite データベースを自動でスナップショットします。デフォルトは毎日、/data/backups (Docker)またはデータベースファイルの隣の backups/ フォルダに tradermemos-YYYYMMDD-HHMMSSZ.db として書き出し、新しい 14 個を保持します。各スナップショットは VACUUM INTO による一貫したコピーで、fsync してからリネームで配置されるため、書きかけのファイルが スナップショット名で現れることはなく、削除対象もこの名前に完全一致するファイルだけです。 TM_BACKUP_DIR・TM_BACKUP_KEEP・TM_BACKUP_INTERVAL_MIN・TM_BACKUP_ENABLED で調整できます (設定 を参照)。

設定 → について → バックアップ(オーナーのみ)に最終バックアップ、保存先、直近のエラーが表示され、 「今すぐバックアップ」ボタンがあります。バックアップが失敗したか、最新のものが間隔の 2 倍より古い 場合は、設定アイコンに赤いドットが付きます。

スナップショットはデータベースのみで、同じディスク上にあります。ディレクトリはご自身でサーバー外へ 同期し(rclone、restic、Syncthing など)、/data/attachments も一緒にコピーしてください。Docker では ホストのパスをバインドマウントし、TM_BACKUP_DIR をそこに向けると同期ツールから見えます。

復元するには、API を停止し、スナップショットを tradermemos.db に上書きコピーし、隣にある tradermemos.db-wal / tradermemos.db-shm を削除してから API を起動します。

方法 1 — アプリからのエクスポート(どの環境でも使えます)

アプリのインポート → エクスポート(または GET /api/v1/exports)は、次を生成します。

形式内容
ZIPexport.json と attachments/ 配下のすべてのスクリーンショット — 完全に持ち運べるバックアップ
JSONトレード、約定、ジャーナルのノート、資金取引、プレイブックのセットアップ(画像は含まれません)
CSV決済済みトレードのジャーナル表。別のツールでの分析用

復元は、任意の TraderMemos インスタンスで ZIP/JSON をインポートするだけです。新規インストール ではセットアップウィザードの任意インポートステップが受け付け、それ以降はいつでもインポート から取り込めます。約定はサーバー側で重複排除されるため、再インポートしても安全です。

ホスト間の移行、データベースの切り替え(SQLite ↔ Postgres)、あるいは実際に中身を開けるオフ サイトコピーが必要な場合は、この方法が適しています。

方法 2 — ボリュームのスナップショット(Docker、完全なコピー)

SQLite は WAL モードで動作するため、稼働中のデータベースファイルをそのままコピーしないでください。 先に API を停止するか(数秒のダウンタイム)、直近の書き込みを失う可能性があります。

cd TraderMemos
docker compose stop api
docker run --rm --volumes-from "$(docker compose ps -aq api)" -v "$PWD":/backup alpine \
  tar czf "/backup/tradermemos-$(date +%F).tar.gz" -C /data .
docker compose start api

新しいホストへ復元する場合:

cd TraderMemos
make up                       # コンテナと空のボリュームを作成
docker compose stop api
docker run --rm --volumes-from "$(docker compose ps -aq api)" -v "$PWD":/backup alpine \
  sh -c "rm -rf /data/* && tar xzf /backup/tradermemos-2026-08-01.tar.gz -C /data"
docker compose start api

cron で自動化し、tarball をオフサイトへ転送してください(rclone、restic など)。ボリューム内の tradermemos.db.migrate.lock ファイルは一時的なもので、除外して問題ありません。

Postgres の場合

データベースをダンプし、添付ファイルのボリュームをコピーします。

docker compose exec postgres pg_dump -U tm tradermemos > tradermemos-$(date +%F).sql
# 添付ファイルは引き続き tm_data ボリューム内にあります → 方法 2 と同様に /data/attachments をバックアップしてください

復元は、空のデータベースに psql -U tm tradermemos < backup.sql を実行してから API を起動します (マイグレーションが自動的に整合を取ります)。

アップグレードのたびに

バージョンを上げる前にスナップショットを取得してください。スキーママイグレーションは起動時に自動 実行され、自動ダウングレードは存在しません。アップデートを 参照してください。

このページの内容