앱에서 파일 업로드 기능을 만들 때 AWS S3 SDK를 쓰고 싶은데, 테스트할 S3가 없어서 애매한 적이 있나? 백업 파일을 모아둘 곳이 필요한데 폴더 나누기로는 관리가 안 되나? MinIO는 AWS S3와 API까지 호환되는 오브젝트 스토리지를 도커 한 개로 제공한다. 개발, 백업, 파일 서비스 — "저장"이 필요한 대부분의 자리에 들어맞는 만능 저장소다.
필요한 것은 디스크 공간뿐이다. 저장 용량의 한도는 내가 정한다.
MinIO는 AWS S3 API와 완전히 호환되는 오픈소스 오브젝트 스토리지다. Go로 작성된 단일 바이너리라 설치가 매우 가볍고, 개인 서버부터 데이터센터 클러스터까지 같은 소프트웨어가 커버한다.
"오브젝트 스토리지"가 낯설다면 이렇게 이해하면 된다. 폴더에 파일을 넣는 방식(파일 시스템) 대신, 버킷에 오브젝트를 넣고 고유 주소로 꺼내는 방식이다. 웹의 파일 서버에는 적합하지 않지만, 백업·이미지·로그·앱 데이터 같은 "쓰고 읽는" 데이터에는 오히려 잘 맞는다.
| 기능 | 내용 |
|---|---|
| S3 API 호환 | AWS SDK·CLI·rclone 등 S3 생태계 도구를 그대로 사용 |
| 웹 콘솔 | 버킷·파일 관리를 브라우저에서 (별도 설치 없음) |
| 프리사인 URL | 만료 시간이 있는 업로드/다운로드 링크 발급 |
| 버전 관리 | 같은 이름으로 덮어써도 이전 버전 보존 |
| 수명 주기 규칙 | "30일 지나면 오래된 버전 삭제" 같은 자동 정리 |
| 암호화 | 저장 데이터 암호화 지원 |
flowchart LR
subgraph APP["클라이언트"]
A["앱·스크립트 - S3 SDK"]
M["mc CLI - 백업·관리"]
B["웹 콘솔 - 브라우저"]
end
subgraph SRV["Docker 서버"]
MN["MinIO - S3 API와 콘솔"]
BK[("data 폴더 - 버킷·오브젝트")]
end
A -->|S3 API| MN
M -->|S3 API| MN
B --> MN
MN --> BK
컨테이너는 하나다. S3 API(포트 9000)와 웹 콘솔(포트 9001)이 같은 컨테이너에서 제공된다.
services:
minio:
image: minio/minio:latest
container_name: minio
command: server /data --console-address ":9001"
environment:
MINIO_ROOT_USER: 관리자아이디
MINIO_ROOT_PASSWORD: 강한비밀번호 # 8자 이상
volumes:
- /opt/docker/minio/data:/data
ports:
- "9000:9000" # S3 API
- "9001:9001" # 웹 콘솔
restart: unless-stopped
http://서버IP:9001로 콘솔에 접속해 관리자 계정으로 로그인하면 준비 끝이다. 콘솔에서 버킷 생성·업로드·정책 설정이 전부 가능하니, 처음엔 명령어 없이 콘솔만으로도 충분히 쓸 수 있다.
버킷은 S3의 최상위 저장 단위다. 콘솔에서 만들어도 되고, 공식 CLI(mc)로 만들어도 된다.
mc alias set local http://서버IP:9000 관리자아이디 비밀번호
mc mb local/photos # photos 버킷 생성
앱이 접근할 때는 루트 계정 대신 전용 계정(Access Key)을 만들어 권한을 최소한으로 제한하는 습관이 중요하다. 콘솔의 Identity 메뉴에서 버킷별 권한을 가진 키를 발급할 수 있다.
이 MinIO의 킬러 기능이다. 업로드·다운로드 권한을 일정 시간만 유효한 URL로 빌려주는 방식으로, 파일이 내 앱 서버를 경유하지 않고 클라이언트와 MinIO가 직접 통신하게 된다.
mc share download --expire 24h local/photos/report.pdf
클라우드 스토리지 서비스들이 "서명된 URL"로 제공하는 바로 그 기능이다.
루트 계정과 앱 계정을 분리한다. 루트 계정(MINIO_ROOT_USER)은 관리 전용으로 쓰지 않고, 앱·스크립트마다 별도 Access Key를 발급해 권한을 버킷 단위로 제한한다. 키 하나가 새어도 피해 범위가 해당 버킷으로 한정된다.
콘솔은 외부에 노출하지 않는다. 9001 웹 콘솔은 사설망에서만 접근 가능하게 두고, S3 API(9000)만 필요한 경우에 도메인을 붙인다. 도메인을 붙일 때도 HTTPS를 거쳐야 프리사인 URL이 정상 동작한다.
버전 관리는 백업용 버킷에 기본으로 켠다. "어제 백업했는데 오늘 덮어썼다"는 오브젝트 스토리지의 고전적 사고다. 버전 관리가 켜져 있으면 덮어쓰기가 아니라 새 버전이 된다.
| 증상 | 원인 | 해결 |
|---|---|---|
| SignatureDoesNotMatch 에러 | 서버·클라이언트 시간 차이 | 시간 동기화(NTP) 확인 |
| Access Denied | 정책·권한 미설정 | Access Key의 정책과 버킷 정책 확인 |
| 프리사인 URL이 안 열린다 | 도메인·포트 불일치, HTTP | DOMAIN 설정과 HTTPS 확인 |
| 콘솔 접속이 안 된다 | 9001 포트 미개방 | 포트 매핑·방화벽 확인 |
| 디스크가 의외로 빨리 참 | 버전 관리 + 삭제 안 된 이전 버전 | 수명 주기 규칙 설정 |
S3의 API 명령(버킷 생성, 오브젝트 업로드/다운로드, 프리사인 URL 등)을 같은 형식으로 이해한다는 뜻이다. AWS SDK로 MinIO를 바로 쓸 수 있고, rclone 같은 S3 호환 도구도 설정의 주소만 바꾸면 된다.
개인 서버 기준으로는 백업 저장소가 가장 좋다. 버전 관리·수명 주기·S3 호환 도구 생태계 덕분에 백업 체계를 깔끔하게 만들 수 있다. 앱 개발용 테스트 S3로도 훌륭하다.
목적이 다르다. Immich는 사진 열람·분류 경험을 제공하고, MinIO는 저장 인프라다. 오히려 조합이 가능한 영역이라, 필요하면 백업 단계에서 함께 쓸 수 있다.
서버 한 대로 충분하다 연재 목차 — 시리즈 소개 · 1화. Home Assistant · 2화. Frigate + go2rtc · 3화. Seafile 13 · 4화. Immich · 5화. Vaultwarden · 6화. Mailcow
버킷 운영과 프리사인 URL 기반 파일 서비스 경험을 바탕으로 작성했습니다.
| 이전 | 6화. Mailcow — 우리 도메인 이메일을 직접 발급하는 메일 서버 | 2026-09-30 | |
|---|---|---|---|
| 다음 | 8화. Umami — 구글 애널리틱스 없이 방문자 통계 보기 | 2026-10-01 |