fixed image locale storage on minio

This commit is contained in:
SlimusMinus
2026-07-10 01:27:30 +03:00
parent 712a5f1e2b
commit f371a442d0
12 changed files with 415 additions and 90 deletions

View File

@@ -0,0 +1,118 @@
package com.krylov.refound.health;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Service;
import com.krylov.refound.config.MinioProperties;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.BucketLifecycleConfiguration;
import software.amazon.awssdk.services.s3.model.BucketVersioningStatus;
import software.amazon.awssdk.services.s3.model.CreateBucketRequest;
import software.amazon.awssdk.services.s3.model.ExpirationStatus;
import software.amazon.awssdk.services.s3.model.HeadBucketRequest;
import software.amazon.awssdk.services.s3.model.LifecycleRule;
import software.amazon.awssdk.services.s3.model.NoSuchBucketException;
import software.amazon.awssdk.services.s3.model.PutBucketLifecycleConfigurationRequest;
import software.amazon.awssdk.services.s3.model.PutBucketVersioningRequest;
import software.amazon.awssdk.services.s3.model.VersioningConfiguration;
import java.util.List;
/**
* Сервис для управления структурой хранилища в MinIO.
* Отвечает за создание необходимого бакета при запуске приложения.
*/
@Service
@Slf4j
@RequiredArgsConstructor
public class StorageStructureService {
private final S3Client s3Client;
private final MinioProperties properties;
/**
* Инициализирует структуру хранилища при запуске приложения.
* Вызывает метод createBuckets().
*/
@EventListener(ContextRefreshedEvent.class)
public void init() {
createBuckets();
}
/**
* Создает основной бакет в MinIO, если он еще не существует.
*/
public void createBuckets() {
log.info("Инициализация основного бакета MinIO...");
String mainBucket = properties.bucket();
createBucketIfNotExists(mainBucket);
log.info("Проверка и создание основного бакета завершены.");
try {
log.info("Включение версионирования для бакета '{}'...", mainBucket);
VersioningConfiguration versioningConfiguration = VersioningConfiguration.builder()
.status(BucketVersioningStatus.ENABLED)
.build();
PutBucketVersioningRequest request = PutBucketVersioningRequest.builder()
.bucket(mainBucket)
.versioningConfiguration(versioningConfiguration)
.build();
s3Client.putBucketVersioning(request);
log.info("Версионирование для бакета '{}' успешно включено.", mainBucket);
} catch (Exception e) {
log.error("Не удалось включить версионирование для бакета '{}': {}", mainBucket, e.getMessage(), e);
}
try {
log.info("Установка политики жизненного цикла для бакета '{}'...", mainBucket);
LifecycleRule rule = LifecycleRule.builder()
.id("delete-after-one-day-rule")
.status(ExpirationStatus.ENABLED)
.filter(f -> f.prefix(""))
.expiration(exp -> exp.days(1))
.build();
BucketLifecycleConfiguration lifecycleConfig = BucketLifecycleConfiguration.builder()
.rules(List.of(rule))
.build();
PutBucketLifecycleConfigurationRequest request = PutBucketLifecycleConfigurationRequest.builder()
.bucket(mainBucket)
.lifecycleConfiguration(lifecycleConfig)
.build();
s3Client.putBucketLifecycleConfiguration(request);
log.info("Политика жизненного цикла для бакета '{}' успешно установлена.", mainBucket);
} catch (Exception e) {
log.error("Не удалось установить политику жизненного цикла для бакета '{}': {}", mainBucket, e.getMessage(), e);
}
}
/**
* Проверяет существование бакета в MinIO и создает его, если он отсутствует.
*
* @param bucketName Имя бакета для проверки и создания.
*/
private void createBucketIfNotExists(String bucketName) {
try {
log.debug("Проверка существования бакета: {}", bucketName);
s3Client.headBucket(HeadBucketRequest.builder().bucket(bucketName).build());
log.info("Бакет '{}' уже существует.", bucketName);
} catch (NoSuchBucketException e) {
log.warn("Бакет '{}' не найден. Попытка создания...", bucketName);
try {
s3Client.createBucket(CreateBucketRequest.builder().bucket(bucketName).build());
log.info("Бакет '{}' успешно создан.", bucketName);
} catch (Exception ex) {
log.error("Ошибка при создании бакета '{}': {}", bucketName, ex.getMessage(), ex);
}
} catch (Exception e) {
log.error("Ошибка при проверке бакета '{}': {}", bucketName, e.getMessage(), e);
}
}
}