メインコンテンツまでスキップ

バックアップと復旧

PlantPulse Studio は バックアップスクリプト1つと復旧スクリプト1つで全体の状態を管理します。 すべてのコマンドはインストールディレクトリ(/opt/kopens/plantpulse-studio-docker)から実行します。


バックアップの対象

バックアップファイル1つ(dist/backup-<date>.tar.gz)に以下がすべて含まれます。

対象内容
PostgreSQL 全体ダンプユーザーアカウント・会話履歴・ウォッチャー・アラーム読了状態・スキル・デプロイ履歴・監査ログ
ワークスペース(workspaces/)プロジェクト別の実際のソースコード・チャット添付ファイル
ビルド成果物(builds/)デプロイされたアプリの各バージョン(ロールバックに必要)
状態ディレクトリ(state/)settings.json(環境設定)・監査/使用量ログ・カスタムテンプレート・ブランディングロゴ

PostgreSQL のデータディレクトリ自体はアーカイブから除外されます — SQL ダンプで置き換えられるためです。

バックアップファイルは機密資料です

アーカイブ内には全ユーザーのワークスペースが丸ごと含まれ、以前のインストールからの 移行の場合、settings.jsonに API キーが残っている可能性があります。

  • スクリプトはバックアップファイルを**600(所有者のみ読取)に、dist/ ディレクトリを700**で作成します。
  • 外部メディア・別のサーバーへ移動する場合もこの権限を維持してください。 (scp -prsync -atar -p など権限保存オプションを使用)
  • 社外に持ち出す場合は別途暗号化を推奨します。

バックアップの実行

cd /opt/kopens/plantpulse-studio-docker
bash bin/backup.sh
▶ PostgreSQL 덤프
▶ 파일 상태 아카이브(postgres 데이터 제외 — 덤프로 대체)
-rw------- 1 root root 78M ... dist/backup-20260728-031501.tar.gz
✅ 백업 완료 (보존 14개)
  • 結果物:dist/backup-<YYYYMMDD-HHMMSS>.tar.gz
  • 保存ポリシー:最新14個だけ保持し、古いファイルは自動削除されます(BACKUP_KEEP で調整可能)。
  • バンドル PostgreSQL を使用する場合、スタックが起動していることが必須です。ダンプを作成できません。
BACKUP_KEEP=30 bash bin/backup.sh # 이번 실행부터 30개 보존
更新前には必ず手動バックアップを実行

イメージアップグレードや設定の大幅変更前にbash bin/backup.sh を1回実行してください。


自動バックアップの設置(推奨)

毎日午前3時30分にバックアップが実行されるよう cron を設置します。root 権限が必要です。

sudo bash bin/install-backup-cron.sh
[backup-cron] 설치 완료 — 스케줄: '30 3 * * *', 보존 14개, 로그: dist/backup.log

実行時間・保存個数を変更する場合は、

sudo BACKUP_CRON="0 4 * * *" BACKUP_KEEP=30 bash bin/install-backup-cron.sh

削除するには、

sudo bash bin/install-backup-cron.sh remove

動作確認はログで行います。

tail -50 /opt/kopens/plantpulse-studio-docker/dist/backup.log
ls -lh /opt/kopens/plantpulse-studio-docker/dist/backup-*.tar.gz

推奨運用周期

周期実施内容
毎日自動バックアップ(cron) — 14日分保存
毎週最新バックアップ1つを別のサーバー・メディアにコピー(権限保持)
毎月dist/ 容量とディスク空き容量を確認
四半期DRYRUN=1 復旧リハーサル — 下記参照
アップグレード前手動バックアップ1回
バックアップは「復旧できるか」を確認して初めてバックアップです

バックアップファイルが毎日蓄積していても、実際に復旧できるかどうかは試してみるまでわかりません。 四半期ごとにリハーサルを実行してください。非破壊なので運用中に実行しても安全です。


復旧リハーサル (非破壊)

アーカイブ構造とデータベース到達性のみを検査し、何も変更しません。

DRYRUN=1 bash bin/restore.sh # 최신 백업 대상
DRYRUN=1 bash bin/restore.sh dist/backup-20260712-191858.tar.gz
▶ 아카이브 검증
ppstudio.sql 12M · files.tar.gz 66M
▶ DRYRUN — DB 도달성만 확인
✅ DB 도달 OK
✅ DRYRUN 통과 — 실제 복구는 DRYRUN 없이 실행

復旧の実行

復旧は破壊的です

現在のデータベース内容とデータディレクトリ全体がバックアップ時点に上書きされます。 復旧後に作成されたプロジェクト・会話・デプロイは消失します。

cd /opt/kopens/plantpulse-studio-docker

bash bin/restore.sh # 최신 백업으로 복구
bash bin/restore.sh dist/backup-20260712-191858.tar.gz # 특정 시점으로 복구

確認プロンプトにrestoreを入力する必要があります。

⚠ 현재 DB 와 /var/lib/pp-studio 파일 상태를 이 백업으로 덮어씁니다: dist/backup-...
계속하려면 'restore' 를 입력하세요:

スクリプトが実行する順序です。

  1. アーカイブ構造の検証(ダンプ・ファイルアーカイブの存在確認)
  2. 現在のファイル状態をdist/pre-restore-<date>.tar.gzに自動バックアップ
  3. スタック停止
  4. データディレクトリ復旧 → データベース復旧
  5. スタック起動 → ヘルスチェック

自動化スクリプト内でプロンプトなしに実行するには、

FORCE=1 bash bin/restore.sh dist/backup-20260712-191858.tar.gz

復旧直後にヘルスが起動しない場合

bash bin/logs.sh # 서버 로그 확인
bash bin/status.sh

元に戻すには、2段階で作成されたバックアップから復旧します。ただし、バックアップは ファイル状態のみ含み(データベースは含まれません)。

bash bin/restore.sh dist/pre-restore-20260728-104233.tar.gz

別のサーバーへの移行

  1. 新しいサーバーに同じバージョンでスタックをインストールします(インストールまたはエアギャップインストール)。
  2. 既存サーバーの.envを新しいサーバーにコピーします(権限600を保持)。
  3. バックアップアーカイブを新しいサーバーのdist/にコピーします(権限600を保持)。
  4. 復旧を実行します。
cd /opt/kopens/plantpulse-studio-docker
DRYRUN=1 bash bin/restore.sh dist/backup-20260728-031501.tar.gz # 먼저 리허설
bash bin/restore.sh dist/backup-20260728-031501.tar.gz
ドメインが変わる場合

移行後にアクセスアドレスが異なると、すべてのユーザーがログアウト後に再ログイン を1回する必要があります — ログインクッキーは発行時点のホスト専用なので、そのままでは データリクエストが401になります。 詳細はドメインとリバースプロキシを参照してください。


ディスク管理

バックアップはワークスペースとビルド成果物を丸ごと含むため、プロジェクトが増えるにつれて容量が増加します。

du -sh /opt/kopens/plantpulse-studio-docker/dist
du -sh /var/lib/pp-studio/*
df -h /var/lib/pp-studio
  • 保存個数を減らすには、cron をBACKUP_KEEP 値と一緒に再インストールしてください。
  • デプロイされたアプリの過去バージョンはプロジェクトあたりデフォルト10個まで保管され、超過分は自動削除されます (現在サービス中のバージョンは常に保存)。

関連ドキュメント