From 93b8c894e6a27877b4da1116313e1ec0dca101b0 Mon Sep 17 00:00:00 2001 From: Rasaboun <40967731+Rasaboun@users.noreply.github.com> Date: Sun, 29 Mar 2026 15:23:20 +0200 Subject: [PATCH 1/3] chore: replace MinIO with RustFS in docker-compose deployments MinIO's community edition entered maintenance mode (Dec 2025) and is no longer actively maintained. Replace with RustFS, an S3-compatible Apache 2.0 alternative that uses the same port 9000. This change targets new deployments only. The service name `plane-minio` is kept for backward compatibility with the Caddyfile, install.sh, and backup scripts. Existing deployments should not upgrade in-place without migrating their storage data first. Closes #8774 --- .env.example | 4 ++-- apps/api/.env.example | 6 ++--- deployments/cli/community/docker-compose.yml | 23 ++++++++++---------- docker-compose.yml | 11 +++++----- 4 files changed, 23 insertions(+), 21 deletions(-) diff --git a/.env.example b/.env.example index 90efa8b412c..4114add7182 100644 --- a/.env.example +++ b/.env.example @@ -23,7 +23,7 @@ AWS_REGION="" AWS_ACCESS_KEY_ID="access-key" AWS_SECRET_ACCESS_KEY="secret-key" AWS_S3_ENDPOINT_URL="http://plane-minio:9000" -# Changing this requires change in the proxy config for uploads if using minio setup +# Changing this requires change in the proxy config for uploads if using the bundled storage AWS_S3_BUCKET_NAME="uploads" # Maximum file upload limit FILE_SIZE_LIMIT=5242880 @@ -36,7 +36,7 @@ GPT_ENGINE="gpt-3.5-turbo" # deprecated # Settings related to Docker DOCKERIZED=1 # deprecated -# set to 1 If using the pre-configured minio setup +# set to 1 if using the pre-configured S3-compatible storage (RustFS) USE_MINIO=1 # If SSL Cert to be generated, set CERT_EMAIl="email " diff --git a/apps/api/.env.example b/apps/api/.env.example index 4c84bd68373..79eff4af1f3 100644 --- a/apps/api/.env.example +++ b/apps/api/.env.example @@ -28,7 +28,7 @@ AWS_REGION="" AWS_ACCESS_KEY_ID="access-key" AWS_SECRET_ACCESS_KEY="secret-key" AWS_S3_ENDPOINT_URL="http://localhost:9000" -# Changing this requires change in the proxy config for uploads if using minio setup +# Changing this requires change in the proxy config for uploads if using the bundled storage AWS_S3_BUCKET_NAME="uploads" # Maximum file upload limit FILE_SIZE_LIMIT=5242880 @@ -39,12 +39,12 @@ SIGNED_URL_EXPIRATION=3600 # Settings related to Docker DOCKERIZED=1 # deprecated -# set to 1 If using the pre-configured minio setup +# set to 1 if using the pre-configured S3-compatible storage (RustFS) USE_MINIO=0 -# Email redirections and minio domain settings +# Email redirections and storage domain settings WEB_URL="http://localhost:8000" # Gunicorn Workers diff --git a/deployments/cli/community/docker-compose.yml b/deployments/cli/community/docker-compose.yml index d4de33a749a..2756e5f69a8 100644 --- a/deployments/cli/community/docker-compose.yml +++ b/deployments/cli/community/docker-compose.yml @@ -12,9 +12,11 @@ x-redis-env: &redis-env REDIS_PORT: ${REDIS_PORT:-6379} REDIS_URL: ${REDIS_URL:-redis://plane-redis:6379/} -x-minio-env: &minio-env - MINIO_ROOT_USER: ${AWS_ACCESS_KEY_ID:-access-key} - MINIO_ROOT_PASSWORD: ${AWS_SECRET_ACCESS_KEY:-secret-key} +x-storage-env: &storage-env + RUSTFS_ACCESS_KEY: ${AWS_ACCESS_KEY_ID:-access-key} + RUSTFS_SECRET_KEY: ${AWS_SECRET_ACCESS_KEY:-secret-key} + RUSTFS_VOLUMES: /data + RUSTFS_ADDRESS: 0.0.0.0:9000 x-aws-s3-env: &aws-s3-env AWS_REGION: ${AWS_REGION:-} @@ -113,7 +115,7 @@ services: volumes: - logs_api:/code/plane/logs environment: - <<: [*app-env, *db-env, *redis-env, *minio-env, *aws-s3-env, *proxy-env] + <<: [*app-env, *db-env, *redis-env, *storage-env, *aws-s3-env, *proxy-env] depends_on: - plane-db - plane-redis @@ -129,7 +131,7 @@ services: volumes: - logs_worker:/code/plane/logs environment: - <<: [*app-env, *db-env, *redis-env, *minio-env, *aws-s3-env, *proxy-env] + <<: [*app-env, *db-env, *redis-env, *storage-env, *aws-s3-env, *proxy-env] depends_on: - api - plane-db @@ -146,7 +148,7 @@ services: volumes: - logs_beat-worker:/code/plane/logs environment: - <<: [*app-env, *db-env, *redis-env, *minio-env, *aws-s3-env, *proxy-env] + <<: [*app-env, *db-env, *redis-env, *storage-env, *aws-s3-env, *proxy-env] depends_on: - api - plane-db @@ -163,7 +165,7 @@ services: volumes: - logs_migrator:/code/plane/logs environment: - <<: [*app-env, *db-env, *redis-env, *minio-env, *aws-s3-env, *proxy-env] + <<: [*app-env, *db-env, *redis-env, *storage-env, *aws-s3-env, *proxy-env] depends_on: - plane-db - plane-redis @@ -203,16 +205,15 @@ services: # Comment this if you using any external s3 compatible storage plane-minio: - image: minio/minio:latest - command: server /export --console-address ":9090" + image: rustfs/rustfs:1.0.0-alpha.90 deploy: replicas: 1 restart_policy: condition: any environment: - <<: *minio-env + <<: *storage-env volumes: - - uploads:/export + - uploads:/data # Comment this if you already have a reverse proxy running proxy: diff --git a/docker-compose.yml b/docker-compose.yml index 787ba640aa6..7177d2fdc33 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -142,14 +142,15 @@ services: plane-minio: container_name: plane-minio - image: minio/minio + image: rustfs/rustfs:1.0.0-alpha.90 restart: always - command: server /export --console-address ":9090" volumes: - - uploads:/export + - uploads:/data environment: - MINIO_ROOT_USER: ${AWS_ACCESS_KEY_ID} - MINIO_ROOT_PASSWORD: ${AWS_SECRET_ACCESS_KEY} + RUSTFS_ACCESS_KEY: ${AWS_ACCESS_KEY_ID} + RUSTFS_SECRET_KEY: ${AWS_SECRET_ACCESS_KEY} + RUSTFS_VOLUMES: /data + RUSTFS_ADDRESS: 0.0.0.0:9000 # Comment this if you already have a reverse proxy running proxy: From 3c3a1363100d4cc837f39e50a406bd0d3421a4a1 Mon Sep 17 00:00:00 2001 From: Rasaboun <40967731+Rasaboun@users.noreply.github.com> Date: Sun, 29 Mar 2026 15:43:13 +0200 Subject: [PATCH 2/3] fix: address review feedback MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Remove *storage-env from backend services (they only need *aws-s3-env) - Update backup script path /export → /data to match new volume mount --- deployments/cli/community/docker-compose.yml | 8 ++++---- deployments/cli/community/install.sh | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/deployments/cli/community/docker-compose.yml b/deployments/cli/community/docker-compose.yml index 2756e5f69a8..64c3fa54a3a 100644 --- a/deployments/cli/community/docker-compose.yml +++ b/deployments/cli/community/docker-compose.yml @@ -115,7 +115,7 @@ services: volumes: - logs_api:/code/plane/logs environment: - <<: [*app-env, *db-env, *redis-env, *storage-env, *aws-s3-env, *proxy-env] + <<: [*app-env, *db-env, *redis-env, *aws-s3-env, *proxy-env] depends_on: - plane-db - plane-redis @@ -131,7 +131,7 @@ services: volumes: - logs_worker:/code/plane/logs environment: - <<: [*app-env, *db-env, *redis-env, *storage-env, *aws-s3-env, *proxy-env] + <<: [*app-env, *db-env, *redis-env, *aws-s3-env, *proxy-env] depends_on: - api - plane-db @@ -148,7 +148,7 @@ services: volumes: - logs_beat-worker:/code/plane/logs environment: - <<: [*app-env, *db-env, *redis-env, *storage-env, *aws-s3-env, *proxy-env] + <<: [*app-env, *db-env, *redis-env, *aws-s3-env, *proxy-env] depends_on: - api - plane-db @@ -165,7 +165,7 @@ services: volumes: - logs_migrator:/code/plane/logs environment: - <<: [*app-env, *db-env, *redis-env, *storage-env, *aws-s3-env, *proxy-env] + <<: [*app-env, *db-env, *redis-env, *aws-s3-env, *proxy-env] depends_on: - plane-db - plane-redis diff --git a/deployments/cli/community/install.sh b/deployments/cli/community/install.sh index 582aa839413..6436de072d3 100755 --- a/deployments/cli/community/install.sh +++ b/deployments/cli/community/install.sh @@ -597,7 +597,7 @@ function backupData() { fi backup_container_dir "$BACKUP_FOLDER" "plane-db" "/var/lib/postgresql/data" "pgdata" || exit 1 - backup_container_dir "$BACKUP_FOLDER" "plane-minio" "/export" "uploads" || exit 1 + backup_container_dir "$BACKUP_FOLDER" "plane-minio" "/data" "uploads" || exit 1 backup_container_dir "$BACKUP_FOLDER" "plane-mq" "/var/lib/rabbitmq" "rabbitmq_data" || exit 1 backup_container_dir "$BACKUP_FOLDER" "plane-redis" "/data" "redisdata" || exit 1 From 4ea16a0b294bd0cdf60436968d79efb7afa51875 Mon Sep 17 00:00:00 2001 From: Rasaboun <40967731+Rasaboun@users.noreply.github.com> Date: Mon, 30 Mar 2026 12:22:51 +0200 Subject: [PATCH 3/3] chore: add migration warning, console port note, and healthcheck - Add inline comments warning that RustFS uses a different on-disk format than MinIO (existing deployments must migrate data first) - Document that the admin console moved from port 9090 to 9001 - Add healthcheck using RustFS's /health endpoint --- deployments/cli/community/docker-compose.yml | 8 ++++++++ docker-compose.yml | 8 ++++++++ 2 files changed, 16 insertions(+) diff --git a/deployments/cli/community/docker-compose.yml b/deployments/cli/community/docker-compose.yml index 64c3fa54a3a..b902ac98b58 100644 --- a/deployments/cli/community/docker-compose.yml +++ b/deployments/cli/community/docker-compose.yml @@ -204,6 +204,9 @@ services: - rabbitmq_data:/var/lib/rabbitmq # Comment this if you using any external s3 compatible storage + # NOTE: RustFS uses a different on-disk format than MinIO. + # Existing MinIO deployments must migrate data before switching. + # Admin console is available on port 9001 (was 9090 with MinIO). plane-minio: image: rustfs/rustfs:1.0.0-alpha.90 deploy: @@ -214,6 +217,11 @@ services: <<: *storage-env volumes: - uploads:/data + healthcheck: + test: ["CMD", "curl", "-f", "http://127.0.0.1:9000/health"] + interval: 30s + timeout: 5s + retries: 3 # Comment this if you already have a reverse proxy running proxy: diff --git a/docker-compose.yml b/docker-compose.yml index 7177d2fdc33..3aab901340c 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -140,6 +140,9 @@ services: volumes: - rabbitmq_data:/var/lib/rabbitmq + # NOTE: RustFS uses a different on-disk format than MinIO. + # Existing MinIO deployments must migrate data before switching. + # Admin console is available on port 9001 (was 9090 with MinIO). plane-minio: container_name: plane-minio image: rustfs/rustfs:1.0.0-alpha.90 @@ -151,6 +154,11 @@ services: RUSTFS_SECRET_KEY: ${AWS_SECRET_ACCESS_KEY} RUSTFS_VOLUMES: /data RUSTFS_ADDRESS: 0.0.0.0:9000 + healthcheck: + test: ["CMD", "curl", "-f", "http://127.0.0.1:9000/health"] + interval: 30s + timeout: 5s + retries: 3 # Comment this if you already have a reverse proxy running proxy: