Operate Joel's MinIO legacy/rollback services and S3-compatible object storage checks. Use for MinIO, ASUSTOR MinIO CE, custom Docker/Compose MinIO, Convex MinIO rollback, and MinIO-vs-Garage questions. For canonical local Convex object storage, use Garage/local-convex.
84%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
Passed
No findings from the security scan
Operate Joel's MinIO legacy/rollback services. This is not generic MinIO advice. The canonical local Convex object store is now Garage on three-body at http://100.67.156.41:39100. The custom Docker/Compose MinIO service remains a working rollback/reference path; ASUSTOR MinIO CE is only a smoke-test/reference instance unless Joel explicitly says otherwise.
Use this skill when Joel mentions:
three-body MinIOIf the task is about the full local Convex runtime or canonical Convex object storage, also read the local-convex skill and prefer Garage unless Joel explicitly asks for MinIO rollback. If the task is about general ASUSTOR storage, NFS, SMB, RAID, or NAS health, also read the three-body skill.
Host:
three-body100.67.156.415.1.3.RI81Canonical Garage for local Convex:
http://100.67.156.41:39100/volume1/joelclaw/s3/garage/data/volume1/joelclaw/s3/garage/meta/volume1/joelclaw/s3/garage-compose/compose.yaml/volume1/joelclaw/s3/garage-compose/convex-s3.env/volume1/joelclaw/s3/garage-compose/convex-s3.redacted.envCustom MinIO rollback/reference:
http://100.67.156.41:39000http://100.67.156.41:39001/volume1/joelclaw/s3/minio/data/volume1/joelclaw/s3/minio-compose/compose.yaml/volume1/joelclaw/s3/minio-compose/convex-s3.env/volume1/joelclaw/s3/minio-compose/convex-s3.redacted.envMC_IMAGE from /volume1/joelclaw/s3/minio-compose/.env; do not assume mc is installed directly on ADM.ASUSTOR MinIO CE reference instance:
http://100.67.156.41:29990http://100.67.156.41:29991/share/MinIOCE/dataDo not expose MinIO or Garage publicly. Keep API and console access LAN/tailnet only.
Read these before mutating the setup:
/Users/joel/.brain/projects/convex-self-hosting-local.svx/Users/joel/Documents/Codex/2026-06-17/we-re-setting-up-durable-self/outputs/install-three-body-convex-minio.sh/volume1/joelclaw/s3/minio-compose/compose.yaml/volume1/joelclaw/s3/minio-compose/convex-s3.redacted.envIf sources disagree, prefer the brain project note, then verify live state with redaction-safe health checks. Do not print raw env files to resolve disagreement.
Never print, paste, summarize, commit, or log:
convex-s3.envIt is okay to read and report the redacted env file. It is okay to say whether required keys exist. It is not okay to reveal their values.
When a command needs secrets, prefer running it on three-body where the env file already lives. If secrets must move to another host, use that project's existing secret-management path. Do not invent an ad hoc note, paste, or scratch file.
For ad hoc MinIO client checks on three-body, prefer the dockerized minio/mc pattern from the installer. Do not assume mc is installed directly on ADM. Do not leave new credential-bearing aliases in a persistent MinIO client config unless Joel explicitly asks for that.
Before sharing command output, scan it for:
AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYMINIO_ROOT_USERMINIO_ROOT_PASSWORDaccess_keysecret_keyconvex-s3.envRedact first, then report.
Use one SSH session to three-body at a time. NAS SSH is sensitive to bursts and can reset handshakes after rapid parallel probes.
Default read-only SSH shape:
ssh -o BatchMode=yes -o ConnectTimeout=8 joel@three-body 'uptime; pwd'Operational rules:
kex_exchange_identification, Not allowed at this time, or repeated SSH resets.joel@three-body can inspect system state.sudo or an ADM/admin path.For canonical local Convex storage, check Garage first:
nc -vz -w 5 100.67.156.41 39100
curl -sS -m 5 -o /tmp/garage-root.out -w '%{http_code}\n' http://100.67.156.41:39100/Garage returns 403 AccessDenied for unsigned root requests; that still proves the S3 API is reachable.
For custom MinIO rollback/reference, prefer network and HTTP checks that do not require credentials:
tailscale ping --timeout=5s --c 2 three-body
nc -vz -w 5 100.67.156.41 39000
nc -vz -w 5 100.67.156.41 39001
curl -fsS -m 5 http://100.67.156.41:39000/minio/health/live
curl -fsS -m 5 http://100.67.156.41:39000/minio/health/readyFor the CE reference instance only:
nc -vz -w 5 100.67.156.41 29990
nc -vz -w 5 100.67.156.41 29991
curl -fsS -m 5 http://100.67.156.41:29990/minio/health/readyIf the API is healthy but the console is unreachable, keep the distinction clear. Convex depends on the API path, not the browser console.
Use one SSH session and keep output narrow:
ssh joel@three-body 'sudo docker ps --format "table {{.Names}}\t{{.Image}}\t{{.Status}}\t{{.Ports}}" | grep -Ei "minio|39000|39001" || true'
ssh joel@three-body 'cd /volume1/joelclaw/s3/minio-compose && sudo docker compose ps'
ssh joel@three-body 'test -f /volume1/joelclaw/s3/minio-compose/compose.yaml && echo compose-present'
ssh joel@three-body 'test -d /volume1/joelclaw/s3/minio/data && echo data-dir-present'Do not run docker compose logs without a reason. If logs are needed, bound them and redact:
ssh joel@three-body 'cd /volume1/joelclaw/s3/minio-compose && sudo docker compose logs --tail=120 minio'Do not re-run the installer casually. Re-run only to reconcile the service after intentional edits or a failed install:
ssh -t joel@three-body 'sudo sh /volume1/joelclaw/s3/install-three-body-convex-minio.sh'Canonical Convex buckets on custom MinIO:
joelclaw-local-usw2-convex-exportsjoelclaw-local-usw2-convex-snapshot-importsjoelclaw-local-usw2-convex-modulesjoelclaw-local-usw2-convex-filesjoelclaw-local-usw2-convex-searchBucket rules:
http://100.67.156.41:39000, not CE on 29990.When listing buckets, avoid printing credentials. Prefer the dockerized mc helper from the installer:
ssh joel@three-body 'cd /volume1/joelclaw/s3/minio-compose && set -eu; . ./.env; . ./convex-s3.env; docker run --rm --network "container:joelclaw-minio" -e "MC_HOST_convex=http://${AWS_ACCESS_KEY_ID}:${AWS_SECRET_ACCESS_KEY}@127.0.0.1:9000" "${MC_IMAGE}" ls convex'If mc output includes only bucket names, it is safe to report. If a command prints env values, stop and redact.
The current canonical Convex endpoint is Garage at http://100.67.156.41:39100. Only use this MinIO env shape when explicitly rolling Convex back to custom MinIO:
AWS_REGION=usw2
S3_ENDPOINT_URL=http://100.67.156.41:39000
AWS_S3_FORCE_PATH_STYLE=true
AWS_ACCESS_KEY_ID=<from /volume1/joelclaw/s3/minio-compose/convex-s3.env>
AWS_SECRET_ACCESS_KEY=<from /volume1/joelclaw/s3/minio-compose/convex-s3.env>
S3_STORAGE_EXPORTS_BUCKET=joelclaw-local-usw2-convex-exports
S3_STORAGE_SNAPSHOT_IMPORTS_BUCKET=joelclaw-local-usw2-convex-snapshot-imports
S3_STORAGE_MODULES_BUCKET=joelclaw-local-usw2-convex-modules
S3_STORAGE_FILES_BUCKET=joelclaw-local-usw2-convex-files
S3_STORAGE_SEARCH_BUCKET=joelclaw-local-usw2-convex-searchValidation rules:
S3_ENDPOINT_URL must be http://100.67.156.41:39000.S3_ENDPOINT_URL must be http://100.67.156.41:39100.AWS_S3_FORCE_PATH_STYLE must be true.Redaction-safe env check:
ssh joel@three-body 'awk -F= "/^(AWS_REGION|S3_ENDPOINT_URL|AWS_S3_FORCE_PATH_STYLE|S3_STORAGE_)/ {print}" /volume1/joelclaw/s3/minio-compose/convex-s3.env'Presence-only secret check:
ssh joel@three-body 'awk -F= "/^(AWS_ACCESS_KEY_ID|AWS_SECRET_ACCESS_KEY)=/ {print $1\"=<present>\"}" /volume1/joelclaw/s3/minio-compose/convex-s3.env'Start with unauthenticated readiness:
curl -fsS -m 5 http://100.67.156.41:39000/minio/health/readyThen prove the Convex credentials can write, read, and delete through the custom MinIO endpoint. Run on the NAS so secrets stay local, using the dockerized mc helper:
ssh joel@three-body 'cd /volume1/joelclaw/s3/minio-compose && set -eu; . ./.env; . ./convex-s3.env; tmp="smoke-$(date +%s).txt"; mkdir -p smoke; trap "rm -f \"smoke/$tmp\"" EXIT; printf "minio smoke %s\n" "$(date -u +%FT%TZ)" > "smoke/$tmp"; docker run --rm --network "container:joelclaw-minio" -v "$PWD/smoke:/smoke:rw" -e "MC_HOST_convex=http://${AWS_ACCESS_KEY_ID}:${AWS_SECRET_ACCESS_KEY}@127.0.0.1:9000" "${MC_IMAGE}" cp "/smoke/$tmp" "convex/${S3_STORAGE_FILES_BUCKET}/$tmp" >/dev/null; docker run --rm --network "container:joelclaw-minio" -e "MC_HOST_convex=http://${AWS_ACCESS_KEY_ID}:${AWS_SECRET_ACCESS_KEY}@127.0.0.1:9000" "${MC_IMAGE}" cat "convex/${S3_STORAGE_FILES_BUCKET}/$tmp" >/dev/null; docker run --rm --network "container:joelclaw-minio" -e "MC_HOST_convex=http://${AWS_ACCESS_KEY_ID}:${AWS_SECRET_ACCESS_KEY}@127.0.0.1:9000" "${MC_IMAGE}" rm "convex/${S3_STORAGE_FILES_BUCKET}/$tmp" >/dev/null; echo "custom-minio-convex-smoke-ok"'Report only success/failure, bucket name, endpoint, and any redacted error shape. Never report credentials.
If the smoke test fails:
39000.ASUSTOR MinIO CE is not the canonical path. Treat it as temporary scaffolding.
Before removing or disabling CE:
39100.39000 if keeping it as the rollback path.Do not delete /share/MinIOCE/data unless Joel explicitly asks for data deletion. Prefer ADM/package-level disable or uninstall first, then summarize remaining data paths.
CE checks should stay clearly labeled as reference checks. Do not use CE success to claim the canonical Garage path is healthy.
For MinIO debugging:
100.67.156.41:39000.three-body.three-body is a host label; 100.67.156.41 is the preferred endpoint value for machine config and smoke tests.39000; CE is 29990.sudo even when joel is an administrator.mc may only be available as the pinned Docker image, not as an ADM host binary.joelhooks/joelclaw
1fb2468
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.