본문 바로가기
회고

S3 말고 내가 만든다! Docker + MinIO로 구축한 나만의 파일 서버 이야기

by 창따오 2025. 7. 25.
728x90

1️⃣ 도입: 왜 직접 파일 서버를 구축했는가?

평소 AWS S3를 자주 쓰긴 했지만, 이번엔 비용 없이 내 서버에서 직접 이미지 파일을 저장하고 관리해보고 싶었다.
집에 상시 가동되는 서버가 있으니, Docker 기반의 파일 서버를 올려서 MSA 프로젝트의 이미지 업로드용 저장소로 써보기로 했다.

 


2️⃣ 선택: MinIO를 고른 이유

항목설명
✅ S3 API 호환 Spring에서 기존 S3 클라이언트 그대로 사용 가능
✅ Docker로 빠른 배포 docker-compose만 있으면 끝
✅ Web UI 지원 웹에서 파일 업로드/삭제까지 가능
✅ 정책 기반 접근 제어 버킷 단위 public/private 설정 가능
✅ 무료 Community Edition으로 충분히 쓸 수 있음

3️⃣ 구성: Docker Compose로 MinIO 실행

services:
  minio:
    image: minio/minio
    container_name: minio
    ports:
      - "9000:9000"  # S3 API
      - "9001:9001"  # Web UI
    volumes:
      - ./minio-data:/data
    environment:
      MINIO_ROOT_USER: ${MINIO_USER}
      MINIO_ROOT_PASSWORD: ${MINIO_PASSWORD}
    command: server /data --console-address ":9001"
    networks:
      - msa-net

networks:
  msa-net:
    external: true

📁 .env

MINIO_USER=minioadmin
MINIO_PASSWORD=minioadmin

4️⃣ 연동: Spring Boot에서 MinIO 사용하기

implementation 'io.minio:minio:8.5.6'

🛠 설정

minio:
  url: http://minio:9000
  access-key: minioadmin
  secret-key: minioadmin
  bucket: changhome

⚙️ 구성 클래스

@Bean
public MinioClient minioClient() {
    return MinioClient.builder()
        .endpoint(url)
        .credentials(accessKey, secretKey)
        .build();
}

5️⃣ 문제: public 접근이 안 되는 이유?

  • MinIO 최신 Web UI에서는 Edit Policy 기능이 비활성화된 경우가 있음
  • 그래서 CLI 도구인 mc를 설치해서 해결

✅ CLI로 public-read 정책 적용

mc alias set local http://localhost:9000 minioadmin minioadmin
mc anonymous set download local/changhome

6️⃣ 결과: 완성된 나만의 파일 서버

  • Spring Boot에서 업로드 API 호출
  • MinIO에 저장되고,
  • Public 이미지 URL을 바로 반환!
  • 향후 S3로 바꾸고 싶을 땐 config만 바꾸면 끝 👌

7️⃣ 마무리: 느낀 점

AWS S3를 대체할 수 있는 좋은 툴이다.
단순 테스트 용도로도 좋고, 비용 절감/로컬 서버 통합 관점에서도 매우 만족스러움.
특히 MSA 환경에서 이미지 처리 전용 파일 서버로 도입해볼 만하다.

 

MinIO 공식문서: https://min.io/docs/minio