--- author: usbharu draft: false 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で生成したんなら記事各意味なくね? - 状態:書きかけ