본문 바로가기
IT/HomeLabs

[HomeLab] 2일 차: 구글 포토보다 강력한 무료 사진 서버, Immich 설치 & 17,000장 이민(Migration) 대작전

by 수누다 2026. 2. 11.

부제: 웹 업로드는 거들 뿐, 엔지니어는 CLI로 승부한다

들어가며

안녕하세요, 시스템 엔지니어 수누다입니다.

어제 Proxmox와 i5-8500, 그리고 11TB ZFS 스토리지라는 든든한 기반을 다졌습니다. 이제 본격적으로 이 위에 건물을 올릴 차례입니다.
오늘의 목표는 단 하나.
"12년 치 아이들 사진 17,000장을 구글 포토에서 내 서버로 안전하게 옮기는 것."

하지만 엔지니어의 삶이 늘 그렇듯, 클릭 한 번으로 끝나는 일은 없었습니다. 웹 브라우저가 뻗고, 믿었던 Cloudflare 터널이 무너지는 난관을 뚫고 성공한 '대용량 마이그레이션 노하우'를 공유합니다.


🚀 1. Immich 설치: 도커(Docker)의 축복

예전에는 서버 하나 띄우려면 의존성(Dependency) 지옥과 싸워야 했지만, 지금은 Docker Compose가 있습니다.
Proxmox의 LXC 컨테이너(102번)에 접속해 단 몇 줄의 설정 파일(docker-compose.yml)만 있으면 구글 포토와 맞먹는 시스템이 뚝딱 만들어집니다.

# docker-compose.yml (핵심 요약)
services:
  immich-server:
    image: ghcr.io/immich-app/immich-server:release
    volumes:
      - ${UPLOAD_LOCATION}:/usr/src/app/upload
    devices:
      - /dev/dri:/dev/dri # (1일 차에 고생해서 뚫어놓은 GPU!)
    ports:
      - 2283:3001

명령어 한 방이면 설치 끝!

docker compose up -d

웹 브라우저로 http://192.168.XXX.XXX:2283에 접속하니, 감격스러운 "Immich 환영합니다" 문구가 뜹니다.


☁️ 2. 외부 접속의 꿈: Cloudflare Tunnel

집 밖에서도 와이프가 사진을 볼 수 있어야 하기에, 포트 포워딩 대신 보안이 뛰어난 Cloudflare Tunnel을 연결했습니다. 유료 도메인까지 연결하고 나니, 정말 구글 포토가 부럽지 않았습니다.
...이때까지만 해도 모든 게 완벽한 줄 알았습니다.


⚡ 3. 위기: 17,000장의 역습 (웹 업로드 실패)

PC에 백업해 둔 17,000장의 사진 폴더를 웹 브라우저로 드래그 앤 드롭 했습니다.
처음엔 잘 올라가는가 싶더니...

"Error 1033: Cloudflare Tunnel error"
"Network Error"
"멈춤"

브라우저는 수천 장의 처리를 감당하지 못하고 뻗어버렸고, 무료 플랜인 Cloudflare 터널은 트래픽 폭주를 견디지 못하고 연결을 끊어버렸습니다. (대용량 업로드를 터널로 하는 건 무리였습니다.)


🛠️ 4. 해결책: "엔지니어는 CLI를 쓴다"

GUI(그래픽 화면)가 배신할 때, 엔지니어는 검은 화면(CLI)을 켭니다.
Immich는 다행히 개발자 친화적인 CLI 업로드 도구를 제공합니다.

[Step 1] 내부망(Local)으로 우회하라
터널이 자꾸 끊기니, 외부 인터넷을 통하지 않고 집 내부 네트워크(LAN)로 직통 연결을 시도했습니다.

# 외부 도메인 대신 내부 IP(192.168...)로 로그인
immich login http://192.168.XXX.XXX:2283 [API_KEY]

[Step 2] 재귀(Recursive) 업로드 명령
폴더 구조를 그대로 유지한 채, 앨범까지 자동으로 만들어주는 마법의 명령어입니다.

immich upload --recursive "E:\나스 사진" --album

결과는 대성공.
Cloudflare를 거치지 않으니 기가비트 속도(100MB/s)로 전송되기 시작했고, 중간에 멈춰도 명령어를 다시 치면 "이미 올라간 건 건너뛰고(Skipped)" 남은 것만 똑똑하게 올립니다.
(CLI 화면에서 초록색 게이지가 쭉쭉 차오르는 걸 볼 때의 쾌감이란!)


📉 5. 트러블 슈팅: 서버가 멈춘 이유

업로드가 잘 되다가 갑자기 서버가 먹통이 되었습니다.
알고 보니 고화질 동영상(MOV, 4K)이 들어가는 순간, Immich가 썸네일을 만들고 트랜스코딩을 하느라 CPU 점유율이 100%를 찍고 뻗어버린 겁니다.

응급 처치:

  1. 일단 멈춤: Immich 웹 관리자 페이지에서 Jobs(작업)를 모두 Pause(일시 정지) 시켰습니다.
  2. 선입력 후처리: "일단 파일부터 다 받고, 변환은 나중에 해라."
  3. 업로드 재개: 서버 부하가 줄어드니 나머지 파일들도 순식간에 업로드 완료!

(나중에 안 사실이지만, i5-8500의 GPU 설정을 살짝 만져줘야 동영상 처리가 원활해집니다. 이건 나중에 튜닝 편에서 다루겠습니다.)


🎉 2일 차 결산

우여곡절 끝에 17,631장의 사진과 동영상이 제 개인 서버에 안착했습니다.

  • 총 용량: 약 157GB
  • 소요 시간: CLI 사용 후 약 1시간 컷 (웹으로 했으면 3일 걸렸을 듯)
  • 결과: 구글 포토처럼 날짜별로 정렬되고, 지도에 위치까지 찍히는 걸 보니 감동입니다. 이제 사진은 안전합니다.

내일은 이 쾌적한 서버 환경을 유지하기 위해 "우리 집 인터넷 청정구역 만들기: AdGuard Home" 편으로 돌아오겠습니다. (뉴스 볼 때 뜨는 성인 광고, 이제 안녕!)

[오늘의 교훈]

  1. 대용량 업로드는 웹 브라우저를 믿지 마라. CLI가 답이다.
  2. 집 안에서는 외부 도메인보다 내부 IP가 훨씬 빠르고 안정적이다.
  3. 서버가 느려지면 일단 '일시 정지'를 누르는 게 상책이다.