13년차의 서버실

서버, 인프라, 홈랩 기술 블로그

[태그:] 프라이빗 클라우드

  • [Nas] OpenMediaVault와 Immich 연동 사례: 나만의 프라이빗 사진 클라우드 구축

    [Nas] OpenMediaVault와 Immich 연동 사례: 나만의 프라이빗 사진 클라우드 구축

    OpenMediaVault와 Immich 연동 사례: 나만의 프라이빗 사진 클라우드 구축

    안녕하세요, 13년차 인프라 엔지니어 서버실입니다. 오늘은 많은 분들이 고민하시는 사진 관리 문제, 특히 프라이빗 클라우드 구축에 대한 이야기를 해볼까 합니다. 구글 포토의 정책 변경 이후, ‘내 사진을 내 손으로 관리하고 싶다!’는 열망이 더 커진 것 같아요. 저도 처음엔 클라우드 서비스가 편해서 잘 썼는데, 역시 데이터 주권(Data Sovereignty)은 중요하더라고요. 그래서 홈랩에서 직접 OpenMediaVault(OMV)와 Immich를 연동해서 저만의 프라이빗 사진 클라우드를 구축했습니다. 나스(NAS) 환경에서 사진을 자동으로 백업하고 관리할 수 있게 된 과정을 솔직하게 공유해 드릴게요.

    그림 1: OpenMediaVault 기반 Immich 프라이빗 사진 클라우드 아키텍처

    OpenMediaVault와 Immich, 왜 이 조합일까요?

    먼저, 이 두 친구가 어떤 역할을 하는지 간단히 짚어보고 갈까요? 쉽게 말해, OpenMediaVault(OMV)는 나스(NAS, Network Attached Storage)의 뼈대 역할을 하고, Immich는 그 위에 멋진 옷을 입혀주는 사진 관리 솔루션이라고 생각하시면 됩니다.

    • OpenMediaVault (OMV): 데비안(Debian) 리눅스 기반의 무료 오픈소스 NAS 운영체제입니다. 파일 공유(SMB/NFS), RAID 관리, 플러그인 확장성, 그리고 무엇보다 도커(Docker) 컨테이너 지원이 강력해서 홈랩에서 활용도가 정말 높아요. 튼튼한 스토리지 백엔드를 제공하는 셈이죠. 제가 직접 써보니 안정성도 뛰어나고 관리도 편하더라고요.

    • Immich: 요즘 뜨는 셀프 호스팅(Self-hosted) 사진 및 비디오 백업 솔루션입니다. 구글 포토와 비슷한 사용자 경험을 제공하면서, AI 기반 얼굴 인식(Facial Recognition), 객체 감지(Object Detection), 검색 기능, 타임라인(Timeline) 뷰, 공유 앨범 등 고급 기능까지 갖추고 있어요. 모바일 앱(iOS/Android)도 있어서 자동 백업도 가능합니다. 이 정도면 ‘나만의 구글 포토’라고 불러도 손색이 없죠.

    OMV가 안정적인 스토리지 공간을 제공하고, Immich가 그 공간에 저장된 사진들을 스마트하게 관리해주니, 이보다 더 좋은 조합이 있을까요? 👍

    OMV에 도커와 Immich 설치하기: 실전 구현

    이제 본격적으로 OMV 위에 Immich를 올려볼 차례입니다. OMV에 도커와 포테이너(Portainer)가 이미 설치되어 있다고 가정할게요. (아직 설치 안 하셨다면, OMV 웹 UI에서 OMV-Extras 플러그인을 통해 쉽게 설치할 수 있습니다.)

    1. Immich용 공유 폴더 생성

    먼저 OMV에서 Immich가 사진을 저장할 공유 폴더를 만들어야 합니다. 저는 /srv/dev-disk-by-uuid-XXXX/data/immich 경로에 immich라는 공유 폴더를 만들었어요. 여기서 정말 중요한 부분이 바로 권한 설정입니다. 도커 컨테이너 내부의 프로세스가 이 폴더에 접근하고 파일을 쓸 수 있도록 적절한 권한을 부여해야 하는데, 보통 PUID와 PGID를 사용합니다. 저는 1000:1000 (기본 사용자/그룹)으로 설정했습니다.

    2. Docker Compose 파일 준비

    Immich는 여러 서비스(PostgreSQL, Redis, Microservices 등)로 구성되어 있어서 도커 컴포즈(Docker Compose)로 한 번에 배포하는 게 가장 편리합니다. Immich 공식 GitHub 저장소에서 예시 docker-compose.yaml 파일을 가져오는 게 좋아요. 저는 항상 최신 버전을 확인하고 수정해서 사용합니다.

    # OMV SSH 접속 후 작업 디렉토리 생성
    mkdir -p /srv/dev-disk-by-uuid-XXXX/config/immich
    cd /srv/dev-disk-by-uuid-XXXX/config/immich
    
    # Immich GitHub에서 docker-compose.yaml 다운로드 (최신 버전 확인 필수)
    wget https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml
    wget https://github.com/immich-app/immich/releases/latest/download/.env
    

    다운로드한 .env 파일과 docker-compose.yml 파일을 열어서 몇 가지를 수정해야 합니다.

    • .env 파일 수정:
      • UPLOAD_LOCATION=./upload 부분을 OMV에서 생성한 공유 폴더 경로로 변경합니다. 예: UPLOAD_LOCATION=/data/immich/upload (컨테이너 내부 경로)
      • DB_PASSWORD, REDIS_PASSWORD 등을 강력한 비밀번호로 변경하세요.
      • TZ=Asia/Seoul 처럼 시간대를 설정합니다.
    • docker-compose.yml 파일 수정:
      • 각 서비스의 volumes 섹션에서 OMV 공유 폴더와 연결되는 부분을 확인하고 수정합니다. 특히 ./upload:/usr/src/app/upload 부분을 /srv/dev-disk-by-uuid-XXXX/data/immich:/usr/src/app/upload (호스트 경로:컨테이너 내부 경로) 형태로 맞춰줘야 합니다.
      • PUID, PGID 환경 변수를 OMV에서 설정한 사용자/그룹 ID에 맞춰주세요.

    이 부분이 사실 제가 겪었던 가장 큰 삽질의 핵심이었습니다. 😅 볼륨 마운트 경로를 잘못 지정하거나 권한이 없어서 컨테이너가 파일을 못 읽는 경우가 정말 많거든요. 항상 호스트 경로와 컨테이너 내부 경로가 정확히 매핑되는지, 그리고 해당 호스트 폴더에 컨테이너가 접근할 수 있는 권한이 있는지 꼼꼼히 확인해야 합니다.

    Immich Docker Compose 설정 파일 예시 (볼륨 및 환경 변수)

    그림 2: Immich Docker Compose 설정 파일 예시 (볼륨 및 환경 변수)

    3. Immich 서비스 실행

    파일 수정이 끝났다면, 이제 도커 컴포즈를 이용해 서비스를 실행합니다. OMV SSH 터미널에서 docker-compose.yml 파일이 있는 디렉토리로 이동한 다음 아래 명령어를 실행하세요.

    docker compose up -d
    

    -d 옵션은 백그라운드에서 컨테이너를 실행하라는 의미입니다. 컨테이너들이 모두 정상적으로 올라오는지 docker compose ps 명령어로 확인해볼 수 있습니다.

    ⚠️ 주의사항 및 트러블슈팅: 제가 겪은 삽질들

    제가 이 OpenMediaVault와 Immich 연동 구성을 하면서 가장 많이 겪었던 문제들은 역시 권한(Permissions)과 볼륨 마운트(Volume Mount)였습니다. 특히 OMV의 공유 폴더와 도커 컨테이너 간의 권한 문제가 많았어요. 홈랩에서 사진 백업을 구축할 때 이 부분을 간과하면 정말 답답하더라고요.

    1. 권한 문제 (Permission Denied): Immich 컨테이너가 OMV 공유 폴더에 사진을 저장하거나 데이터베이스 파일을 생성할 때 ‘Permission Denied’ 에러가 발생하는 경우가 많았습니다. 이럴 때는 OMV에서 해당 공유 폴더의 ACL(Access Control List) 설정을 확인하거나, SSH로 접속해서 직접 chown 명령어로 소유권을 변경해줘야 합니다. 예를 들어, sudo chown -R 1000:1000 /srv/dev-disk-by-uuid-XXXX/data/immich 이런 식으로요. PUID, PGID 값과 일치시켜주는 게 정말 중요합니다.

    2. 리소스 부족 (Resource Exhaustion): Immich는 생각보다 많은 리소스를 사용합니다. 특히 처음 사진을 인덱싱(Indexing)하고 AI 기능을 사용할 때 CPU와 RAM 사용량이 급증할 수 있어요. 저사양 NAS나 라즈베리 파이(Raspberry Pi) 같은 장비에선 버벅거릴 수 있습니다. 저는 N100 기반 미니 PC에 16GB RAM을 사용하는데, 이 정도면 충분하더라고요. 나스 환경의 사양을 고려해서 구축해야 합니다.

    3. 포트 충돌 (Port Conflict): 만약 OMV에서 다른 서비스가 Immich와 동일한 포트(기본 2283)를 사용하고 있다면 충돌이 발생할 수 있습니다. docker-compose.yml 파일에서 Immich 서버의 포트를 다른 번호로 변경해주거나, 기존 서비스의 포트를 변경해야 합니다.

    이런 문제들을 하나씩 해결해나가면서 ‘아, 역시 인프라 엔지니어는 삽질의 연속이구나’ 싶었지만, 각각을 해결할 때마다 느껴지는 성취감이 있었어요. 💡

    설치 검증 및 결과 확인 🎉

    모든 컨테이너가 정상적으로 실행되면, 웹 브라우저를 열고 http://[OMV_IP_주소]:2283으로 접속하면 됩니다. 처음 접속하면 관리자 계정을 생성하라는 화면이 나올 거예요. 계정을 만들고 로그인하면 드디어 Immich의 멋진 인터페이스를 만날 수 있습니다!

    모바일 앱을 설치해서 OMV 서버의 IP 주소와 포트를 입력하면 스마트폰 사진을 자동으로 백업할 수 있어요. 실제로 제가 갤러리 앱에서 사진 몇 장을 찍어보니 Immich 웹 UI에 바로바로 동기화되더라고요. 정말 신기하고 뿌듯했습니다. 🤩

    Immich 웹 UI 메인 화면 (사진 업로드 및 타임라인)

    그림 3: Immich 웹 UI (사진 업로드 및 타임라인)

    가족 사진, 여행 사진, 친구들과의 추억까지! 이제 모두 제 OMV 나스에 안전하게 보관되고, Immich의 강력한 기능으로 편리하게 관리할 수 있게 되었습니다. 프라이버시(Privacy) 걱정 없이, 원하는 만큼의 용량을 마음껏 쓸 수 있다는 점이 가장 큰 장점 같아요.

    마무리하며: 나만의 사진 클라우드, 그 다음은?

    OpenMediaVault와 Immich를 연동해서 나만의 프라이빗 사진 클라우드를 구축하는 과정, 어떠셨나요? 처음에는 조금 복잡하게 느껴질 수도 있지만, 한 번 구축해두면 정말 든든한 나만의 사진 보관소가 생기는 겁니다. 데이터 주권을 되찾고, 클라우드 서비스 구독료도 절약할 수 있으니 일석이조죠.

    저는 여기서 멈추지 않고, Nginx Proxy Manager 같은 리버스 프록시(Reverse Proxy)를 이용해 외부에서도 안전하게 접속할 수 있도록 설정할 계획입니다. 또, 백업 전략(Backup Strategy)도 빠뜨리지 않고 구현해야 하겠더라고요. Raid는 백업이 아니라는 점, 다들 아시죠? 😉

    여러분도 제 경험을 바탕으로 나만의 프라이빗 사진 클라우드 구축에 도전해 보시길 강력히 추천합니다. 궁금한 점이 있으시다면 언제든지 댓글로 남겨주세요! 다음에는 Nginx Proxy Manager를 활용한 외부 접속 설정에 대해 다뤄볼까 합니다. 기대해주세요!

    OMV와 Immich 연동의 주요 장점 요약 인포그래픽

    그림 4: OMV + Immich 연동의 주요 장점

  • [Nas] Nextcloud S3 호환 스토리지 연동 사례: 대용량 클라우드 확장 전략

    [Nas] Nextcloud S3 호환 스토리지 연동 사례: 대용량 클라우드 확장 전략

    Nextcloud S3 호환 스토리지 연동 사례: 대용량 클라우드 확장 전략

    안녕하세요, 13년차 서버실 블로그의 운영자입니다. 어느덧 13년이라는 시간 동안 수많은 서버실과 씨름하며 인프라의 최전선에서 땀 흘렸던 경험을 여러분과 나누고 있습니다. 오늘은 개인적으로도, 그리고 많은 기업에서도 겪을 수 있는 ‘스토리지 용량 압박’ 문제에 대한 현실적인 해결책, 바로 Nextcloud와 S3 호환 스토리지 연동에 대한 이야기를 해볼까 합니다. 홈랩을 운영하며 다양한 시도를 해왔는데, 이 부분이 정말 꿀팁이 될 것 같아 준비했습니다.

    많은 분들이 Nextcloud를 사용하시면서 ‘아, 용량이 부족한데?’라는 고민을 한 번쯤은 해보셨을 겁니다. 특히 사진, 동영상 같은 미디어 파일이나 백업 데이터를 쌓아두다 보면 금방 한계에 부딪히곤 하죠. 그렇다고 매번 스토리지 용량을 늘리는 건 비용 부담도 만만치 않고, 관리도 번거롭습니다. 이럴 때 등장하는 것이 바로 오브젝트 스토리지(Object Storage)거든요. 쉽게 말해, 파일 단위로 저장하는 NAS나 SAN과 달리, 데이터를 ‘객체(Object)’ 단위로 저장하고 관리하는 방식이에요. 훨씬 유연하고 확장성이 뛰어나 대용량 데이터 처리에 특화되어 있습니다. 그리고 이 오브젝트 스토리지를 Nextcloud와 연결할 수 있다면? 상상만 해도 든든하지 않나요? 오늘은 바로 이 Nextcloud S3 스토리지 연동에 대한 실제 경험을 공유하며, 여러분의 클라우드 스토리지 확장 전략에 대한 인사이트를 드리고자 합니다. MinIO 같은 S3 호환 스토리지를 활용하는 방법을 중심으로 설명드릴게요. S3 호환 스토리지는 AWS S3와 API 호환이 되기 때문에, AWS S3를 직접 사용하지 않더라도 비슷한 방식으로 연동이 가능합니다.

    Nextcloud와 S3 호환 스토리지 연동 아키텍처 개요

    Nextcloud와 S3 호환 스토리지 연동 아키텍처 개요

    1. 왜 S3 호환 스토리지를 Nextcloud에 연동해야 할까요?

    제가 13년간 인프라 엔지니어로 일하면서 가장 많이 들었던 질문 중 하나가 바로 ‘스토리지 확장’에 관한 것이었어요. 특히 Nextcloud 같은 프라이빗 클라우드 솔루션을 사용하다 보면, 사용자 수가 늘어나거나 데이터 사용량이 폭증할 때 스토리지 용량 증설은 피할 수 없는 숙제죠. 기존에 Nextcloud 데이터를 저장하던 로컬 디스크나 NAS의 용량을 늘리는 것은 다음과 같은 단점들이 있습니다.

    • 비용 증가: 고용량 디스크나 NAS 장비를 추가 구매해야 하므로 초기 비용이 많이 들어요.
    • 확장성 제한: 물리적인 공간이나 장비의 한계로 인해 무한정 확장이 어렵습니다.
    • 관리 복잡성: 디스크 추가, RAID 구성 변경 등 관리 작업이 복잡해질 수 있죠.
    • 데이터 관리 비효율: 대용량 데이터를 효율적으로 관리하고 접근하는 데 한계가 있어요.

    이런 문제들을 해결하기 위해 오브젝트 스토리지가 대안으로 떠오르고 있습니다. 오브젝트 스토리지는 데이터를 객체(Object)라는 단위로 저장하며, 각 객체는 고유한 ID와 메타데이터를 가져요. 이러한 구조 덕분에 다음과 같은 장점을 가지게 되는 거죠:

    • 뛰어난 확장성: 사실상 무한대에 가까운 용량 확장이 가능합니다.
    • 비용 효율성: 사용한 만큼만 비용을 지불하는 종량제 방식이 많아서 효율적이에요.
    • 데이터 내구성 및 가용성: 여러 복제본을 저장하여 데이터 손실 위험을 줄이고 안정적인 서비스 제공이 가능해요.
    • 다양한 접근 방식: S3 API 등을 통해 다양한 애플리케이션과 쉽게 연동할 수 있습니다.

    특히 S3 호환 스토리지는 AWS S3와 동일한 API를 사용하기 때문에, AWS S3를 네이티브로 사용하지 않더라도 S3 API를 지원하는 다양한 스토리지 솔루션(예: MinIO, Ceph RGW 등)을 Nextcloud와 연동할 수 있다는 큰 장점이 있어요. 즉, 자체적으로 구축한 오브젝트 스토리지 시스템을 Nextcloud의 백엔드 스토리지로 활용하여 대용량 데이터를 저렴하고 효율적으로 관리할 수 있게 되는 거죠. 제가 홈랩에서 MinIO를 직접 구축하고 Nextcloud와 연동했던 경험을 바탕으로, 이 부분이 왜 매력적인지 더 자세히 설명해 드릴게요.

    2. S3 호환 스토리지란 무엇일까요? (쉽게 말해~)

    자, 여기서 ‘S3 호환 스토리지’라는 말이 조금 어렵게 느껴지실 수도 있어요. 쉽게 풀어 설명해 드릴게요. S3는 Amazon Web Services(AWS)에서 제공하는 오브젝트 스토리지 서비스의 이름이에요. 워낙 많이 사용되고 표준처럼 자리 잡았기 때문에, 많은 스토리지 솔루션들이 AWS S3의 작동 방식과 API를 그대로 따라 만들고 있습니다. 이걸 바로 ‘S3 호환’이라고 부르는 거죠.

    그러니까, S3 호환 스토리지는:

    • AWS S3처럼 데이터를 객체(Object) 단위로 저장하고 관리하는 스토리지입니다.
    • AWS S3와 동일한 API(Application Programming Interface)를 사용해서 데이터를 읽고 쓸 수 있어요.
    • AWS S3가 아닌, 자체적으로 구축하거나 다른 벤더에서 제공하는 스토리지입니다. (예: MinIO, Ceph Rados Gateway, Cloudian 등)

    이게 왜 중요하냐면요, Nextcloud는 기본적으로 로컬 파일 시스템이나 SMB/NFS 같은 네트워크 파일 시스템을 스토리지로 사용하도록 설계되었거든요. 하지만 Nextcloud의 ‘External Storage’ 기능을 활용하면, S3 API를 지원하는 다양한 외부 스토리지 시스템을 마치 Nextcloud 자체 스토리지처럼 사용할 수 있게 되는 거예요. 특히 MinIO 같은 S3 호환 스토리지를 사용하면, 오픈 소스로 구축 가능하면서도 뛰어난 성능과 확장성을 가진 오브젝트 스토리지를 Nextcloud와 연동할 수 있다는 강력한 이점이 생기죠. 제가 직접 MinIO를 설치하고 Nextcloud와 연동하면서 느낀 점은, 마치 AWS S3를 우리 회사 데이터센터에 그대로 옮겨온 듯한 느낌이었어요. 처음엔 이게 가능할까 싶었는데, 실제로 되더라고요!

    3. MinIO 설치 및 기본 설정 (홈랩에서 직접 해보니)

    자, 이제 본격적으로 S3 호환 스토리지의 대표 주자 중 하나인 MinIO를 설치하고 기본 설정을 해보겠습니다. 저는 제 홈랩 환경에서 Docker를 활용하여 MinIO를 설치했는데요, 이게 가장 간편하고 빠르게 테스트해 볼 수 있는 방법이더라고요. 여러분도 비슷한 환경이라면 이 방법을 추천합니다.

    1단계: Docker 및 Docker Compose 설치

    아직 Docker가 설치되어 있지 않다면, 운영체제에 맞게 설치해주세요. 저는 Ubuntu 기준의 명령어를 보여드릴게요.

    sudo apt update
    sudo apt install docker.io docker-compose -y
    
    sudo systemctl start docker
    sudo systemctl enable docker
    

    2단계: MinIO Docker Compose 파일 작성

    프로젝트 디렉토리를 만들고, 그 안에 docker-compose.yml 파일을 생성합니다. 아래는 제가 사용했던 예시 설정이에요. 실제 운영 환경에서는 보안을 위해 볼륨 경로, 비밀번호 등을 더욱 신중하게 설정해야 한다는 점은 꼭 기억해두세요.

    version: '3.7'
    
    services:
      minio:
        image: minio/minio:latest
        container_name: minio
        restart: always
        ports:
          - "9000:9000" # API 포트
          - "9001:9001" # Console 포트
        volumes:
          - minio_data:/data # MinIO 데이터 저장 경로
        environment:
          MINIO_ROOT_USER: "admin"
          MINIO_ROOT_PASSWORD: "password123"
        command: server /data --console-address ":9001"
    
    volumes:
      minio_data:
    

    여기서 중요한 것은 MINIO_ROOT_USER와 MINIO_ROOT_PASSWORD입니다. 이 정보는 나중에 Nextcloud에서 MinIO에 접속할 때 사용되니 잘 기억해두셔야 해요. 저는 테스트를 위해 간단하게 설정했지만, 실제 환경에서는 복잡하고 안전한 비밀번호를 사용하시는 것을 강력히 권장합니다.

    3단계: MinIO 컨테이너 실행

    작성한 docker-compose.yml 파일이 있는 디렉토리에서 다음 명령어를 실행합니다.

    docker-compose up -d
    

    이제 Docker 컨테이너가 백그라운드에서 실행될 거예요. docker ps 명령어로 잘 실행되고 있는지 확인해보세요.

    4단계: MinIO Console 접속 및 버킷 생성

    웹 브라우저를 열고 http://{여러분의 서버 IP}:9001로 접속해보세요. 아까 설정한 ID(admin)와 비밀번호(password123)로 로그인할 수 있습니다. 로그인 후, Nextcloud에서 사용할 버킷(Bucket)을 하나 생성해줍니다. 버킷은 데이터를 담는 컨테이너라고 생각하시면 돼요. 저는 nextcloud-storage라는 이름으로 버킷을 생성했습니다.

    MinIO 웹 콘솔에서 'nextcloud-storage' 버킷 생성 화면

    MinIO 웹 콘솔에서 ‘nextcloud-storage’ 버킷 생성

    4. Nextcloud와 MinIO 연동 설정 (진짜 핵심!)

    이제 가장 중요한 단계입니다. Nextcloud에서 외부 스토리지를 설정하여 방금 만든 MinIO 버킷을 연결하는 과정이에요. 이 설정이 제대로 되어야 Nextcloud의 파일들이 MinIO에 저장되게 됩니다.

    1단계: Nextcloud 관리자 페이지 접속

    Nextcloud 관리자 페이지(Admin Dashboard)에 접속합니다.

    2단계: 외부 스토리지 설정 메뉴 이동

    좌측 메뉴에서 관리(Administration) > 스토리지(Storage)로 이동합니다. 여기서 외부 스토리지(External Storage) 섹션을 찾으세요.

    3단계: 새 외부 스토리지 추가

    ‘+ 외부 스토리지를 추가합니다(Add storage)’ 버튼을 클릭하고, 드롭다운 메뉴에서 ‘Amazon S3’를 선택합니다. MinIO가 S3 API를 호환하기 때문에 Amazon S3를 선택하면 돼요.

    4단계: S3 연결 정보 입력

    이제 MinIO에 연결하기 위한 정보를 입력하는 화면이 나옵니다. 여기서 각 항목을 정확히 입력하는 것이 매우 중요해요. 제가 직접 해보면서 헷갈렸던 부분들을 위주로 설명드릴게요.

    • 연결 이름(Connection name): Nextcloud에서 표시될 스토리지의 이름입니다. 알아보기 쉽게 MinIO Storage 등으로 입력하세요.
    • 호스트(Hostname): MinIO 서버의 주소입니다. Docker로 설치했다면 컨테이너 이름이나 IP 주소를 입력합니다. 저는 minio (Docker Compose 네트워크 내 호스트명) 또는 192.168.1.100 (MinIO 서버 실제 IP) 같이 입력했어요.
    • 포트(Port): MinIO API가 사용하는 포트입니다. 기본값은 9000이에요.
    • 지역(Region): MinIO는 지역 개념이 필수는 아니지만, 필수로 입력해야 하는 경우 아무 값이나 입력해도 돼요. (예: us-east-1)
    • 액세스 키 ID(Access Key ID): MinIO에 설정했던 MINIO_ROOT_USER 값을 입력합니다. (저는 admin)
    • 시크릿 액세스 키(Secret Access Key): MinIO에 설정했던 MINIO_ROOT_PASSWORD 값을 입력합니다. (저는 password123)
    • 버킷 이름(Bucket Name): MinIO에서 생성했던 버킷 이름을 정확히 입력합니다. (저는 nextcloud-storage)
    • SSL/TLS 사용(Enable SSL): MinIO를 HTTPS로 설정했다면 체크합니다. 저는 내부망에서 테스트했기에 체크하지 않았어요.

    모든 정보를 정확히 입력했다면, 우측 상단의 ‘연결 설정(Configure connection)’ 버튼을 클릭합니다. 잠시 후, 연결이 성공하면 초록색 체크 표시가 나타날 거예요. 만약 연결 실패 메시지가 뜬다면, 호스트네임, 포트, Access Key, Secret Access Key, 버킷 이름 등을 다시 한번 꼼꼼히 확인해보세요. 방화벽 설정도 확인해야 할 수 있어요.

    5단계: 마운트 옵션 설정

    연결이 성공하면, 이제 이 외부 스토리지를 Nextcloud의 어느 위치에 마운트할지 설정해야 합니다. ‘마운트(Mount)’ 항목에 원하는 경로를 입력하세요. 예를 들어, /minio-storage와 같이 입력하면, Nextcloud의 파일 목록에 minio-storage라는 폴더가 생기고, 그 안에 MinIO 버킷의 모든 파일이 보이게 돼요.

    6단계: ‘폴더 사용(Use folder)’ 클릭

    모든 설정이 완료되면, 입력한 경로 옆의 ‘폴더 사용(Use folder)’ 버튼을 클릭하여 설정을 확정합니다.

    이제 Nextcloud의 파일 목록으로 돌아가면, 방금 설정한 경로(예: /minio-storage)에 MinIO 버킷의 내용이 나타나는 것을 확인할 수 있어요. Nextcloud와 MinIO 연동이 성공한 거죠!

    Nextcloud 외부 스토리지 설정 화면: S3 연결 정보 입력

    5. 실제 사용 및 성능 검증

    자, 이제 Nextcloud와 MinIO가 성공적으로 연동되었어요! 그럼 실제 사용은 어떨까요? 제가 겪었던 몇 가지 경험과 주의사항을 공유해 드릴게요. 처음에는 ‘이야, 이제 용량 걱정 없겠다!’하고 신나서 이것저것 많이 올려봤어요. 사진, 동영상, 백업 파일 등등… 용량이 정말 순식간에 늘어나더라고요. MinIO 스토리지 자체는 워낙 확장성이 좋으니 문제가 없었지만, Nextcloud의 파일 접근 속도나 동기화 성능에서 약간의 아쉬움이 느껴질 때도 있었어요.

    초기에 느낀 점은 Nextcloud의 기본 설정 그대로 사용했더니, 대용량 파일 업로드/다운로드 시 응답 속도가 조금 느리게 느껴진다는 거였어요. 특히 동기화 클라이언트에서 파일을 불러올 때 딜레이가 있더라고요. 이 문제를 해결하기 위해 Nextcloud와 MinIO의 여러 설정을 조정해봤습니다.

    • Nextcloud 설정 최적화: Nextcloud의 config.php 파일을 조정하여 캐싱 설정을 변경하거나, memory_limit 같은 PHP 설정을 늘려주는 것이 도움이 되었어요. 또한, Nextcloud의 External Storage 설정에서 ‘Enable preview’ 옵션을 끄거나, ‘Background jobs’를 Cron으로 설정하는 등 최적화 작업을 진행했습니다.
    • MinIO 성능 튜닝: MinIO 자체의 성능을 높이기 위해, 더 빠른 디스크를 사용하거나, MinIO 서버의 CPU/메모리 자원을 충분히 확보하는 것도 중요했어요. 또한, Nextcloud에서 MinIO로 접근할 때 사용하는 네트워크 대역폭도 충분해야 했습니다.
    • 버킷 및 객체 관리: MinIO의 버킷 설정을 통해 라이프사이클 정책(Lifecycle Policies)을 설정하여 오래된 데이터를 자동으로 삭제하거나 아카이빙하는 것도 용량 관리에 큰 도움이 되었어요.

    이런 최적화 작업을 거치면서, 대용량 파일도 훨씬 빠르고 안정적으로 주고받을 수 있게 되었습니다. 특히 Home Assistant 같은 다른 서비스의 백업 데이터를 MinIO에 직접 저장하고, Nextcloud를 통해 접근하도록 구성했을 때, 용량 관리와 접근성이 동시에 해결되는 것을 보며 ‘이거 진짜 물건이다’ 싶었어요. Nextcloud의 ‘External Storage’에서 ‘Enable sharing’ 옵션을 끄면, 외부 스토리지에 저장된 파일의 공유 기능을 비활성화하여 보안을 강화할 수 있다는 팁도 알게 됐어요.

    검증 결과:

    • 용량 확장성: 무한대에 가까운 용량 확보 ✓
    • 데이터 접근 속도: 최적화 후 만족스러운 수준 달성 ✓
    • 안정성: MinIO의 자체 내구성 기능 활용으로 안정성 확보 ✓
    • 비용 효율성: 자체 구축으로 AWS S3 대비 비용 절감 효과 ✓

    Nextcloud 파일 목록: MinIO에 저장된 파일 확인

    6. 마치며: 더 넓은 클라우드 공간을 향해

    오늘 우리는 Nextcloud와 S3 호환 스토리지 (MinIO) 연동을 통해 대용량 클라우드 스토리지 확장 전략을 살펴봤습니다. 처음에는 다소 복잡하게 느껴질 수 있지만, 한번 제대로 구축해두면 그 어떤 방법보다 유연하고 확장성이 뛰어나며 비용 효율적인 스토리지 환경을 만들 수 있다는 걸 직접 경험했어요. 특히 개인 홈랩을 운영하는 분들이나, 자체적인 프라이빗 클라우드 환경을 구축하려는 기업에게는 정말 매력적인 솔루션이라고 생각해요.

    제가 겪었던 여러 경험들이 여러분의 시행착오를 줄이는 데 조금이나마 도움이 되었으면 좋겠습니다. 이 과정을 통해 단순히 용량을 늘리는 것을 넘어, 데이터를 더욱 효율적으로 관리하고 접근하는 방법에 대한 인사이트를 얻으셨기를 바래요.

    앞으로도 저는 13년차 인프라 엔지니어의 경험을 바탕으로, 여러분의 IT 환경 구축과 운영에 실질적인 도움이 될 수 있는 꿀팁들을 계속해서 공유할 예정입니다. 혹시 Nextcloud나 오브젝트 스토리지에 대해 더 궁금한 점이 있다면 언제든지 댓글로 남겨주세요! 함께 이야기 나누고 해결해나가면 좋겠어요. 다음 글에서는 아마도 이 스토리지 환경을 활용한 백업 전략이나, 보안 강화 방법에 대해 다루게 될 것 같네요. 기대해주세요!

    Nextcloud S3 스토리지 연동: 클라우드 확장 전략 요약