diff --git a/content/posts/2024-12-26/index.md b/content/posts/2024-12-26/index.md new file mode 100644 index 0000000..9d9117b --- /dev/null +++ b/content/posts/2024-12-26/index.md @@ -0,0 +1,120 @@ +--- +author: usbharu +draft: true +categories: + - ボツ記事 +date: 2024-12-26T15:05:47+09:00 +tags: + - Kubernetes + - Docker +keywords: + - Kubernetes + - Docker +title: ボツ記事 k8s内に構築したPostgreSQLをCronJobでバックアップする +relpermalink: posts/2024-12-26/ +url: posts/2024-12-26/ +decription: k8s内に構築したPostgreSQLをCronJobでバックアップする +--- + +[おうちk8sでMisskeyとNowPlayingを動かし始めたよ · usbharu - blog](https://blog.usbharu.dev/posts/2024-12-01/)でCloudNative PostgreSQLをやめ、k8s内で普通のPostgreSQLを動かし始めました。同時にバックアップ手段も失ったので、今回は自動バックアップを構築する記事です。 + +## やりたいこと + +k8sのCronJobでPostgreSQLをバックアップのpg_dumpを作成してオブジェクトストレージにアップロードしたい。 + +## 出来上がったもの + +[usbharu/pg_backup_job - pg_backup_job - Gitea for usbharu](https://git.usbharu.dev/usbharu/pg_backup_job) + +今回ほとんどChatGPTに作ってもらいました。これぐらいなら余裕ですね! +コメント等もほぼChatGPTが出力したままです。 + +```Dockerfile +# ベースイメージに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"] + + +``` + +```bash + +#!/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](https://github.com/usbharu/usbharu-lab/tree/e067db4ea302c3d3ee63c375d5058e1c2c6bedf1) + +--- + +- ボツ理由:ChatGPTで生成したんなら記事各意味なくね? +- 状態:書きかけ