From ae1a821b64e2f73e373575442f7f690d96c7b7af Mon Sep 17 00:00:00 2001 From: Tomas Kislan Date: Wed, 21 Aug 2019 22:48:56 +0200 Subject: [PATCH] Add minio documentation (#9267) * Add minio documentation * Update minio.markdown * Update minio.markdown * Review changes * :pencil2: Tweak * Update minio.markdown * :pencil2: Tweak * :pencil2: Tweak --- source/_components/minio.markdown | 153 +++++++++++++++++++++++ source/images/supported_brands/minio.png | Bin 0 -> 11496 bytes 2 files changed, 153 insertions(+) create mode 100644 source/_components/minio.markdown create mode 100644 source/images/supported_brands/minio.png diff --git a/source/_components/minio.markdown b/source/_components/minio.markdown new file mode 100644 index 00000000000..e4bba03e2ea --- /dev/null +++ b/source/_components/minio.markdown @@ -0,0 +1,153 @@ +--- +title: "Minio" +description: "Integration for interacting with Minio object storage." +logo: minio.png +ha_category: Utility +ha_iot_class: Cloud Push +ha_release: 0.98 +--- + +This integration adds interaction with [Minio](https://min.io). +Also enables to listen for bucket notifications: [watch docs](https://docs.min.io/docs/minio-client-complete-guide.html#watch) + +To download or upload files, folders must be added to [whitelist_external_dirs](/docs/configuration/basic/). + +## Configuration + +To enable the Minio integration in your installation, add the following to your `configuration.yaml` file: + +```yaml +minio: + host: localhost + port: 9000 + access_key: ACCESS_KEY + secret_key: SECRET_KEY + secure: false +``` + +{% configuration %} +host: + description: Minio server host + required: true + type: string +port: + description: Minio server port + required: true + type: integer +access_key: + description: Minio server access key + required: true + type: string +secret_key: + description: Minio server secret key + required: true + type: string +secure: + description: Whether to use http or https connection + required: true + type: boolean + default: false +listen: + description: List of configurations to listen for events to + required: false + default: [] + type: list + keys: + bucket: + description: Bucket to use + required: true + type: string + prefix: + description: What prefix to use to filter file events + required: false + type: string + default: "" + suffix: + description: What file suffix to use to filter file events + required: false + type: string + default: ".*" + events: + description: What file + required: false + type: string + default: "s3:ObjectCreated:*" +{% endconfiguration %} + +## Automations + +Automations can be triggered on new files created on the Minio server using the `data_template`. + +{% raw %} +```yaml +#Automatically upload new local files +automation: +- alias: Upload camera snapshot + trigger: + platform: event + event_type: folder_watcher + event_data: + event_type: created + action: + - delay: '00:00:01' + - service: minio.put + data_template: + file_path: "{{ trigger.event.data.path }}" + bucket: "camera-image-object-detection" + key: "input/{{ now().year }}/{{ (now().month | string).zfill(2) }}/{{ (now().day | string).zfill(2) }}/{{ trigger.event.data.file }}" + - delay: '00:00:01' + - service: shell_command.remove_file + data_template: + file: "{{ trigger.event.data.path }}" + +- alias: Download new Minio file + trigger: + - platform: event + event_type: minio + + condition: [] + action: + - service: minio.get + data_template: + bucket: "{{trigger.event.data.bucket}}" + key: "{{trigger.event.data.key}}" + file_path: "/tmp/{{ trigger.event.data.file_name }}" +``` +{% endraw %} + +## Platform Services + +These services are provided: + +- `get` +- `put` +- `remove` + +### Service `minio.get` + +Download file. + +| Service data attribute | Required | Description | +|---------------------------|----------|---------------------------------------------------| +| `bucket` | yes | Bucket to use | +| `key` | yes | Object key of the file | +| `file_path` | yes | File path on the local file system | + +### Service `minio.put` + +Upload file. + +| Service data attribute | Required | Description | +|---------------------------|----------|---------------------------------------------------| +| `bucket` | yes | Bucket to use | +| `key` | yes | Object key of the file | +| `file_path` | yes | File path on the local file system | + +### Service `minio.remove` + +Delete file. + +| Service data attribute | Required | Description | +|---------------------------|----------|---------------------------------------------------| +| `bucket` | yes | Bucket to use | +| `key` | yes | Object key of the file | diff --git a/source/images/supported_brands/minio.png b/source/images/supported_brands/minio.png new file mode 100644 index 0000000000000000000000000000000000000000..38f6ff9f01d54b07a8af71ccc6b52eb7e18e4ba6 GIT binary patch literal 11496 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 DnX+}P literal 0 HcmV?d00001