TraderMemos
自托管

備份與恢復

一切都在一個數據卷裏 —— SQLite 數據庫與附件目錄,必須一起備份。

你的交易日誌在磁盤上就是兩樣東西,且必須一起備份

內容默認位置(Docker)
數據庫tm_data 數據卷中的 /data/tradermemos.db(SQLite)
附件與筆記媒體同一數據卷中的 /data/attachments

附件的元數據保存在數據庫中 —— 只恢復其中之一會造成截圖失效或文件成爲孤兒。

方式 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 自動化,並將壓縮包同步到異地(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 (遷移會自動對齊)。

每次升級前

升級版本前先做一次快照 —— schema 遷移在啓動時自動執行,且不支持自動降級。參見 更新升級

本頁內容