Upgrade to drive v0.25.3, replace MinIO with RustFS

- use rustfs instead of minio and provide migration script
- Schedule clean_pending_items/purge_deleted_items with celery beat
- Give celery workers the S3 access key secret
- Collabora admin access needs setting a password

Following the [C4DT AI Policy](https://git.coopcloud.tech/c4dt/ai-policy/src/branch/main/AI-POLICY.md):

 #LLM_vibe
 #LLM_model Claude Opus 5.5

- [x] I take full responsibility for this code
- [x] I understand every line of this code
- [x] I tested this code thoroughly on my own computer / servers
- [x] None of the commit messages were created using LLMs
- [x] I will participate in any discussion on my own and will not use an LLM for the discussion

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Linus Gasser
2026-11-12 16:07:05 +00:00
committed by Linus Gasser
co-authored by Claude Opus 5.5
parent a09d912312
commit e7aaf18d2d
12 changed files with 399 additions and 125 deletions
+51
View File
@@ -0,0 +1,51 @@
#!/bin/sh
set -e
# Creates the media bucket on the RustFS object storage, with versioning
# enabled. Runs inside the backend container, which ships boto3.
# Load secrets into environment
source /abra-entrypoint.sh -e
python - <<'PYEOF'
import os
import sys
import time
import boto3
from botocore.exceptions import ClientError, EndpointConnectionError
bucket = os.environ.get("AWS_STORAGE_BUCKET_NAME", "drive-media-storage")
s3 = boto3.client(
"s3",
endpoint_url=os.environ["AWS_S3_ENDPOINT_URL"],
aws_access_key_id=os.environ["AWS_S3_ACCESS_KEY_ID"],
aws_secret_access_key=os.environ["AWS_S3_SECRET_ACCESS_KEY"],
region_name=os.environ.get("AWS_S3_REGION_NAME", "us-east-1"),
)
# Wait for the object storage to be ready (up to 60 seconds)
for i in range(60):
try:
s3.list_buckets()
break
except (ClientError, EndpointConnectionError):
time.sleep(1)
else:
sys.exit("s3-initialize: timed out waiting for the object storage")
# Idempotent: skip if bucket already exists
try:
s3.head_bucket(Bucket=bucket)
print(f"s3-initialize: bucket '{bucket}' already exists, skipping")
sys.exit(0)
except ClientError:
pass
print(f"s3-initialize: creating bucket '{bucket}'...")
s3.create_bucket(Bucket=bucket)
s3.put_bucket_versioning(
Bucket=bucket, VersioningConfiguration={"Status": "Enabled"}
)
print("s3-initialize: done")
PYEOF