バックアップと復旧
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 -p、rsync -a、tar -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' 를 입력하세요:
スクリプトが実行する順序です。
- アーカイブ構造の検証(ダンプ・ファイルアーカイブの存在確認)
- 現在のファイル状態を
dist/pre-restore-<date>.tar.gzに自動バックアップ - スタック停止
- データディレクトリ復旧 → データベース復旧
- スタック起動 → ヘルスチェック
自動化スクリプト内でプロンプトなしに実行するには、
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
別のサーバーへの移行
- 新しいサーバーに同じバージョンでスタックをインストールします(インストールまたはエアギャップインストール)。
- 既存サーバーの
.envを新しいサーバーにコピーします(権限600を保持)。 - バックアップアーカイブを新しいサーバーの
dist/にコピーします(権限600を保持)。 - 復旧を実行します。
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個まで保管され、超過分は自動削除されます (現在サービス中のバージョンは常に保存)。
関連ドキュメント
- インストール・エアギャップインストール
- シークレット管理 — バックアップにキーが混入しないようにする原則
- トラブルシューティング