first commit

This commit is contained in:
usbharu 2024-12-26 13:24:05 +09:00
commit e740a5d93d
Signed by: usbharu
GPG Key ID: 95CBCF7046307B77
11 changed files with 230 additions and 0 deletions

View File

@ -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 }}

8
.idea/.gitignore vendored Normal file
View File

@ -0,0 +1,8 @@
# デフォルトの無視対象ファイル
/shelf/
/workspace.xml
# エディターベースの HTTP クライアントリクエスト
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

17
.idea/dataSources.xml Normal file
View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DataSourceManagerImpl" format="xml" multifile-model="true">
<data-source source="LOCAL" name="postgres@localhost" uuid="da0cdc63-ec5f-4210-aa59-8ae07b84b63f">
<driver-ref>postgresql</driver-ref>
<synchronize>true</synchronize>
<jdbc-driver>org.postgresql.Driver</jdbc-driver>
<jdbc-url>jdbc:postgresql://localhost:5432/postgres</jdbc-url>
<jdbc-additional-properties>
<property name="com.intellij.clouds.kubernetes.db.host.port" />
<property name="com.intellij.clouds.kubernetes.db.enabled" value="false" />
<property name="com.intellij.clouds.kubernetes.db.container.port" />
</jdbc-additional-properties>
<working-dir>$ProjectFileDir$</working-dir>
</data-source>
</component>
</project>

25
.idea/jsonSchemas.xml Normal file
View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="JsonSchemaMappingsProjectConfiguration">
<state>
<map>
<entry key="docker-compose.yml">
<value>
<SchemaInfo>
<option name="name" value="docker-compose.yml" />
<option name="relativePathToSchema" value="https://raw.githubusercontent.com/compose-spec/compose-spec/master/schema/compose-spec.json" />
<option name="applicationDefined" value="true" />
<option name="patterns">
<list>
<Item>
<option name="path" value="docker-compose.yml" />
</Item>
</list>
</option>
</SchemaInfo>
</value>
</entry>
</map>
</state>
</component>
</project>

6
.idea/misc.xml Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>

8
.idea/modules.xml Normal file
View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/pg_backup_job.iml" filepath="$PROJECT_DIR$/pg_backup_job.iml" />
</modules>
</component>
</project>

6
.idea/vcs.xml Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

20
Dockerfile Normal file
View File

@ -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"]

34
backup.sh Normal file
View File

@ -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 "バックアップとアップロードが完了しました。"

62
docker-compose.yml Normal file
View File

@ -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:

8
pg_backup_job.iml Normal file
View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="GENERAL_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>