private Mono<Void> setUp() {
        MinioStorageProperties properties = loadProperties(MinioStorageProperties.class);
        if (!properties.isEnabled()) {
            return Mono.empty();
        }
        String endpoint = properties.getEndpoint();
        URI uri;
        try {
            uri = new URI(endpoint);
        } catch (URISyntaxException e) {
            return Mono.error(new IllegalArgumentException(
                    "Illegal endpoint URL: "
                            + endpoint,
                    e));
        }
        if (!uri.isAbsolute()) {
            return Mono.error(new IllegalArgumentException(
                    "The endpoint URL ("
                            + endpoint
                            + ") must be absolute"));
        }
        ApplicationContext context = getContext();
        node = context.getBean(Node.class);
        groupMemberService = context.getBean(GroupMemberService.class);
        userRelationshipService = context.getBean(UserRelationshipService.class);
        TurmsPropertiesManager propertiesManager = context.getBean(TurmsPropertiesManager.class);
        storageProperties = propertiesManager.getLocalProperties()
                .getService()
                .getStorage();
        Mono<TurmsMongoClient> clientMono =
                TurmsMongoClient.of(properties.getMongo(), "message-attachment");
        return clientMono.flatMap(
                mongoClient -> initClientAndBuckets(mongoClient, properties, uri, endpoint));
    }
@implNote 1. We use HMAC(key, message) instead of a HASH(key + message) to avoid the length
          extension attack. To put simply, if a hacker knows the signature of the resource
          "1", and he can also know the signature of resource "12", "13", "123", and so on
          without knowledge of the key.
          <p>
          2. Use MD5 because its output size (128 bits) is small, and it is a 22-character
          Base62-encoded string.
turms-plugins/turms-plugin-minio/src/main/java/im/turms/plugin/minio/MinioStorageServiceProvider.java