13년차의 서버실

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

구글 포토 대신 Immich 자가호스팅 — 홈랩 사진서버 실전 (GPU 없이)

구글 포토의 무료 무제한이 사라진 뒤로 “사진을 어디에 둘까”는 모두의 고민입니다. 저는 홈랩에 Immich를 올려서 스마트폰 사진을 자동 백업하고 있습니다. 구글 포토와 거의 똑같은 경험을 내 서버, 내 디스크에서요. 실제 운영 구성과 GPU 없이 돌리는 요령을 공개합니다.

1. Immich가 뭐고 왜 좋은가

Immich는 셀프호스팅 사진·영상 관리 서버입니다. 구글 포토를 대체하도록 만들어져서 —

  • 스마트폰 앱으로 자동 백업(찍으면 알아서 올라감)
  • 얼굴 인식·사물 검색(“바다”, “강아지”로 검색)
  • 타임라인·앨범·공유 등 익숙한 UI
  • 무엇보다 내 데이터가 외부로 안 나감

2. 실제 구성 — 4개 컨테이너

제 홈랩에서는 LXC 컨테이너 안에 Docker로 Immich 스택을 돌립니다. 구성은 이렇게 4개로 나뉩니다.

컨테이너 역할
immich-server API·웹 UI·업로드 처리
immich-machine-learning 얼굴 인식·스마트 검색(ML)
postgres(pgvector) 메타데이터 + 벡터 검색 DB
redis(valkey) 작업 큐·캐시

여기서 눈여겨볼 건 postgres가 pgvector 계열이라는 점입니다. 얼굴·사물 검색을 위해 사진의 특징을 벡터로 저장하고, 그 벡터를 DB에서 유사도로 검색합니다. 그래서 “비슷한 사진”이나 자연어 검색이 됩니다.

3. 사진은 ZFS NAS에, 대용량을 감당

핵심은 사진 원본을 어디에 두느냐입니다. 저는 컨테이너 디스크가 아니라 ZFS 기반 NAS 데이터셋에 저장합니다. 현재 사진 라이브러리만 1.3TB가 넘는데, 컨테이너 rootfs(수십 GB)로는 어림도 없죠.

# docker-compose.yml (요지) — 업로드 경로를 NAS 볼륨에 매핑
services:
  immich-server:
    volumes:
      - /mnt/nas/immich:/usr/src/app/upload   # 원본은 대용량 NAS로

이렇게 하면 애플리케이션(컨테이너)과 데이터(NAS)를 분리할 수 있습니다. 컨테이너를 갈아엎어도 사진은 NAS에 그대로 있고, ZFS라 스냅샷·확장도 자유롭습니다.

4. GPU 없이 ML 돌리기

Immich의 얼굴 인식·스마트 검색은 머신러닝이라 “GPU 있어야 하지 않나?” 싶지만, 제 홈랩엔 외장 GPU가 없습니다. ML 컨테이너는 CPU로도 잘 돌아갑니다. 다만 —

  • 처음 대량의 사진을 일괄 인덱싱할 때만 CPU를 오래 씁니다(밤새 돌려두면 됨).
  • 인덱싱이 끝나면 이후 검색·인식은 가볍습니다.
  • 즉 초기 1회만 참으면 GPU 없이도 실사용에 지장이 없습니다.

수만 장을 한 번에 넣으면 며칠 걸릴 수 있으니, 처음엔 ML 작업을 밤 시간대에 몰아서 돌리는 걸 권합니다.

5. 운영하며 느낀 점

  • 백업은 별개다: Immich는 사진 “관리”이지 백업이 아닙니다. NAS가 죽으면 끝이니, 사진 원본은 반드시 별도 백업(오프사이트)을 두세요.
  • DB도 소중하다: 앨범·얼굴 정보는 postgres에 있습니다. 사진 파일과 함께 DB 백업도 챙겨야 완전 복구가 됩니다.
  • 업그레이드 전 스냅샷: 마이너 업데이트에서도 DB 마이그레이션이 있으니, 올리기 전에 컨테이너·DB 스냅샷을 찍어두면 안전합니다.

구글 포토를 벗어나고 싶은 분께 Immich는 현재 가장 완성도 높은 선택지입니다. 홈랩에 NAS가 있다면, 사진 주권을 되찾는 첫걸음으로 강력 추천합니다.