휴대폰 사진 몇 만 장, 어디에 두고 계신가요? 구글 포토가 편하긴 한데 용량 정책이 바뀔 때마다 마음이 불안하고, 사진이 회사 서버에 쌓이는 건 찝찝하고, 매달 내는 구독료는 아깝다 — 그렇다면 이 글의 주인공입니다. Immich는 구글 포토 같은 사진 백업·관리 경험을 내 서버로 그대로 가져오는 오픈소스입니다.
필요한 것은 사진 원본 크기만큼의 디스크와 서버 한 대뿐이다. 구독료는 없다.
Immich는 사진·영상 백업과 열람에 특화된 오픈소스 셀프호스팅 서비스다. 2022년에 시작해 지금은 셀프호스팅 사진 관리의 대표주자로 자리 잡았다. 스마트폰 앱이 사진을 백그라운드로 자동 업로드하고, 웹에서 구글 포토와 비슷한 화면으로 열람·검색·공유할 수 있다.
기능을 정리하면:
| 기능 | 내용 |
|---|---|
| 자동 백업 | 앱 설치 후 한 번만 설정하면 새 사진이 백그라운드로 업로드 |
| 얼굴 인식 | 사람별로 자동 분류. 인물별 타임라인 제공 |
| 스마트 검색 | "바다", "눈 오는 날" 같은 의미 검색 지원 |
| 메모리 | 올해의 오늘 — 작년 이날 찍은 사진을 보여줌 |
| 공유 | 공유 링크(만료일 설정 가능), 공유 앨범, 가족 계정 |
| 원본 보존 | 서버가 재압축하지 않는다. 업로드한 원본이 그대로 저장 |
| 라이브 포토·영상 | 아이폰 라이브 포토, 4K 영상까지 그대로 |
구글 포토에서 이전할 때 가장 걱정하는 건 "검색과 자동 분류가 되나"인데, 얼굴 인식과 의미 검색은 수만 장 기준으로 충분히 실용적이다. 저장 용량 개념도 다르다 — 구독 공간이 아니라 내 디스크가 한도다.
Immich는 웹 서버 하나로 끝나지 않고, 역할별 컨테이너 조합으로 돌아간다.
flowchart LR
subgraph DEV["기기"]
P["휴대폰 앱 - 백그라운드 자동 백업"]
PC["브라우저 - 열람·관리"]
end
subgraph SRV["Docker 서버"]
SV["immich-server - 웹UI와 API"]
ML["machine-learning - 얼굴·장면 인식"]
RD["Redis - 작업 큐"]
DB[("PostgreSQL - 앨범·메타데이터")]
end
ST[("저장소 - 사진 원본")]
P -->|원본 업로드| SV
PC --> SV
SV --> ML
ML --> RD
SV --> DB
SV --> ST
사진 원본은 서버가 손대지 않는다. 폴더에 원본 파일이 그대로 쌓이므로, 언젠가 Immich를 그만두더라도 사진은 그냥 파일로 남는다 — 이게 셀프호스팅 사진 관리에서 제일 중요한 안전장치다.
요구 사양은 순정 상태로 RAM 4GB 이상(여유 있으면 6GB), 디스크는 사진 원본 총량의 1.2배 정도면 시작할 수 있다.
Immich는 공식 저장소에 설치용 compose와 환경변수 파일을 제공하니, 그것을 기준으로 두 값만 고르는 게 가장 안전한 방법이다.
mkdir -p /opt/docker/immich && cd /opt/docker/immich
# 공식 저장소에서 docker-compose.yml과 example.env를 받아온다 (설치 문서 참조)
.env에서 꼭 챙길 두 가지:
UPLOAD_LOCATION=/opt/docker/immich/data # 사진 원본이 쌓일 위치 — 넉넉한 디스크로
DB_PASSWORD=데이터베이스비밀번호 # 반드시 변경
docker compose up -d
브라우저로 http://서버IP:2283을 열고 관리자 계정을 만든다. 첫 화면이 바로 업로드 화면이라, 외장하드에 흩어진 사진을 드래그해서 몰아넣을 수도 있다.
앱스토어에서 Immich 앱을 설치하고, 서버 주소와 계정을 입력한 뒤 백업 대상 폴더(카메라 등)를 선택하고 자동 백업을 켠다. 여기서 한 가지, 갤럭시라면 배터리 최적화 예외에 Immich 앱을 넣어야 백그라운드 업로드가 끊기지 않는다. 이걸 빼먹으면 "와이파이인데 왜 안 올라가지?"의 원인 1순위다.
수천 장을 처음 올리면 인식 작업(얼굴·검색 임베딩)이 몰아서 돈다. 일반 x86 서버에서 수천 장 기준 한두 시간 정도 걸리고, 이후에는 새 사진만 처리하니 체감이 없다. 얼굴 인식 결과는 관리자 화면에서 사람별로 이름을 달아주면 된다.
Immich는 발전 속도가 빠른 프로젝트라 업데이트가 잦다. 업데이트는 docker compose pull && docker compose up -d 한 줄이지만, 데이터베이스 볼륨을 먼저 백업하는 습관을 들이자. 마이그레이션이 자동으로 돌아가는 구조라, 되돌릴 때는 백업이 유일한 수단이다.
용량 계획은 단순하다. 원본 재압축이 없으므로 서버 용량 증가 속도 = 사진 촬영량이다. 휴대폰 한 대 연간 30~50GB를 잡고, 여유율 20%로 디스크를 준비하면 된다.
백업의 백업. Immich에 넣었다고 끝이 아니다. 서버 디스크가 죽으면 사진도 함께 죽는다. 업로드 폴더를 주기적으로 NAS 등 다른 저장소에 복사하는 스크립트를 한 줄 걸어두자. 중요한 데이터의 3-2-1 원칙(원본 1, 다른 매체 2, 다른 장소 1)은 사진이 제일 잘 맞는다.
가족과 함께 쓰기. 계정을 여러 개 만들어 각자 백업하게 하고, 아이 사진은 파트너 공유로 부부가 서로 보게 하며, 할머니께는 공유 링크로만 전달하는 식의 운영이 깔끔하다.
| 증상 | 원인 | 해결 |
|---|---|---|
| 백업이 멈춘다 | 배터리 최적화가 앱을 종료 | 앱 배터리 제한 해제·예외 등록 |
| 얼굴 인식이 진행 안 된다 | machine-learning 컨테이너 문제 | 컨테이너 로그·재시작 |
| 검색이 안 나온다 | 검색 임베딩 미생성 | 관리자 화면에서 스마트 검색 작업 재실행 |
| 디스크가 급격히 찬다 | 영상·라이브 포토 포함 원본 저장 | 용량 계획에 영상 포함해서 재계산 |
| 업데이트 후 웹UI 오류 | DB 마이그레이션 관련 | 업데이트 전 백업 후 진행, 로그 확인 |
품질이 다르다. Immich는 원본을 그대로 저장한다(재압축 없음). 검색·얼굴 인식 경험은 거의 동급이고, 저장 한도는 구독료가 아니라 내 디스크다. 대신 관리와 백업은 내 몫이 된다.
사진 수만 장 기준으로 일반 x86 서버(RAM 4GB+)면 충분하다. 처음 대량 업로드 때 인식 작업이 무거울 뿐, 이후에는 가볍다. GPU는 필수가 아니다.
사진 원본은 폴더에 그대로 쌓이므로 폴더 백업으로 충분하고, 앨범·사람 태그 같은 메타데이터는 DB 백업으로 보존한다. 둘 다 주기 복사 스크립트로 해결된다.
계정을 나눠 각자 백업하고, 공유 앨범·파트너 공유·공유 링크로 필요한 것만 서로 보여줄 수 있다.
서버 한 대로 충분하다 연재 목차 — 시리즈 소개 · 1화. Home Assistant · 2화. Frigate + go2rtc · 3화. Seafile 13
실제 운영 서버에서 가족 계정과 함께 사용 중인 구성입니다.