Files
nahodka-back/src/main/java/com/krylov/refound/health/StorageStructureService.java
2026-09-09 23:44:50 +03:00

118 lines
5.6 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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-180-days-rule")
.status(ExpirationStatus.ENABLED)
.filter(f -> f.prefix(""))
.expiration(exp -> exp.days(180))
.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);
}
}
}