Misskeyで利用するPostgreSQLとRedisを自動でバックアップ・管理することを目的としたDocker Image/Toolです🌱
- 🎀 ワンクリックで暗号化バックアップをR2へアップロード
- 🌤️ リトライ&並列マルチパートアップロードで安定転送
- 🔎 pg_restoreでダンプ健全性を検証してから保存
- 🗂️ 世代数ベースで古いバックアップを自動整理
- 🍬 復元はURL指定でOK、CLIオプションで鍵を上書き可能
- ☁️ 復元のみならR2設定不要、署名付きURL(既定7日有効)から直接取得
- Docker & Docker Compose
- Cloudflare R2(またはS3互換ストレージ)のバケット
- PostgreSQLデータベースへのアクセス権限
- クローン&移動
git clone https://github.com/team-shahu/misskey-backup.git cd misskey-backup - 環境変数テンプレートをコピー
cp config/env.example config/.env
- 暗号化キーを生成して
config/.envのBACKUP_ENCRYPTION_KEYへ設定 (必須、32バイト以上)openssl rand -base64 32
- コンテナの起動
docker compose up -d
PostgreSQLもRedisもデフォルトで有効。片方だけ運用したい場合は該当トグルをfalseにする。
| 項目 | 説明 | デフォルト値 |
|---|---|---|
POSTGRES_BACKUP_ENABLED |
PostgreSQLバックアップの有効化 | true |
REDIS_BACKUP_ENABLED |
Redisバックアップの有効化 | true |
Important
Redisバックアップはデフォルトで有効です。PostgreSQLのみ運用を続ける場合はREDIS_BACKUP_ENABLED=falseを設定してください(未設定だと毎回Redis取得に失敗し失敗通知が飛びます)。有効にする場合はバックアップコンテナからRedisへ到達できるようネットワーク設定も必要です。
| 項目 | 説明 | デフォルト値 |
|---|---|---|
POSTGRES_HOST |
PostgreSQLホスト | localhost |
POSTGRES_PORT |
PostgreSQLポート | 5432 |
POSTGRES_USER |
データベースユーザー | postgres |
POSTGRES_PASSWORD |
データベースパスワード | - |
POSTGRES_DB |
データベース名 | misskey |
redis-cli --rdbでネットワーク越しにRDBスナップショットを取得します(全DB含む完全スナップショット)。
| 項目 | 説明 | デフォルト値 |
|---|---|---|
REDIS_HOST |
Redisホスト | redis |
REDIS_PORT |
Redisポート | 6379 |
REDIS_PASSWORD |
Redisパスワード (未設定なら認証なし) | - |
REDIS_TLS |
TLS接続を有効化 | false |
| 項目 | 説明 | デフォルト値 |
|---|---|---|
BACKUP_DIR |
バックアップ保存ディレクトリ | /app/backups |
BACKUP_GENERATIONS |
保持する世代数(直近N本) | 30 |
COMPRESSION_LEVEL |
zstd圧縮レベル (1-19) | 3 |
BACKUP_ENCRYPTION_KEY |
バックアップ暗号化キー、32バイト以上 (必須) | - |
Cloudflare R2を既定とし、S3互換ストレージ(AWS S3, RustFS, SeaweedFS等)をサポートしています。
| 項目 | 説明 |
|---|---|
BACKUP_ENDPOINT |
エンドポイントURL (例: https://<accountID>.r2.cloudflarestorage.com, http://rustfs:9000) |
BACKUP_REGION |
リージョン (既定: auto、R2以外を利用する場合には対象ストレージのリージョンを指定) |
BACKUP_FORCE_PATH_STYLE |
パススタイルでアクセスする (既定: false) |
BACKUP_ACCESS_KEY_ID |
アクセスキーID |
BACKUP_SECRET_ACCESS_KEY |
シークレットアクセスキー |
R2_BUCKET_NAME |
バケット名 |
R2_PREFIX |
バックアップファイルのプレフィックス |
BACKUP_BUCKET_ACL |
バケットのACL設定 |
| 項目 | 説明 | デフォルト値 |
|---|---|---|
MAX_RETRIES |
最大リトライ回数 | 5 |
RETRY_BASE_DELAY |
基本遅延時間(秒) | 1 |
RETRY_MAX_DELAY |
最大遅延時間(秒) | 30 |
| 項目 | 説明 | デフォルト値 |
|---|---|---|
UPLOAD_TIMEOUT |
アップロードタイムアウト時間(分) | 60 |
CHUNK_SIZE |
マルチパートアップロードのチャンクサイズ(MB) | 10 |
MAX_CONCURRENCY |
マルチパートアップロードの並列数 | 5 |
| 項目 | 説明 | デフォルト値 |
|---|---|---|
NOTIFICATION |
Discord通知の有効化 | false |
DISCORD_WEBHOOK_URL |
Discord Webhook URL | - |
NOTIFY_INCLUDE_URL |
通知にダウンロードURLを含める | true |
NOTIFY_ON_FAILURE_ONLY |
失敗時のみ通知する | false |
NOTIFY_STARTUP_CHECK |
起動時に確認用の通知を送信する | true |
| 項目 | 説明 | デフォルト値 |
|---|---|---|
CRON_SCHEDULE |
Cron形式のスケジュール | 0 5,17 * * * |
TZ |
タイムゾーン | Asia/Tokyo |
コンテナは:8080/healthにヘルスチェック用HTTPエンドポイントを公開します(compose.yamlのhealthcheckが参照)。
バックアップファイルは以下の形式で保存されます:
# PostgreSQL
{データベース名}_{日付}_{時刻}.dump.zst.enc
# Redis
redis_{日付}_{時刻}.rdb.zst.enc
例: misskey_2025-08-28_21-35.dump.zst.enc / redis_2025-08-28_21-35.rdb.zst.enc
世代整理(BACKUP_GENERATIONS)はターゲットごとに独立して適用されます。
通知に載る署名付きURL(またはR2の公開URL)を指定して、暗号化済みバックアップを復元できます。復元先は ./restore に展開され、最終的に .dump ができます。
cd src
# 環境変数で鍵を渡す場合
BACKUP_ENCRYPTION_KEY=... ./misskey-backup --restore-url "https://backup.example.com/path/to/misskey_2025-08-28_21-35.dump.zst.enc"
# CLIオプションで鍵を渡す場合(環境変数より優先)
./misskey-backup --restore-url "https://backup.example.com/path/to/misskey_2025-08-28_21-35.dump.zst.enc" \
--encryption-key "your-hex-or-base64-key"- 暗号化キーは環境変数
BACKUP_ENCRYPTION_KEYまたは--encryption-keyのどちらかを指定する必要があります(通常、CLIオプション側が優先されます)。 - 復元のみの場合はR2設定は不要です(URLへ直接GETできる前提。署名付きURLは発行から既定7日間有効)。
アプリケーションは以下の情報をログに出力します:
- バックアップの開始と完了
- ファイルサイズと実行時間
- アップロード方式の自動選択(単一/マルチパート)
- マルチパートアップロードの進行状況(チャンクサイズ、パート数)
- エラーが発生した場合は詳細なエラーメッセージ
- R2アップロードの結果
- リトライ実行時の詳細なログ(遅延時間、試行回数など)
- アップロードタイムアウト設定の適用状況
このプロジェクトはMITライセンスの下で公開されています。
Pull requests and issue reports are welcome. Before contributing, please check the following steps:
- Create a fork
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit changes (
git commit -m 'feat: add amazing feature') - Push the branch (
git push origin feature/amazing-feature) - Create a pull request