先日、日本語翻訳をマージして頂きました。(不具合有りましたらご報告お願い致します。)
メールサーバーは企業や個人にとって重要なインフラの一つです。Docker Mailcowを使用している場合、適切なバックアップ戦略を立てることで、データ損失のリスクを最小限に抑えることができます。この記事では、mailcowの効果的なバックアップ方法を詳しく解説します。
バックアップの重要性
mailcowには以下の重要なデータが含まれています:
- メールデータ: ユーザーのメールボックス、添付ファイル
- データベース: ユーザーアカウント、ドメイン設定、エイリアス情報
- 設定ファイル: docker-compose.yml、mailcow.conf
- TLS証明書: Let’s EncryptやカスタムSSL証明書
- ログファイル: トラブルシューティング用のログ
1. 公式バックアップスクリプトを使用する方法
mailcowには公式のバックアップスクリプトが付属しており、これが最も簡単で確実な方法です。
基本的な使用方法
# mailcowのインストールディレクトリに移動
cd /opt/mailcow-dockerized
# 全データのバックアップを作成
./backup_and_restore.sh backup all
# 特定のコンポーネントのみバックアップ
./backup_and_restore.sh backup mail # メールデータのみ
./backup_and_restore.sh backup mysql # データベースのみ
./backup_and_restore.sh backup redis # Redisデータのみ
./backup_and_restore.sh backup rspamd # Rspamd学習データのみ
./backup_and_restore.sh backup postfix # Postfix設定のみ
バックアップファイルの確認
バックアップが正常に作成されると、以下のような形式でファイルが生成されます:
backup_YYYY-MM-DD_HH-MM-SS.tar.gz
2. 手動バックアップ方法
より細かい制御が必要な場合や、カスタムスクリプトを作成したい場合は、手動でバックアップを行うことも可能です。
データベースのバックアップ
# 環境変数を読み込み
source mailcow.conf
# MySQLダンプを作成
docker-compose exec mysql-mailcow mysqldump \
--default-character-set=utf8mb4 \
--routines --events --triggers --single-transaction \
-u${DBUSER} -p${DBPASS} ${DBNAME} \
> backup_mysql_$(date +%Y%m%d_%H%M%S).sql
メールデータのバックアップ
# メールボックスデータを圧縮してバックアップ
docker run --rm \
-v mailcowdockerized_vmail-vol-1:/vmail:ro \
-v $(pwd):/backup \
alpine tar czf /backup/vmail_$(date +%Y%m%d_%H%M%S).tar.gz -C / vmail
設定ファイルのバックアップ
# 重要な設定ファイルをバックアップ
mkdir -p backup/config
cp docker-compose.yml backup/config/
cp mailcow.conf backup/config/
cp -r data/conf backup/config/
TLS証明書のバックアップ
# SSL証明書をバックアップ
docker run --rm \
-v mailcowdockerized_crypt-vol-1:/crypt:ro \
-v $(pwd):/backup \
alpine tar czf /backup/certs_$(date +%Y%m%d_%H%M%S).tar.gz -C / crypt
3. 自動バックアップの設定
定期的なバックアップを自動化するため、cronジョブを設定します。
cronジョブの設定例
# crontabを編集
crontab -e
# 以下の行を追加(毎日午前2時にバックアップを実行)
0 2 * * * cd /opt/mailcow-dockerized && ./backup_and_restore.sh backup all >/var/log/mailcow-backup.log 2>&1
# 週次でのローテーション(毎週日曜日に古いバックアップを削除)
0 3 * * 0 find /opt/mailcow-dockerized -name "backup_*.tar.gz" -mtime +30 -delete
バックアップスクリプトの作成
より高度な自動化のため、カスタムスクリプトを作成することもできます:
#!/bin/bash
# /usr/local/bin/mailcow-backup.sh
MAILCOW_DIR="/opt/mailcow-dockerized"
BACKUP_DIR="/backup/mailcow"
DATE=$(date +%Y%m%d_%H%M%S)
# バックアップディレクトリの作成
mkdir -p "$BACKUP_DIR"
# mailcowディレクトリに移動
cd "$MAILCOW_DIR"
# バックアップの実行
./backup_and_restore.sh backup all
# バックアップファイルを指定場所に移動
mv backup_*.tar.gz "$BACKUP_DIR/mailcow_backup_$DATE.tar.gz"
# 古いバックアップの削除(30日以上古いものを削除)
find "$BACKUP_DIR" -name "mailcow_backup_*.tar.gz" -mtime +30 -delete
# ログ出力
echo "$(date): Backup completed successfully" >> /var/log/mailcow-backup.log
4. バックアップの検証
バックアップが正常に作成されているか定期的に確認することが重要です。
# バックアップファイルの整合性チェック
tar -tzf backup_YYYY-MM-DD_HH-MM-SS.tar.gz >/dev/null && echo "Backup integrity OK" || echo "Backup corrupted"
# バックアップファイルのサイズ確認
ls -lh backup_*.tar.gz
5. リストア方法
バックアップからの復旧方法も覚えておきましょう。
完全リストア
# mailcowを停止
docker-compose down
# バックアップからリストア
./backup_and_restore.sh restore /path/to/backup_file.tar.gz
# mailcowを再起動
docker-compose up -d
部分的なリストア
特定のコンポーネントのみをリストアすることも可能です:
# メールデータのみリストア
./backup_and_restore.sh restore /path/to/backup_file.tar.gz --mail-only
# データベースのみリストア
./backup_and_restore.sh restore /path/to/backup_file.tar.gz --mysql-only
6. ベストプラクティス
3-2-1ルールの適用
- 3: 3つのコピーを保持する(本番 + バックアップ2つ)
- 2: 2つの異なる媒体に保存する(ローカル + クラウド)
- 1: 1つは離れた場所に保管する(オフサイトバックアップ)
バックアップの保存先
# ローカルストレージ
BACKUP_LOCAL="/backup/mailcow"
# 外部ストレージ(例:rsync)
rsync -avz "$BACKUP_LOCAL/" user@backup-server:/backup/mailcow/
# クラウドストレージ(例:rclone)
rclone copy "$BACKUP_LOCAL/" remote:mailcow-backup/
監視とアラート設定
バックアップの成功・失敗を監視するため、ログを確認し、必要に応じてアラートを設定します:
# バックアップ状況の確認スクリプト
#!/bin/bash
LATEST_BACKUP=$(ls -t /backup/mailcow/*.tar.gz | head -n1)
BACKUP_AGE=$(find /backup/mailcow -name "*.tar.gz" -mtime -1 | wc -l)
if [ "$BACKUP_AGE" -eq 0 ]; then
echo "Warning: No recent backup found!"
# メール通知やSlack通知などを送信
fi
まとめ
mailcowのバックアップは、公式のバックアップスクリプトを使用することで簡単に実装できます。重要なのは:
- 定期的な自動バックアップの設定
- 複数の場所へのバックアップ保存
- バックアップの整合性確認
- リストア手順の定期的なテスト
これらの手順を実践することで、メールサーバーの安全性を大幅に向上させることができます。バックアップは「もしも」の時のための保険です。実際にトラブルが発生してからでは遅いので、今すぐ適切なバックアップ戦略を実装しましょう。