coconikkiのバックアップシステムのセットアップ手順です。
- バックアップ先: Google Drive
- バックアップ内容: PostgreSQLデータベース + Active Storage画像
- 実行頻度: 毎日自動(cron)
- 保持期間: 7日分
- 追加コスト: 0円(Google Drive無料枠15GB内)
- VPSサーバーへのSSHアクセス
- Googleアカウント(既存のものでOK)
- PostgreSQLが稼働中
- Dockerコンテナが稼働中
ssh -i ~/.ssh/coconikki_vps deploy@220.158.23.115# rcloneをインストール
curl https://rclone.org/install.sh | sudo bash
# バージョン確認
rclone version# rclone設定を開始
rclone config
# 以下の手順で設定:
# n) New remote
# name> gdrive
# Storage> drive (Google Driveを選択)
# client_id> (空Enter - デフォルトを使用)
# client_secret> (空Enter - デフォルトを使用)
# scope> 1 (Full access)
# root_folder_id> (空Enter)
# service_account_file> (空Enter)
# Edit advanced config? n
# Use auto config? n (サーバーなので手動設定)
#
# ここでブラウザ認証用のURLが表示されます
# URLをコピーして、ローカルPCのブラウザで開く
# Googleアカウントでログイン・認証
# 表示されたトークンをコピーしてVPSに貼り付け
#
# Configure this as a team drive? n
# Keep this "gdrive" remote? y
# q) Quit configローカルPCでの認証手順(重要):
VPSはブラウザがないので、ローカルPCで認証します:
- VPSに表示されたURL(
https://accounts.google.com/...)をコピー - ローカルPCのブラウザでそのURLを開く
- Googleアカウントでログイン
- rcloneへのアクセスを許可
- 表示された認証コードをコピー
- VPSのターミナルに貼り付け
# Google Driveに接続できるか確認
rclone lsd gdrive:
# テストフォルダを作成
rclone mkdir gdrive:coconikki_backups
# 確認
rclone ls gdrive:coconikki_backups成功すれば空のディレクトリが表示されます。
# プロジェクトディレクトリに移動
cd /home/deploy/oobun
# スクリプトに実行権限を付与
chmod +x scripts/backup.sh
chmod +x scripts/restore.sh# テスト実行(-E フラグで環境変数を引き継ぐ)
sudo -E ./scripts/backup.sh
# 実行後、Google Driveを確認
rclone ls gdrive:coconikki_backups以下のファイルが表示されればOK:
coconikki_db_YYYYMMDD_HHMMSS.sql.gzcoconikki_storage_YYYYMMDD_HHMMSS.tar.gz
バックアップの成功・失敗をDiscordに通知できます。
- Discordサーバーの設定を開く
- 「連携サービス」→「ウェブフック」を選択
- 「新しいウェブフック」をクリック
- 名前を設定(例: coconikki-backup)
- 通知先チャンネルを選択
- 「ウェブフックURLをコピー」
# .bashrcや.bash_profileに追加
echo 'export DISCORD_WEBHOOK_URL="https://discord.com/api/webhooks/YOUR_WEBHOOK_URL"' >> ~/.bashrc
source ~/.bashrc
# 設定を確認
echo $DISCORD_WEBHOOK_URL# テストバックアップを実行
cd /home/deploy/oobun
sudo -E ./scripts/backup.sh通知内容:
- ✅ 成功時: 緑色のembed、実行日時、各ファイルサイズ、保存先、Google Driveリンク
- ❌ 失敗時: 赤色のembed、エラー内容
# cronを編集
crontab -e
# crontabファイルの上部に環境変数を定義(セキュリティベストプラクティス)
DISCORD_WEBHOOK_URL=YOUR_WEBHOOK_URL
# 以下の行を追加(毎日午前3時に実行、Discord通知を有効化)
0 3 * * * cd /home/deploy/oobun && sudo -E /home/deploy/oobun/scripts/backup.sh >> /home/deploy/backup.log 2>&1
# 保存して終了
# cron設定を確認
crontab -l実行時刻の選択:
- 午前3時(日本時間)= アクセスが少ない時間帯
- サーバー時刻がUTCの場合は調整が必要(
dateコマンドで確認)
環境変数の設定方法:
- crontabファイルの上部で
DISCORD_WEBHOOK_URLを定義することを推奨 - この方法により、コマンドライン上にシークレットが露出しない
sudo -Eオプションでcrontabの環境変数が引き継がれます- または、手順7で設定した
~/.bashrcの環境変数も引き継がれます
バックアップが正常に動作しているか確認:
# ログを確認
tail -50 /home/deploy/backup.log
# Google Driveのファイルを確認
rclone ls gdrive:coconikki_backups
# Discord通知が届いているか確認cd /home/deploy/oobun
sudo ./scripts/restore.sh latest# バックアップ一覧を確認
rclone ls gdrive:coconikki_backups
# タイムスタンプを指定してリストア
sudo ./scripts/restore.sh 20260313_030000A: 認証URLを正しくローカルPCのブラウザで開いているか確認してください。VPS上でブラウザを開こうとするとエラーになります。
A: 以下を確認:
# rclone設定を確認
rclone config show
# 接続テスト
rclone lsd gdrive:
# 手動でアップロードテスト
echo "test" > /tmp/test.txt
rclone copy /tmp/test.txt gdrive:coconikki_backups
rclone ls gdrive:coconikki_backupsA: PostgreSQLユーザー権限を確認:
# postgresユーザーで実行できるか確認
sudo -u postgres pg_dump coconikki_productionA: ログを確認:
# cronログを確認
cat /home/deploy/backup.log
# cronサービスの状態を確認
systemctl status cron# Google Drive上のバックアップサイズを確認
rclone size gdrive:coconikki_backupsデフォルトは7日間ですが、容量に応じて変更可能:
# 環境変数で設定
export BACKUP_RETENTION_DAYS=3
# または、scripts/backup.sh を編集
vim scripts/backup.sh
# BACKUP_RETENTION_DAYS=3 に変更スクリプトは他のストレージにも対応しています:
# AWS CLI設定
aws configure
# バックアップ実行
export BACKUP_BACKEND=s3
export S3_BUCKET=coconikki-backups
sudo ./scripts/backup.shexport BACKUP_BACKEND=local
sudo ./scripts/backup.sh- バックアップが正常に実行されているか確認(ログ確認)
- Google Driveの容量を確認
- テストリストアを実行(開発環境で)
# 最新のログを確認
tail -100 /home/deploy/backup.log
# エラーがないか確認
grep ERROR /home/deploy/backup.log- rclone設定ファイル(
~/.config/rclone/rclone.conf)にはアクセストークンが含まれます - このファイルは
deployユーザーのみがアクセス可能です - Google Driveへのアクセスは読み書き可能ですが、coconikkiのバックアップフォルダのみを使用します
バックアップに関する問題が発生した場合:
- ログを確認(
/home/deploy/backup.log) - 手動実行でテスト(
sudo ./scripts/backup.sh) - rclone接続を確認(
rclone lsd gdrive:)