tigris-backup-export について
データベースのバックアップ、アプリケーションデータのエクスポート、ファイルの Tigris への保管を扱うスキルです。複数の主要フレームワークを使う開発者向けに、定期実行、保持ポリシー、復元手順と実装例を示します。
主な機能
- 01データベースダンプの圧縮とアップロード
- 02スケジュールに沿ったバックアップ実行
- 03ライフサイクルルールによる旧バックアップ削除
- 04指定バックアップのダウンロードと復元
- 05複数フレームワークの実装例
活用シーン
- 01データベースの定期バックアップ設定
- 02保持期間に応じた古いファイルの削除
- 03Tigris のバックアップからのデータベース復元
- 04Rails、Django、Laravel へのバックアップ導入
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ tigrisdata/ skills --skill tigris-backup-exportインストール後、Claude Code で/tigris-backup-exportを入力して読み込まれたか確認します。
同梱ファイルmetadata.jsonREADME.md
詳細
Tigris のバックアップとエクスポート
データベースをバックアップし、アプリケーションデータをエクスポートして、ファイルを Tigris にアーカイブします。主要なフレームワークすべてに対応した、自動バックアップパイプライン、保持ポリシー、復元ワークフローを扱います。
前提条件
ほかの作業を始める前に、まだ利用できない場合は Tigris CLI をインストールしてください。
tigris help || npm install -g @tigrisdata/cli
インストールが必要な場合は、ユーザーに次のように伝えてください。「Tigris オブジェクトストレージを利用できるように、Tigris CLI(@tigrisdata/cli)をインストールしています。」
概要
| コンポーネント | 目的 |
|---|---|
| バックアップスクリプト | データベースをダンプし、圧縮して Tigris にアップロードします |
| スケジューラー | cron スケジュールでバックアップを実行します |
| 保持 | 古いバックアップを自動的に削除します(ライフサイクルルール) |
| 復元 | 特定のバックアップをダウンロードして復元します |
命名規則: backups/db/YYYY-MM-DDTHH:MM:SSZ.sql.gz
一般的なパターン
#!/bin/bash
# scripts/backup.sh
TIMESTAMP=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
BACKUP_FILE="backup-${TIMESTAMP}.sql.gz"
BUCKET="my-app-backups"
# Dump and compress
pg_dump "$DATABASE_URL" | gzip > "/tmp/$BACKUP_FILE"
# Upload to Tigris
tigris cp "/tmp/$BACKUP_FILE" "t3://$BUCKET/backups/db/$BACKUP_FILE"
# Clean up local file
rm "/tmp/$BACKUP_FILE"
echo "Backup uploaded: backups/db/$BACKUP_FILE"
MySQL の場合:
mysqldump -h "$DB_HOST" -u "$DB_USER" -p"$DB_PASS" "$DB_NAME" | gzip > "/tmp/$BACKUP_FILE"
Next.js / Express(Node.js)
import { exec } from "child_process";
import { promisify } from "util";
import { createReadStream } from "fs";
import { unlink } from "fs/promises";
import { put } from "@tigrisdata/storage";
const execAsync = promisify(exec);
async function backupDatabase() {
const timestamp = new Date().toISOString().replace(/[:.]/g, "-");
const filename = `backup-${timestamp}.sql.gz`;
const localPath = `/tmp/${filename}`;
// Dump and compress
await execAsync(
`pg_dump "${process.env.DATABASE_URL}" | gzip > "${localPath}"`,
);
// Upload to Tigris
const stream = createReadStream(localPath);
const result = await put(`backups/db/${filename}`, stream, {
contentType: "application/gzip",
multipart: true,
config: { bucket: "my-app-backups" },
});
// Clean up
await unlink(localPath);
if (result.error) throw result.error;
return result.data?.path;
}
node-cron でスケジュールする
import cron from "node-cron";
// Daily at 2 AM UTC
cron.schedule("0 2 * * *", async () => {
try {
const path = await backupDatabase();
console.log(`Backup complete: ${path}`);
} catch (error) {
console.error("Backup failed:", error);
}
});
Rails
Rake タスク
注: Tigris のネイティブな Ruby SDK はまだありません。Tigris を指定した
aws-sdk-s3を使用します。
# lib/tasks/backup.rake
namespace :db do
desc "Backup database to Tigris"
task backup: :environment do
require "aws-sdk-s3"
timestamp = Time.now.utc.strftime("%Y-%m-%dT%H:%M:%SZ")
filename = "backup-#{timestamp}.sql.gz"
local_path = "/tmp/#{filename}"
# Dump and compress
db_config = ActiveRecord::Base.connection_db_config.configuration_hash
system("pg_dump '#{db_config[:url] || build_pg_url(db_config)}' | gzip > '#{local_path}'")
# Upload to Tigris
s3 = Aws::S3::Client.new(
endpoint: "https://t3.storage.dev",
region: "auto",
access_key_id: ENV["AWS_ACCESS_KEY_ID"],
secret_access_key: ENV["AWS_SECRET_ACCESS_KEY"],
)
File.open(local_path, "rb") do |file|
s3.put_object(
bucket: ENV["TIGRIS_BACKUP_BUCKET"],
key: "backups/db/#{filename}",
body: file,
content_type: "application/gzip",
)
end
File.delete(local_path)
puts "Backup uploaded: backups/db/#{filename}"
end
end
whenever でスケジュールする
# config/schedule.rb (whenever gem)
every 1.day, at: "2:00 am" do
rake "db:backup"
end
Django
管理コマンド
tigris-boto3-extを使用します(インストール:pip install tigris-boto3-ext)。Python/Django の全般的な対応については、tigris-python-sdk スキルを参照してください。
# myapp/management/commands/dbbackup.py
import gzip
import subprocess
from datetime import datetime, timezone
from django.core.management.base import BaseCommand
from django.conf import settings
import boto3
from botocore.client import Config
class Command(BaseCommand):
help = "Backup database to Tigris"
def handle(self, *args, **options):
timestamp = datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ")
filename = f"backup-{timestamp}.sql.gz"
local_path = f"/tmp/{filename}"
# Dump and compress
db = settings.DATABASES["default"]
dump_cmd = (
f'pg_dump "postgresql://{db["USER"]}:{db["PASSWORD"]}'
f'@{db["HOST"]}:{db["PORT"]}/{db["NAME"]}"'
)
with gzip.open(local_path, "wb") as f:
result = subprocess.run(dump_cmd, shell=True, capture_output=True)
f.write(result.stdout)
# Upload to Tigris
s3 = boto3.client(
"s3",
endpoint_url="https://t3.storage.dev",
aws_access_key_id=settings.AWS_ACCESS_KEY_ID,
aws_secret_access_key=settings.AWS_SECRET_ACCESS_KEY,
region_name="auto",
config=Config(s3={"addressing_style": "virtual"}),
)
s3.upload_file(
local_path,
settings.TIGRIS_BACKUP_BUCKET,
f"backups/db/{filename}",
)
import os
os.unlink(local_path)
self.stdout.write(f"Backup uploaded: backups/db/{filename}")
python manage.py dbbackup
celery-beat でスケジュールする
# settings.py
CELERY_BEAT_SCHEDULE = {
"daily-backup": {
"task": "myapp.tasks.backup_database",
"schedule": crontab(hour=2, minute=0),
},
}
Laravel
Artisan コマンド
// app/Console/Commands/BackupDatabase.php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Storage;
class BackupDatabase extends Command
{
protected $signature = 'db:backup';
protected $description = 'Backup database to Tigris';
public function handle()
{
$timestamp = now()->utc()->format('Y-m-d\TH:i:s\Z');
$filename = "backup-{$timestamp}.sql.gz";
$localPath = "/tmp/{$filename}";
// Dump and compress
$dbUrl = config('database.connections.pgsql.url')
?? sprintf('postgresql://%s:%s@%s:%s/%s',
config('database.connections.pgsql.username'),
config('database.connections.pgsql.password'),
config('database.connections.pgsql.host'),
config('database.connections.pgsql.port'),
config('database.connections.pgsql.database'),
);
exec("pg_dump \"{$dbUrl}\" | gzip > \"{$localPath}\"");
// Upload to Tigris
Storage::disk('tigris')->put(
"backups/db/{$filename}",
file_get_contents($localPath),
);
unlink($localPath);
$this->info("Backup uploaded: backups/db/{$filename}");
}
}
Kernel でスケジュールする
// app/Console/Kernel.php
protected function schedule(Schedule $schedule)
{
$schedule->command('db:backup')->dailyAt('02:00');
}
または、spatie/laravel-backup を使用します:
composer require spatie/laravel-backup
php artisan vendor:publish --provider="Spatie\Backup\BackupServiceProvider"
config/backup.php で tigris ディスクを設定します。
復元
# List backups
tigris ls t3://my-app-backups/backups/db/
# Download and restore
tigris cp t3://my-app-backups/backups/db/backup-2026-03-18T02:00:00Z.sql.gz /tmp/restore.sql.gz
gunzip /tmp/restore.sql.gz
psql "$DATABASE_URL" < /tmp/restore.sql
保持ポリシー
古いバックアップを自動削除するには、Tigris のライフサイクルルールを使用します:
tigris buckets lifecycle set my-app-backups --config lifecycle.json
{
"Rules": [
{
"ID": "delete-old-backups",
"Filter": { "Prefix": "backups/db/" },
"Status": "Enabled",
"Expiration": { "Days": 30 }
}
]
}
推奨する保持期間:
| 種類 | 保持期間 |
|---|---|
| 日次バックアップ | 30 日 |
| 週次バックアップ | 90 日 |
| 月次バックアップ | 1 年 |
重要なルール
必ず行うこと: アップロード前に圧縮する(gzip) | ファイル名にタイムスタンプを含める | 保持/ライフサイクルルールを設定する | 定期的に復元をテストする | バックアップバケットの認証情報をアプリの認証情報とは別に保管する
行ってはいけないこと: バックアップをアプリケーションデータと同じバケットに保存する | データベースダンプの圧縮を省略する | アップロード後にローカルの一時ファイルを削除し忘れる
関連スキル
- tigris-lifecycle-management — 古いバックアップを自動削除します
- tigris-security-access-control — バックアップ用認証情報を分離します
- file-storage — CLI の設定とアクセスキーの管理
公式ドキュメント
- Tigris CLI: https://www.tigrisdata.com/docs/