From df0e6cdbfacc42c44127d86d49132ccbd5427795 Mon Sep 17 00:00:00 2001 From: Olivier Sotin Date: Fri, 30 Oct 2026 14:43:35 +0100 Subject: [PATCH 1/2] chore(compose): run RustFS as object storage (#171) --- .env.sample | 2 +- README.md | 17 +++++++++++++++++ docker-compose.dev.yml | 17 +++++++++++++---- docker-compose.yml | 11 ++++++----- 4 files changed, 37 insertions(+), 10 deletions(-) diff --git a/.env.sample b/.env.sample index f1b1812..0a33794 100644 --- a/.env.sample +++ b/.env.sample @@ -91,7 +91,7 @@ XTM_ONE_SECRET_KEY=ChangeMeWithGeneratedRandomString # Credentials for the dedicated pgsql-xtm-one Postgres instance. XTM_ONE_POSTGRES_USER=xtmone XTM_ONE_POSTGRES_PASSWORD=ChangeMe -# Optional: bucket name in the shared S3 object storage (Silo, auto-created on first boot) +# Optional: bucket name in the shared S3 object storage (RustFS, auto-created on first boot) XTM_ONE_S3_BUCKET=xtm-one-files # Optional: enterprise license PEM (leave empty in xtm_one mode) XTM_ONE_ENTERPRISE_LICENSE= diff --git a/README.md b/README.md index d64bd0e..58012a3 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,23 @@ the [OpenAEV documentation space](https://docs.openaev.io/latest/deployment/inst --- +## 🗄️ Object storage + +The `minio` service runs [RustFS](https://rustfs.com), an open source (Apache 2.0) S3-compatible object storage. The +service name, the `s3data` volume and the `MINIO_ROOT_USER` / `MINIO_ROOT_PASSWORD` variables keep their former names, +so the OpenAEV, collectors and XTM One settings do not change. + +Upgrading a stack that ran MinIO or Silo: RustFS does not start on an `s3data` volume written by MinIO or Silo +(`Permission denied`: that volume belongs to root, RustFS runs as uid 10001). Back up the volume and follow the migration +guide listed in the [breaking changes of the OpenAEV documentation](https://docs.openaev.io/latest/deployment/breaking-changes/) +before starting the stack with the new compose file. Its first steps run with the previous compose file: if you update +this clone with `git pull`, run them before the pull. + +Development stack (`docker-compose.dev.yml`): `openaev-dev-minio` now keeps its data in the named volume `rustfsdata`, +which starts empty. Files stored by the previous Silo container stay in its anonymous volume and are not carried over. + +--- + ## 👥 Community ### 🛠️ Status & Bugs diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index 59bac8d..ab5e2f1 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -12,14 +12,20 @@ services: restart: unless-stopped openaev-dev-minio: container_name: openaev-dev-minio - image: pgsty/silo:latest + image: rustfs/rustfs:1.0.4 ports: - "9000:9000" - "9001:9001" environment: - MINIO_ROOT_USER: ${MINIO_ROOT_USER} - MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD} - command: server /data --console-address ":9001" + RUSTFS_ACCESS_KEY: ${MINIO_ROOT_USER} + RUSTFS_SECRET_KEY: ${MINIO_ROOT_PASSWORD} + RUSTFS_CONSOLE_ENABLE: "true" + RUSTFS_CONSOLE_ADDRESS: ":9001" + RUSTFS_OBS_LOG_DIRECTORY: "" # logs to stdout instead of /logs + volumes: + # Named volume: the anonymous /data volume of a previous MinIO or Silo container is owned by root, + # and RustFS (uid 10001) cannot start on it + - rustfsdata:/data restart: unless-stopped openaev-dev-rabbitmq: container_name: openaev-dev-rabbitmq @@ -32,3 +38,6 @@ services: ports: - "5672:5672" - "15672:15672" + +volumes: + rustfsdata: diff --git a/docker-compose.yml b/docker-compose.yml index 8a1627f..414418a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -58,21 +58,22 @@ services: timeout: 5s retries: 5 minio: - image: pgsty/silo:latest + image: rustfs/rustfs:1.0.4 volumes: - s3data:/data ports: - "9000:9000" environment: - MINIO_ROOT_USER: ${MINIO_ROOT_USER} - MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD} - command: server /data + RUSTFS_ACCESS_KEY: ${MINIO_ROOT_USER} + RUSTFS_SECRET_KEY: ${MINIO_ROOT_PASSWORD} + RUSTFS_OBS_LOG_DIRECTORY: "" # logs to stdout (docker logs) instead of files inside the container restart: always healthcheck: - test: ["CMD", "mc", "ready", "local"] + test: ["CMD", "curl", "-f", "http://localhost:9000/health/ready"] interval: 10s timeout: 5s retries: 5 + start_period: 60s rabbitmq: image: rabbitmq:4.4-management environment: From 41e0420ee6226364584fb0b9f3aec66ebdff0994 Mon Sep 17 00:00:00 2001 From: Olivier Sotin Date: Mon, 2 Nov 2026 21:20:01 +0100 Subject: [PATCH 2/2] chore(compose): disable the RustFS update check (#171) --- docker-compose.dev.yml | 1 + docker-compose.yml | 1 + 2 files changed, 2 insertions(+) diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index ab5e2f1..48c079b 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -22,6 +22,7 @@ services: RUSTFS_CONSOLE_ENABLE: "true" RUSTFS_CONSOLE_ADDRESS: ":9001" RUSTFS_OBS_LOG_DIRECTORY: "" # logs to stdout instead of /logs + RUSTFS_CHECK_UPDATE: "false" # no call to version.rustfs.com at each start volumes: # Named volume: the anonymous /data volume of a previous MinIO or Silo container is owned by root, # and RustFS (uid 10001) cannot start on it diff --git a/docker-compose.yml b/docker-compose.yml index 414418a..1c95923 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -67,6 +67,7 @@ services: RUSTFS_ACCESS_KEY: ${MINIO_ROOT_USER} RUSTFS_SECRET_KEY: ${MINIO_ROOT_PASSWORD} RUSTFS_OBS_LOG_DIRECTORY: "" # logs to stdout (docker logs) instead of files inside the container + RUSTFS_CHECK_UPDATE: "false" # no call to version.rustfs.com at each start restart: always healthcheck: test: ["CMD", "curl", "-f", "http://localhost:9000/health/ready"]