From 289271dcf948ce7df02442ca5dcdf6203892de93 Mon Sep 17 00:00:00 2001 From: Alex Manning Date: Sun, 22 Oct 2023 22:21:25 +0100 Subject: [PATCH] Add minio backup client. --- minio-backup/Dockerfile | 11 +++++++++++ minio-backup/config.yaml | 37 ++++++++++++++++++++++++++++++++++++ minio-backup/run.py | 41 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 89 insertions(+) create mode 100644 minio-backup/Dockerfile create mode 100644 minio-backup/config.yaml create mode 100644 minio-backup/run.py diff --git a/minio-backup/Dockerfile b/minio-backup/Dockerfile new file mode 100644 index 0000000..0b0f42d --- /dev/null +++ b/minio-backup/Dockerfile @@ -0,0 +1,11 @@ +ARG BUILD_FROM +FROM ${BUILD_FROM} + +ENV LANG C.UTF-8 + +COPY run.py / +RUN chmod a+x /run.py + +RUN pip3 install --upgrade minio + +CMD [ "/run.py" ] diff --git a/minio-backup/config.yaml b/minio-backup/config.yaml new file mode 100644 index 0000000..04698f1 --- /dev/null +++ b/minio-backup/config.yaml @@ -0,0 +1,37 @@ +name: "Minio Backup" +version: "0.0.1" +slug: minio-backup +description: >- + "Backup the backup folder using minio." +arch: + - armhf + - armv7 + - aarch64 + - amd64 + - i386 +map: + - backup:rw +build_from: + armhf: ghcr.io/home-assistant/armhf-base-python + armv7: ghcr.io/home-assistant/armv7-base-python + aarch64: ghcr.io/home-assistant/aarch64-base-python + amd64: ghcr.io/home-assistant/amd64-base-python + i386: ghcr.io/home-assistant/i386-base-python + +init: false +startup: "once" +advanced: true +hassio_api: true +hassio_role: "backup" + +options: + minio_url: "" + minio_access_key: "" + minio_secret_key: "" + minio_bucket: "" + +schema: + minio_url: "str" + minio_access_key: "str" + minio_secret_key: "str" + minio_bucket: "str" diff --git a/minio-backup/run.py b/minio-backup/run.py new file mode 100644 index 0000000..1c46162 --- /dev/null +++ b/minio-backup/run.py @@ -0,0 +1,41 @@ +#!/usr/bin/python3 + +import json +import pathlib + +import minio + + +def main(): + # Load the user configuration. + with open("/data/options.json", "r") as f: + config = json.load(f) + + client = minio.Minio( + config["minio_url"], + access_key=config["minio_access_key"], + secret_key=config["minio_secret_key"], + ) + + found = client.bucket_exists(config["minio_bucket"]) + if not found: + client.make_bucket(config["minio_bucket"]) + else: + print(f"Bucket {config['minio_bucket']} already exists") + + backup_folder = pathlib.Path("/backup") + objects = [x.object_name for x in client.list_objects(config["minio_bucket"])] + + to_upload = [x for x in backup_folder.iterdir() if x.name not in objects] + + for file in to_upload: + client.fput_object( + config["minio_bucket"], + file.name, + str(file.resolve()), + ) + print(f"Uploaded {file.name}") + + +if __name__ == "__main__": + main()