おうちk8sでMisskeyとNowPlayingを動かし始めたよ · usbharu - blogでCloudNative PostgreSQLをやめ、k8s内で普通のPostgreSQLを動かし始めました。同時にバックアップ手段も失ったので、今回は自動バックアップを構築する記事です。
やりたいこと#
k8sのCronJobでPostgreSQLをバックアップのpg_dumpを作成してオブジェクトストレージにアップロードしたい。
出来上がったもの#
usbharu/pg_backup_job - pg_backup_job - Gitea for usbharu
今回ほとんどChatGPTに作ってもらいました。これぐらいなら余裕ですね! コメント等もほぼChatGPTが出力したままです。
# ベースイメージにPostgreSQL 15の公式クライアントを使用
FROM postgres:16
# 必要なツールをインストール
RUN apt-get update && apt-get install -y \
curl \
awscli \
&& rm -rf /var/lib/apt/lists/*
# 作業ディレクトリ
WORKDIR /backup
# スクリプトをコピー
COPY backup.sh /backup/backup.sh
# 実行権限を付与
RUN chmod +x /backup/backup.sh
# エントリーポイントを設定
ENTRYPOINT ["/backup/backup.sh"]
#!/bin/bash
set -e
# 必須環境変数リスト
REQUIRED_VARS=(
PG_HOST
PG_PORT
PG_USER
PG_PASSWORD
PG_DATABASE
S3_BUCKET
AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY
)
# 未設定の環境変数をチェック
for VAR in "${REQUIRED_VARS[@]}"; do
if [ -z "${!VAR}" ]; then
echo "エラー: 必須環境変数 '${VAR}' が設定されていません。" >&2
MISSING_ENV=true
fi
done
if [ "$MISSING_ENV" = true ]; then
exit 1
fi
# 環境変数の設定
export AWS_ACCESS_KEY_ID="${AWS_ACCESS_KEY_ID}"
export AWS_SECRET_ACCESS_KEY="${AWS_SECRET_ACCESS_KEY}"
export AWS_DEFAULT_REGION="${AWS_DEFAULT_REGION:-us-east-1}"
# ダンプファイル名
DUMP_FILE="dump_$(date +%Y%m%d%H%M%S).sql"
# pg_dumpを実行
export PGPASSWORD="${PG_PASSWORD}"
pg_dump -h "${PG_HOST}" -p "${PG_PORT}" -U "${PG_USER}" -d "${PG_DATABASE}" -F c -b -v -f "${DUMP_FILE}"
# S3にアップロード
if [[ -n "${S3_ENDPOINT}" ]]; then
# カスタムエンドポイント指定時
aws --endpoint-url "${S3_ENDPOINT}" s3 cp "${DUMP_FILE}" "s3://${S3_BUCKET}/${DUMP_FILE}"
else
# デフォルトエンドポイント
aws s3 cp "${DUMP_FILE}" "s3://${S3_BUCKET}/${DUMP_FILE}"
fi
# ローカルのダンプファイルを削除
rm -f "${DUMP_FILE}"
echo "バックアップとアップロードが完了しました。"
こっちの方もちょっと変わっていて、CronJobとそれに必要なSecretが追加されています。
usbharu/usbharu-lab at e067db4ea302c3d3ee63c375d5058e1c2c6bedf1
- ボツ理由:ChatGPTで生成したんなら記事各意味なくね?
- 状態:書きかけ