commit e740a5d93d871a8e59d40e9585eadd5c4720918c Author: usbharu Date: Thu Dec 26 13:24:05 2024 +0900 first commit diff --git a/.gitea/workflows/build-image.yaml b/.gitea/workflows/build-image.yaml new file mode 100644 index 0000000..a532eb2 --- /dev/null +++ b/.gitea/workflows/build-image.yaml @@ -0,0 +1,36 @@ +name: build and deploy + +on: + push: + branches: + - master + +jobs: + build: + runs-on: ubuntu-latest + container: + image: catthehacker/ubuntu:act-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + - uses: docker/setup-buildx-action@v3 + - uses: docker/login-action@v3 + with: + registry: git.usbharu.dev + username: usbharu + password: ${{ secrets.PUBLIC_REPOSITORY_PACKAGE_WRITE_TOKEN }} + - name: metadata + id: meta + uses: docker/metadata-action@v5 + with: + images: git.usbharu.dev/usbharu/pg_backup_job + tags: | + type=raw,value=latest + type=sha,prefix=,suffix=,format=short + - name: build + uses: docker/build-push-action@v5 + with: + file: ./Dockerfile + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..cc5c502 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# デフォルトの無視対象ファイル +/shelf/ +/workspace.xml +# エディターベースの HTTP クライアントリクエスト +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/dataSources.xml b/.idea/dataSources.xml new file mode 100644 index 0000000..78b0fab --- /dev/null +++ b/.idea/dataSources.xml @@ -0,0 +1,17 @@ + + + + + postgresql + true + org.postgresql.Driver + jdbc:postgresql://localhost:5432/postgres + + + + + + $ProjectFileDir$ + + + \ No newline at end of file diff --git a/.idea/jsonSchemas.xml b/.idea/jsonSchemas.xml new file mode 100644 index 0000000..3120128 --- /dev/null +++ b/.idea/jsonSchemas.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..639900d --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..2e43f78 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..030a892 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,20 @@ +# ベースイメージにPostgreSQL 15の公式クライアントを使用 +FROM postgres:15 + +# 必要なツールをインストール +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"] diff --git a/backup.sh b/backup.sh new file mode 100644 index 0000000..5955cdc --- /dev/null +++ b/backup.sh @@ -0,0 +1,34 @@ +#!/bin/bash +set -e + +# 必須環境変数のチェック +if [[ -z "${PG_HOST}" || -z "${PG_PORT}" || -z "${PG_USER}" || -z "${PG_PASSWORD}" || -z "${PG_DATABASE}" || -z "${S3_BUCKET}" || -z "${AWS_ACCESS_KEY_ID}" || -z "${AWS_SECRET_ACCESS_KEY}" ]]; then + echo "必須環境変数が設定されていません。" + 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 "バックアップとアップロードが完了しました。" diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..51868fb --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,62 @@ +version: '3.8' + +services: + db: + image: postgres:15 + container_name: postgres_db + environment: + POSTGRES_USER: testuser + POSTGRES_PASSWORD: testpassword + POSTGRES_DB: testdb + ports: + - "5435:5432" + volumes: + - db_data:/var/lib/postgresql/data + + + pg_dump_uploader: + build: + context: . + dockerfile: Dockerfile + container_name: pg_dump_uploader + environment: + PG_HOST: db + PG_PORT: 5432 + PG_USER: testuser + PG_PASSWORD: testpassword + PG_DATABASE: testdb + S3_BUCKET: test-bucket + AWS_ACCESS_KEY_ID: test-access-key + AWS_SECRET_ACCESS_KEY: test-secret-key + AWS_DEFAULT_REGION: us-east-1 + S3_ENDPOINT: http://minio:9000 + depends_on: + - db + - minio + + minio: + image: minio/minio + container_name: minio + command: server /data --console-address ":9001" + environment: + MINIO_ROOT_USER: test-access-key + MINIO_ROOT_PASSWORD: test-secret-key + ports: + - "9000:9000" + - "9001:9001" + volumes: + - minio_data:/data + createbuckets: + image: minio/mc + depends_on: + - minio + entrypoint: > + /bin/sh -c " + until (/usr/bin/mc config host add myminio http://minio:9000 test-access-key test-secret-key) do echo '...waiting...' && sleep 1; done; + /usr/bin/mc mb myminio/test-bucket; + /usr/bin/mc policy download myminio/test-bucket; + exit 0; + " +volumes: + db_data: + minio_data: diff --git a/pg_backup_job.iml b/pg_backup_job.iml new file mode 100644 index 0000000..9a5cfce --- /dev/null +++ b/pg_backup_job.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file