Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 7 additions & 5 deletions ix-dev/enterprise/minio/app.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
annotations:
min_scale_version: 24.10.2.2
app_version: RELEASE.2025-04-22T22-12-26Z
app_version: RELEASE.2026-06-06T02-44-06Z
capabilities: []
categories:
- storage
Expand All @@ -14,8 +14,8 @@ keywords:
- minio
- cloud
- s3
lib_version: 2.1.77
lib_version_hash: 1837f8e69ae1adc313330c3b1c2615e9b4d03c5459d657a5898bae78090f8195
lib_version: 2.3.8
lib_version_hash: cd75c897a1e8fef54b5bd00d0d8849f240bc50db2ef650eccc0ee74f3b2b2dc1
maintainers:
- email: dev@truenas.com
name: truenas
Expand All @@ -32,7 +32,9 @@ screenshots:
- https://media.sys.truenas.net/apps/minio/screenshots/screenshot2.png
- https://media.sys.truenas.net/apps/minio/screenshots/screenshot3.png
sources:
- https://apps.truenas.com/catalog/minio_enterprise/
- https://docs.min.io/enterprise/aistor-object-store/installation/container/install/
- https://github.com/minio/minio
title: MinIO
title: AIStor
train: enterprise
version: 1.3.17
version: 1.3.18
5 changes: 5 additions & 0 deletions ix-dev/enterprise/minio/app_migrations.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,8 @@ migrations:
max_version: 1.2.20
target:
min_version: 1.3.0
- file: remove_fields
from:
max_version: 1.3.17
target:
min_version: 1.3.18
5 changes: 3 additions & 2 deletions ix-dev/enterprise/minio/item.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,9 @@ categories:
- storage
icon_url: https://media.sys.truenas.net/apps/minio/icons/icon.png
screenshots:
- https://media.sys.truenas.net/apps/adguard-home/screenshots/screenshot1.png
- https://media.sys.truenas.net/apps/adguard-home/screenshots/screenshot2.png
- https://media.sys.truenas.net/apps/minio/screenshots/screenshot1.png
- https://media.sys.truenas.net/apps/minio/screenshots/screenshot2.png
- https://media.sys.truenas.net/apps/minio/screenshots/screenshot3.png
tags:
- object storage
- minio
Expand Down
5 changes: 3 additions & 2 deletions ix-dev/enterprise/minio/ix_values.yaml
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
images:
image:
repository: minio/minio
tag: RELEASE.2025-04-22T22-12-26Z
repository: quay.io/minio/aistor/minio
tag: RELEASE.2026-06-06T02-44-06Z
container_utils_image:
repository: ixsystems/container-utils
tag: 1.0.2

consts:
minio_container_name: minio
perms_container_name: permissions
license_path: /minio.license
21 changes: 21 additions & 0 deletions ix-dev/enterprise/minio/migrations/remove_fields
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
#!/usr/bin/python3

import os
import sys
import yaml


def migrate(values):
values["minio"]["license_key"] = "replace-me"
values["network"].pop("server_url", None)
values["minio"].pop("logging", None)
return values


if __name__ == "__main__":
if len(sys.argv) != 2:
exit(1)

if os.path.exists(sys.argv[1]):
with open(sys.argv[1], "r") as f:
print(yaml.dump(migrate(yaml.safe_load(f.read()))))
84 changes: 33 additions & 51 deletions ix-dev/enterprise/minio/questions.yaml
Original file line number Diff line number Diff line change
@@ -1,45 +1,56 @@
groups:
- name: MinIO Configuration
description: Configure MinIO
- name: AIStor Configuration
description: Configure AIStor
- name: User and Group Configuration
description: Configure User and Group for MinIO
description: Configure User and Group for AIStor
- name: Network Configuration
description: Configure Network for MinIO
description: Configure Network for AIStor
- name: Storage Configuration
description: Configure Storage for MinIO
description: Configure Storage for AIStor
- name: Labels Configuration
description: Configure Labels for MinIO
description: Configure Labels for AIStor
- name: Resources Configuration
description: Configure Resources for MinIO
description: Configure Resources for AIStor

questions:
- variable: minio
label: ""
group: MinIO Configuration
group: AIStor Configuration
schema:
type: dict
attrs:
- variable: license_key
label: License Key
description: |
License key for AIStor.</br>
Without a valid license, AIStor starts in offline mode and all object storage (S3) operations are blocked until one is added.</br>
Get one for free at https://www.min.io/pricing
schema:
type: string
default: ""
required: true
private: true
- variable: credentials
label: Credentials
description: The credentials for the root user.
schema:
type: dict
attrs:
- variable: access_key
label: MinIO Root User
label: AIStor Root User
description: |
Root user with access to all actions and resources on the deployment. </br>
It doubles as the "access key" for the MinIO deployment.
It doubles as the "access key" for the AIStor deployment.
schema:
type: string
min_length: 5
required: true
private: true
- variable: secret_key
label: MinIO Root Password
label: AIStor Root Password
description: |
Root password for the MinIO root user.</br>
It doubles as the "secret key" for the MinIO deployment.
Root password for the AIStor root user.</br>
It doubles as the "secret key" for the AIStor deployment.
schema:
type: string
min_length: 8
Expand All @@ -53,7 +64,7 @@ questions:
For Multi Node Multi Drive (MNMD), the entry will look like this:</br>
Example Entry - https://minio{1...3}.example.com:30000/data{1...4}</br></br>
Note that each host must use the same port number and the same number of storage items.</br>
In both cases /data{1...4} is the directories to be used for MinIO.
In both cases /data{1...4} is the directories to be used for AIStor.
You have to add additional storage for each data entry.
schema:
type: dict
Expand All @@ -76,24 +87,6 @@ questions:
schema:
type: string
required: true
- variable: logging
label: ""
description: Logging configuration
schema:
type: dict
attrs:
- variable: quiet
label: Quiet
description: Disables startup information.
schema:
type: boolean
default: false
- variable: anonymous
label: Anonymous
description: Hides sensitive information from logging.
schema:
type: boolean
default: false
- variable: additional_envs
label: Additional Environment Variables
schema:
Expand Down Expand Up @@ -123,15 +116,15 @@ questions:
attrs:
- variable: user
label: User ID
description: The user id that MinIO will run as.
description: The user id that AIStor will run as.
schema:
type: int
min: 568
default: 568
required: true
- variable: group
label: Group ID
description: The group id that MinIO will run as.
description: The group id that AIStor will run as.
schema:
type: int
min: 568
Expand All @@ -146,7 +139,7 @@ questions:
attrs:
- variable: api_port
label: API Port
description: The port for the MinIO API.
description: The port for the AIStor API.
schema:
type: dict
attrs:
Expand Down Expand Up @@ -195,7 +188,7 @@ questions:

- variable: console_port
label: Console Port (Web UI)
description: The port for the MinIO Web UI.
description: The port for the AIStor Web UI.
schema:
type: dict
attrs:
Expand Down Expand Up @@ -242,22 +235,11 @@ questions:
$ref:
- definitions/node_bind_ip

- variable: server_url
label: Server URL
description: |
The URL that console will use to reach API</br>
Usually the port is needed, unless you have a reverse proxy in front of MinIO.</br>
For example: </br>
- https://minio1.example.com</br>
- https://minio1.example.com:30000
schema:
type: uri
required: true
- variable: console_url
label: Console URL
description: |
The URL that console will provide as a redirect URL</br>
Usually the port is needed, unless you have a reverse proxy in front of MinIO.</br>
Usually the port is needed, unless you have a reverse proxy in front of AIStor.</br>
For example: </br>
- https://console.example.com.</br>
- https://minio1.example.com:30001
Expand All @@ -273,7 +255,7 @@ questions:
default: false
- variable: certificate_id
label: Certificate
description: The certificate to use for MinIO
description: The certificate to use for AIStor
schema:
type: int
"null": true
Expand Down Expand Up @@ -428,14 +410,14 @@ questions:
attrs:
- variable: cpus
label: CPUs
description: CPUs limit for MinIO.
description: CPUs limit for AIStor.
schema:
type: int
default: 2
required: true
- variable: memory
label: Memory (in MB)
description: Memory limit for MinIO.
description: Memory limit for AIStor.
schema:
type: int
default: 4096
Expand Down
39 changes: 17 additions & 22 deletions ix-dev/enterprise/minio/templates/docker-compose.yaml
Original file line number Diff line number Diff line change
@@ -1,5 +1,13 @@
{% set tpl = ix_lib.base.render.Render(values) %}

{% if values.minio.license_key == "replace-me" %}
{% do tpl.notes.add_warning(
"License key is set to [replace-me] which is not a valid license key. "
"AIStor will run in offline mode and block all object storage (S3) operations "
"until a valid license key is set."
) %}
{% endif %}

{# Validate early #}
{% if values.storage.data_dirs|length == 0 %}
{% do tpl.funcs.fail("At least 1 storage item must be set") %}
Expand All @@ -15,6 +23,7 @@
{% for store in values.storage.data_dirs %}
{% do mount_paths.x.append(store.mount_path.rstrip("/")) %}
{% endfor %}

{% if mount_paths.x|unique|list|length != mount_paths.x|length %}
{% do tpl.funcs.fail("Mount paths in storage items must be unique, found duplicates: [%s]"|format(mount_paths.x|join(", "))) %}
{% endif %}
Expand All @@ -41,35 +50,22 @@
{% set perm_container = tpl.deps.perms(values.consts.perms_container_name) %}
{% set perm_config = {"uid":values.run_as.user, "gid": values.run_as.group, "mode": "check"} %}
{% do c1.set_user(values.run_as.user, values.run_as.group) %}
{% do c1.healthcheck.set_custom_test(["CMD", "mc", "ready", "--insecure", "--cluster-read", "health"]) %}

{% set cmd = namespace(x=[
"server",
"--address", ":%d"|format(values.network.api_port.port_number),
"--console-address", ":%d"|format(values.network.console_port.port_number),
]) %}
{% do c1.healthcheck.set_test("curl", {"port": values.network.api_port.port_number, "path": "/minio/health/live", "scheme": proto}) %}

{% set cmd = namespace(x=["minio", "server"]) %}
{% if values.network.certificate_id %}
{% do cmd.x.extend(["--certs-dir", "/.minio/certs"]) %}

{% set cert = values.ix_certificates[values.network.certificate_id] %}
{% do c1.configs.add("private", cert.privatekey, "/.minio/certs/private.key") %}
{% do c1.configs.add("public", cert.certificate, "/.minio/certs/public.crt") %}
{% endif %}

{% if values.minio.logging.quiet %}
{% do cmd.x.append("--quiet") %}
{% endif %}

{% if values.minio.logging.anonymous %}
{% do cmd.x.append("--anonymous") %}
{% endif %}

{% do c1.set_command(cmd.x) %}

{% if values.minio.license_key %}{% do c1.configs.add("license", values.minio.license_key, values.consts.license_path) %}{% endif %}

{# Stores minio "volumes" that will be passed in the MINIO_VOLUMES env var #}
{% set minio_config_items = namespace(x=[]) %}

{% for store in values.storage.data_dirs %}
{% do c1.add_storage(store.mount_path, store) %}
{% do perm_container.add_or_skip_action(store.mount_path, store, perm_config) %}
Expand All @@ -78,18 +74,17 @@
{% endfor %}

{% do c1.environment.add_user_envs(values.minio.additional_envs) %}
{% do c1.environment.add_env("MC_HOST_health", "%s://localhost:%d" | format(proto, values.network.api_port.port_number)) %}
{% do c1.environment.add_env("MINIO_ROOT_USER", values.minio.credentials.access_key) %}
{% do c1.environment.add_env("MINIO_ROOT_PASSWORD", values.minio.credentials.secret_key) %}

{% if values.network.server_url %}
{% do c1.environment.add_env("MINIO_SERVER_URL", values.network.server_url) %}
{% endif %}
{% do c1.environment.add_env("MINIO_LICENSE", values.consts.license_path) %}
{% do c1.environment.add_env("MINIO_ADDRESS", ":%d"|format(values.network.api_port.port_number)) %}
{% do c1.environment.add_env("MINIO_CONSOLE_ADDRESS", ":%d"|format(values.network.console_port.port_number)) %}

{% if values.network.console_url %}
{% do c1.environment.add_env("MINIO_BROWSER_REDIRECT_URL", values.network.console_url) %}
{% endif %}

{# https://docs.min.io/aistor/operations/scaling/expansion/expand-aistor-linux/#environment-variable-method #}
{% if values.minio.multi_mode.entries %}
{% do c1.environment.add_env("MINIO_VOLUMES", values.minio.multi_mode.entries|join(" ")) %}
{% else %}
Expand Down
Loading
Loading