Skip to content

chore: replace MinIO with RustFS in docker-compose deployments#8820

Open
Rasaboun wants to merge 3 commits intomakeplane:previewfrom
Rasaboun:fix/replace-minio-with-rustfs
Open

chore: replace MinIO with RustFS in docker-compose deployments#8820
Rasaboun wants to merge 3 commits intomakeplane:previewfrom
Rasaboun:fix/replace-minio-with-rustfs

Conversation

@Rasaboun
Copy link
Copy Markdown

@Rasaboun Rasaboun commented Mar 29, 2026

Closes #8774

Summary

MinIO's community edition is no longer maintained admin UI stripped Docker images discontinued and the GitHub repo is in maintenance mode since Feb 13 2026

This replaces "minio/minio" with RustFS (rustfs/rustfs:1.0.0-alpha.90) an S3-compatible drop-in alternative licensed under Apache 2.0

What changed

  • docker-compose.yml and deployments/cli/community/docker-compose.yml: swapped the image, updated env vars (MINIO_ROOT_USERRUSTFS_ACCESS_KEY), changed volume mount (/export/data), removed the MinIO command, added healthcheck (/health endpoint), added migration warning comments
  • deployments/cli/community/install.sh: updated backup path from /export to /data to match the new RustFS volume mount
  • .env.example and apps/api/.env.example: updated comments only
  • Admin console port changed from 9090 to 9001: MinIO used --console-address ":9090", RustFS serves its built-in console on port 9001 by default (this port was never published in the compose files, only accessible inside the Docker network or via manual port forwarding)

What was intentionally NOT changed

  • Service name plane-minio: kept for backward compatibility with Caddyfile.ce, install.sh, swarm.sh, and backup scripts
  • USE_MINIO / MINIO_ENDPOINT_SSL env vars: consumed by the Python backend (storage.py), renaming would require code changes
  • Python backend code: uses boto3 (standard S3 SDK), works with any S3-compatible storage as-is
  • AIO deployment: already uses USE_MINIO=0 with external S3, doesn't include the storage container
  • docker-compose-local.yml (local dev): still uses minio/minio with the mc bucket-init entrypoint — updating the local dev setup is left for a separate PR

Scope

This targets new deployments only. Existing deployments should not upgrade in-place without migrating storage data first (MinIO and RustFS use different on-disk formats). A migration guide or script could be added in a follow-up.

Longer-term suggestion

The storage layer could be made fully S3-agnostic by renaming USE_MINIOUSE_LOCAL_S3 and removing product-specific naming throughout
This PR intentionally avoids that scope to keep things minimal and reviewable

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 makeplane#8774
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai bot commented Mar 29, 2026

📝 Walkthrough

Walkthrough

Replace MinIO with RustFS as the bundled S3-compatible object storage in compose deployments; update environment examples and comments to reference RustFS/bundled storage and adjust backup/install scripts to use /data paths.

Changes

Cohort / File(s) Summary
Environment examples
\.env.example, apps/api/.env.example
Updated comment text to refer to bundled RustFS / pre-configured S3-compatible storage (RustFS) and adjusted guidance for AWS_S3_BUCKET_NAME, USE_MINIO, and WEB_URL. No env variable names or semantics changed.
Compose - community deployment
deployments/cli/community/docker-compose.yml
Replaced x-minio-env/*minio-env with x-storage-env/*storage-env; switched service image from minio/minio:latestrustfs/rustfs:1.0.0-alpha.90; changed env vars (MINIO_*RUSTFS_*), added RUSTFS_VOLUMES and RUSTFS_ADDRESS, and changed mounted path /export/data.
Top-level compose
docker-compose.yml
Switched the plane-minio service image to rustfs/rustfs:1.0.0-alpha.90; removed MinIO server command; updated env keys to RustFS equivalents and volume mount to /data.
Install/backup script
deployments/cli/community/install.sh
Adjusted backup source path for plane-minio container from /export to /data to match RustFS layout.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Poem

🐰 A hop, a change, the storage sways,
RustFS wakes to brighter days,
From /export to /data we leap,
Config notes updated, tidy and neat,
Tiny paws applaud the storage keep.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title 'chore: replace MinIO with RustFS in docker-compose deployments' clearly and specifically summarizes the main change—replacing MinIO with RustFS in docker-compose files.
Linked Issues check ✅ Passed The PR addresses issue #8774 by replacing minio/minio with an actively maintained S3-compatible alternative (RustFS), directly responding to the maintenance-only status concern and providing clarity on the migration strategy.
Out of Scope Changes check ✅ Passed All changes are directly related to the migration from MinIO to RustFS. The PR intentionally avoids broader refactoring (like renaming USE_MINIO), maintains backward compatibility, and focuses narrowly on the image/environment variable swap.
Description check ✅ Passed The pull request description is comprehensive and well-structured, covering summary, detailed changes, intentional exclusions, scope, and follow-up suggestions.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@Rasaboun Rasaboun marked this pull request as ready for review March 29, 2026 13:27
Copilot AI review requested due to automatic review settings March 29, 2026 13:27
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Replaces the MinIO container used in docker-compose-based deployments with RustFS as the bundled S3-compatible storage service.

Changes:

  • Swap minio/minio images for rustfs/rustfs:1.0.0-alpha.90 in the selfhost and CLI community compose files.
  • Update storage container environment variables and data volume mount path (/export/data) accordingly.
  • Refresh .env.example comments to refer to “bundled storage” / RustFS instead of MinIO.

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated 3 comments.

File Description
docker-compose.yml Replaces MinIO service image/config with RustFS for bundled S3 storage.
deployments/cli/community/docker-compose.yml Updates the CLI community deployment to run RustFS and inject new storage env vars.
apps/api/.env.example Comment-only updates to reflect bundled storage wording.
.env.example Comment-only updates to reflect bundled storage wording.

plane-minio:
container_name: plane-minio
image: minio/minio
image: rustfs/rustfs:1.0.0-alpha.90
Copy link

Copilot AI Mar 29, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The storage service now uses an alpha/pre-release image tag (rustfs/rustfs:1.0.0-alpha.90). For deployment reproducibility and risk reduction, prefer a stable release, or at least pin the image by digest so upgrades are explicit and supply-chain risk is reduced.

Suggested change
image: rustfs/rustfs:1.0.0-alpha.90
image: rustfs/rustfs:1.0.0-alpha.90@sha256:1111111111111111111111111111111111111111111111111111111111111111

Copilot uses AI. Check for mistakes.
plane-minio:
image: minio/minio:latest
command: server /export --console-address ":9090"
image: rustfs/rustfs:1.0.0-alpha.90
Copy link

Copilot AI Mar 29, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The storage service now uses an alpha/pre-release image tag (rustfs/rustfs:1.0.0-alpha.90). For deployment reproducibility and risk reduction, prefer a stable release, or at least pin the image by digest so upgrades are explicit and supply-chain risk is reduced.

Suggested change
image: rustfs/rustfs:1.0.0-alpha.90
image: rustfs/rustfs:1.0.0

Copilot uses AI. Check for mistakes.
Comment on lines 213 to +216
environment:
<<: *minio-env
<<: *storage-env
volumes:
- uploads:/export
- uploads:/data
Copy link

Copilot AI Mar 29, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The RustFS volume mount was changed from /export to /data, but the community installer/backup script still backs up plane-minio from /export (deployments/cli/community/install.sh:600). This breaks backups and contradicts the stated backward-compatibility intent—either keep the mount at /export (and set RUSTFS_VOLUMES accordingly) or update the backup script to use /data in the same PR.

Copilot uses AI. Check for mistakes.
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🧹 Nitpick comments (2)
deployments/cli/community/docker-compose.yml (1)

118-118: Consider removing *storage-env from application services.

The api, worker, beat-worker, and migrator services include *storage-env in their environment merge, but these services don't read RUSTFS_* variables—they use AWS_* variables from *aws-s3-env (as shown in storage.py, export_task.py, and create_bucket.py). Only the plane-minio service needs *storage-env.

This doesn't break functionality but adds unnecessary environment variables to these containers.

🧹 Suggested cleanup for api service (apply similarly to worker, beat-worker, migrator)
   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]

Also applies to: 134-134, 151-151, 168-168

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@deployments/cli/community/docker-compose.yml` at line 118, The docker-compose
services api, worker, beat-worker and migrator are merging in the *storage-env
(RUSTFS_*) variables even though their code (storage.py, export_task.py,
create_bucket.py) uses AWS_* vars from *aws-s3-env; remove *storage-env from the
environment merge for the api, worker, beat-worker and migrator services and
leave *storage-env only on the plane-minio service so containers don’t receive
unnecessary RUSTFS_* variables.
apps/api/.env.example (1)

44-46: Minor: Remove extra blank lines.

Static analysis detected consecutive blank lines at lines 45-46, which can be cleaned up for consistency.

🧹 Suggested fix
 # set to 1 if using the pre-configured S3-compatible storage (RustFS)
 USE_MINIO=0
-
-
 
 # Email redirections and storage domain settings
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@apps/api/.env.example` around lines 44 - 46, Remove the consecutive blank
lines found in the .env example file so there are no multiple adjacent empty
lines—leave at most a single newline separator and ensure the file ends with a
single trailing newline (i.e., collapse the extra blank lines into one and
remove the extra empty lines at the end).
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@deployments/cli/community/docker-compose.yml`:
- Line 208: The docker-compose service currently pins the container image to the
unstable tag "rustfs/rustfs:1.0.0-alpha.90"; update the image reference used in
this compose file (the line specifying image: rustfs/rustfs:1.0.0-alpha.90) to
the stable release tag once available (e.g., replace with the stable semver tag
or :latest per your release policy) and ensure you apply the same change to the
main docker-compose.yml so both deployments use the identical, non-alpha image
tag.

In `@docker-compose.yml`:
- Line 145: The docker-compose uses an alpha RustFS image ("image:
rustfs/rustfs:1.0.0-alpha.90"), which is not production-ready; update the
deployment to either point to an approved stable image or gate this alpha image
behind an explicit approval/config flag and documentation; specifically change
the image reference or add a conditional/environment flag and ensure you add
deployment notes documenting the alpha status, limitations, monitoring/rollback
procedures, and a migration plan for when a stable rustfs release is available
so operators must explicitly opt-in before using rustfs/rustfs:1.0.0-alpha.90.

---

Nitpick comments:
In `@apps/api/.env.example`:
- Around line 44-46: Remove the consecutive blank lines found in the .env
example file so there are no multiple adjacent empty lines—leave at most a
single newline separator and ensure the file ends with a single trailing newline
(i.e., collapse the extra blank lines into one and remove the extra empty lines
at the end).

In `@deployments/cli/community/docker-compose.yml`:
- Line 118: The docker-compose services api, worker, beat-worker and migrator
are merging in the *storage-env (RUSTFS_*) variables even though their code
(storage.py, export_task.py, create_bucket.py) uses AWS_* vars from *aws-s3-env;
remove *storage-env from the environment merge for the api, worker, beat-worker
and migrator services and leave *storage-env only on the plane-minio service so
containers don’t receive unnecessary RUSTFS_* variables.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 79cf3b88-ad8f-40de-bbac-7aae9e2a5f89

📥 Commits

Reviewing files that changed from the base of the PR and between f0468a9 and 93b8c89.

📒 Files selected for processing (4)
  • .env.example
  • apps/api/.env.example
  • deployments/cli/community/docker-compose.yml
  • docker-compose.yml

plane-minio:
image: minio/minio:latest
command: server /export --console-address ":9090"
image: rustfs/rustfs:1.0.0-alpha.90
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Same alpha version concern applies here.

As noted in the main docker-compose.yml, using rustfs/rustfs:1.0.0-alpha.90 in a production deployment configuration carries stability risks. Ensure both compose files are updated together when a stable release becomes available.

🧰 Tools
🪛 Checkov (3.2.510)

[medium] 207-208: Basic Auth Credentials

(CKV_SECRET_4)

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@deployments/cli/community/docker-compose.yml` at line 208, The docker-compose
service currently pins the container image to the unstable tag
"rustfs/rustfs:1.0.0-alpha.90"; update the image reference used in this compose
file (the line specifying image: rustfs/rustfs:1.0.0-alpha.90) to the stable
release tag once available (e.g., replace with the stable semver tag or :latest
per your release policy) and ensure you apply the same change to the main
docker-compose.yml so both deployments use the identical, non-alpha image tag.

plane-minio:
container_name: plane-minio
image: minio/minio
image: rustfs/rustfs:1.0.0-alpha.90
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🌐 Web query:

What is the latest stable version of RustFS and is 1.0.0-alpha.90 production-ready?

💡 Result:

The latest stable version of RustFS does not exist; all releases are pre-releases labeled as 1.0.0-alpha.xx. The most recent release is 1.0.0-alpha.90, released on March 24, 2026. 1.0.0-alpha.90 is not production-ready. It is explicitly marked as a pre-release on GitHub, the official download pages, and distribution sites. Official documentation provides production deployment guides and hardware checklists, but the alpha status, ongoing focus on stability/bug fixes per the roadmap (no new features until GA), and absence of a stable 1.0 release indicate it remains in development. The project emphasizes rigorous multi-node stress testing before GA, with no timeline provided as of early 2026.

Citations:


Alpha release in production configuration requires explicit approval.

rustfs/rustfs:1.0.0-alpha.90 is the only available RustFS release and is explicitly not production-ready. The project offers production deployment guides but the software remains in alpha development with no stable 1.0 release or GA timeline as of March 2026.

Using non-production-ready software in a production/staging configuration (per coding guidelines) introduces stability and compatibility risks. Before deploying:

  • Document the alpha status and known limitations for the deployment
  • Establish monitoring and rollback procedures
  • Plan a migration path when stable releases become available
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docker-compose.yml` at line 145, The docker-compose uses an alpha RustFS
image ("image: rustfs/rustfs:1.0.0-alpha.90"), which is not production-ready;
update the deployment to either point to an approved stable image or gate this
alpha image behind an explicit approval/config flag and documentation;
specifically change the image reference or add a conditional/environment flag
and ensure you add deployment notes documenting the alpha status, limitations,
monitoring/rollback procedures, and a migration plan for when a stable rustfs
release is available so operators must explicitly opt-in before using
rustfs/rustfs:1.0.0-alpha.90.

@CLAassistant
Copy link
Copy Markdown

CLAassistant commented Mar 29, 2026

CLA assistant check
All committers have signed the CLA.

- Remove *storage-env from backend services (they only need *aws-s3-env)
- Update backup script path /export → /data to match new volume mount
@Rasaboun
Copy link
Copy Markdown
Author

Rasaboun commented Mar 29, 2026

RustFS only has alpha releases right now (1.0.0-alpha.90 is the latest) so there's no stable tag to pin to

This is the most actively developed S3-compatible alternative with Apache 2.0 licensing, the other options are either AGPL (Garage) or heavier than what Plane needs (SeaweedFS/Ceph)

I pinned to the specific alpha tag rather than 'latest' so upgrades are explicit and I'll update the tag when a stable release drops

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
deployments/cli/community/docker-compose.yml (1)

206-216: Consider adding a healthcheck for service readiness.

The plane-minio service lacks a healthcheck. Dependent services (api, worker, etc.) may attempt to connect before RustFS is ready to accept requests. While Docker's depends_on ensures container start order, it doesn't guarantee the service inside is ready.

♻️ Optional: Add a healthcheck
   # Comment this if you using any external s3 compatible storage
   plane-minio:
     image: rustfs/rustfs:1.0.0-alpha.90
     deploy:
       replicas: 1
       restart_policy:
         condition: any
     environment:
       <<: *storage-env
     volumes:
       - uploads:/data
+    healthcheck:
+      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
+      interval: 30s
+      timeout: 10s
+      retries: 3
+      start_period: 10s

Note: Verify the healthcheck endpoint path is correct for RustFS—it may differ from MinIO's /minio/health/live.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@deployments/cli/community/docker-compose.yml` around lines 206 - 216, Add a
Docker healthcheck to the plane-minio service (the rustfs/rustfs image block) so
dependent services don't attempt connections before RustFS is ready; update the
plane-minio service stanza to include a healthcheck that periodically curls the
correct readiness endpoint (verify the RustFS health path, e.g. replace
/minio/health/live with the actual RustFS endpoint) with sensible interval,
timeout and retries so Docker marks the container healthy only when it can
accept requests.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@deployments/cli/community/docker-compose.yml`:
- Around line 206-216: Add a Docker healthcheck to the plane-minio service (the
rustfs/rustfs image block) so dependent services don't attempt connections
before RustFS is ready; update the plane-minio service stanza to include a
healthcheck that periodically curls the correct readiness endpoint (verify the
RustFS health path, e.g. replace /minio/health/live with the actual RustFS
endpoint) with sensible interval, timeout and retries so Docker marks the
container healthy only when it can accept requests.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: e107d87a-a633-4faf-b188-018b8b490a8d

📥 Commits

Reviewing files that changed from the base of the PR and between 93b8c89 and 3c3a136.

📒 Files selected for processing (2)
  • deployments/cli/community/docker-compose.yml
  • deployments/cli/community/install.sh

- 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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

minio/minio image is now in maintenance-only mode, is there any plan to replace in docker-compose?

3 participants