부제: 웹 업로드는 거들 뿐, 엔지니어는 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%를 찍고 뻗어버린 겁니다.
✅ 응급 처치:
- 일단 멈춤: Immich 웹 관리자 페이지에서 Jobs(작업)를 모두 Pause(일시 정지) 시켰습니다.
- 선입력 후처리: "일단 파일부터 다 받고, 변환은 나중에 해라."
- 업로드 재개: 서버 부하가 줄어드니 나머지 파일들도 순식간에 업로드 완료!
(나중에 안 사실이지만, i5-8500의 GPU 설정을 살짝 만져줘야 동영상 처리가 원활해집니다. 이건 나중에 튜닝 편에서 다루겠습니다.)
🎉 2일 차 결산
우여곡절 끝에 17,631장의 사진과 동영상이 제 개인 서버에 안착했습니다.
- 총 용량: 약 157GB
- 소요 시간: CLI 사용 후 약 1시간 컷 (웹으로 했으면 3일 걸렸을 듯)
- 결과: 구글 포토처럼 날짜별로 정렬되고, 지도에 위치까지 찍히는 걸 보니 감동입니다. 이제 사진은 안전합니다.
내일은 이 쾌적한 서버 환경을 유지하기 위해 "우리 집 인터넷 청정구역 만들기: AdGuard Home" 편으로 돌아오겠습니다. (뉴스 볼 때 뜨는 성인 광고, 이제 안녕!)
[오늘의 교훈]
- 대용량 업로드는 웹 브라우저를 믿지 마라. CLI가 답이다.
- 집 안에서는 외부 도메인보다 내부 IP가 훨씬 빠르고 안정적이다.
- 서버가 느려지면 일단 '일시 정지'를 누르는 게 상책이다.
'IT > HomeLabs' 카테고리의 다른 글
| [HomeLab] 4일 차: OneNote 탈출기 - Wiki.js 구축과 11TB NAS 실시간 이중화 전략 (0) | 2026.02.16 |
|---|---|
| [HomeLab] 4일 차: 아빠표 넷플릭스 만들기 - Jellyfin과 하드웨어 트랜스코딩의 세계 (0) | 2026.02.15 |
| [HomeLab] 3일 차: 13년 차 엔지니어도 피해 갈 수 없는 '삽질'과 아키텍처 재설계 (File Browser + Cloudflare) (0) | 2026.02.12 |
| [HomeLab] 구글 포토 독립 선언! 13년 차 엔지니어의 11TB 서버 구축기 (Proxmox & GPU 삽질기) (0) | 2026.02.10 |
| [HomeLab] 방구석 천재 AI에게 '인터넷(Web Search)'이라는 무기를 쥐여주다 (3부/완결) (3) | 2026.02.07 |
| [HomeLab] 돌고 돌아 순정! Python과 Docker로 3분 만에 AI 봇 구축하기 (2부) (0) | 2026.02.06 |