Self-hosting my photos with Immich

Michael Stapelberg

Immich로 사진 셀프 호스팅하기

제가 사용하는 모든 클라우드 서비스에 대해 백업과 독립성을 위해 데이터의 로컬 사본을 갖고 싶습니다. 안타깝게도 Google이 OAuth 범위를 제한하면서 gphotos-sync 도구가 2025년 3월에 동작을 멈췄고, 그래서 기존 Google Photos 환경을 대체할 방법이 필요했습니다. 이 글에서는 셀프 호스팅이 가능한 사진 관리자인 Immich를 어떻게 구축했는지 설명합니다.

최종 결과물은 다음과 같습니다. NixCon 2025에서 찍은 사진 몇 장(라이브 포토 포함)입니다:

웹 브라우저에서 본 Immich 스크린샷

1단계. 하드웨어

저는 Immich를 Ryzen 7 Mini PC (ASRock DeskMini X600)에서 실행하고 있습니다. 유휴 상태에서 전력 소모가 10W 미만이며 VM을 돌리기에 충분한 자원(64GB RAM, 1TB 디스크)을 갖추고 있습니다. 자세한 내용은 2024년 7월에 작성한 블로그 글에서 확인하실 수 있습니다:

이 미니 서버를 VM으로 나누기 위해 오픈소스 가상화 플랫폼인 Proxmox를 설치했습니다. 물론 Immich를 서버에 바로 설치해도 됩니다.

2단계. Immich 설치

500GB 디스크, 4개 CPU 코어, 4GB RAM을 할당해 “photos”라는 이름의 VM을 만들었습니다.

초기 가져오기를 할 때는 CPU와 RAM을 더 많이 할당해도 되지만, 평소 사용에는 이 정도면 충분합니다.

이 블로그 글에서 설명한 대로 해당 VM에 (선언적으로) NixOS를 설치했습니다:

이후 다음 설정으로 Immich를 활성화했습니다:

services.immich = {
  enable = true;
};

이 시점에서 Immich는 localhost에서는 접근할 수 있지만 네트워크를 통해서는 접근할 수 없습니다. NixOS가 기본적으로 방화벽을 활성화하기 때문입니다. services.immich.openFirewall 옵션을 활성화할 수도 있지만, 저는 Immich를 Tailscale VPN을 통해서만 접근할 수 있도록 하고 싶었습니다. 이 경우에는 방화벽을 열 필요가 없습니다. 대신 tailscale serve를 사용해 트래픽을 localhost:2283으로 전달합니다:

photos# tailscale serve --bg http://localhost:2283

Tailscale의 MagicDNSTLS 인증서 프로비저닝을 활성화해 두었기 때문에, 이제 PC나 노트북, 휴대폰의 브라우저에서 https://photos.example.ts.net 주소로 접속할 수 있습니다.

2단계. 초기 사진 가져오기

처음에는 공식 Immich CLI를 이용해 사진을 가져와 봤습니다:

% nix run nixpkgs#immich-cli -- login https://photos.example.ts.net secret
% nix run nixpkgs#immich-cli -- upload --recursive /home/michael/lib/photo/gphotos-takeout

안타깝게도 업로드가 안정적으로 진행되지 않았고 타임아웃이 발생해 몇 차례 수동으로 재시작해야 했습니다. 나중에 알게 된 원인은 Immich 서버가 썸네일 생성, 메타데이터 추출, 얼굴 인식 같은 백그라운드 작업을 실행하는데, 이 작업들이 업로드 속도를 느리게 만들어 타임아웃으로 실패할 정도였기 때문입니다.

또 다른 문제는 업로드가 끝난 뒤에야 알게 됐는데, Google Photos용 Google Takeout 아카이브에는 원본 이미지 파일 옆에 별도의 JSON 파일로 메타데이터가 들어 있다는 점이었습니다:

Takeout: Google Photos 형식

안타깝게도 이러한 파일은 immich-cli에서 처리되지 않습니다.

다행히 immich-go라는 훌륭한 서드파티 도구가 있어 두 문제를 모두 해결해 줍니다! 업로드 전에 백그라운드 작업을 일시 중지하고 업로드 후에 다시 시작하기 때문에 훨씬 안정적으로 동작하며, Google Takeout 아카이브도 최대한 잘 이해하려고 노력합니다.

저는 다음과 같이 immich-go를 실행했고 아주 잘 동작했습니다:

% immich-go \
  upload \
  from-google-photos \
  --server=https://photos.example.ts.net \
  --api-key=secret \
  ~/Downloads/takeout-*.zip

3단계. Immich iPhone 앱 설치

새 사진의 주 출처가 휴대폰이므로 iPhone에 Immich 앱을 설치하고 Tailscale URL로 Immich 서버에 로그인한 뒤, 오른쪽 상단 아이콘을 통해 새 사진 자동 백업을 활성화했습니다.

이 설정이 정확한지는 100% 확신할 수 없지만, 카메라 사진은 보통 Live Photos로 들어가고 Recent가 나머지 파일을 담당하는 것 같습니다…?!

혹시 정확히 아시는 분이 계시면 설명(또는 링크!)을 보내 주시면 글을 업데이트하겠습니다.

Immich의 알림은 꼭 꺼두시길 강력히 권장합니다. 그렇지 않으면 백그라운드에서 이미지를 업로드할 때마다 알림이 옵니다. 이 알림은 백그라운드 업로드가 동작하는 데 필요하지 않으며, 한 Immich 개발자가 Reddit에서 확인해 준 바와 같습니다. SettingsAppsImmichNotifications로 이동해 권한 체크박스를 해제하세요:

4단계. 백업

Immich의 백업 문서에는 유용한 권장 사항이 담겨 있습니다. Immich 개발자들은 UPLOAD_LOCATION의 전체 내용을 백업할 것을 권장하는데, NixOS에서는 /var/lib/immich가 해당 위치입니다. backups 하위 디렉터리에는 SQL 덤프가 들어 있고, upload, library, profile 세 디렉터리에 사용자가 업로드한 모든 데이터가 들어 있습니다.

그래서 저는 systemd 타이머를 설정해 rsync/var/lib/immich를 제 PC로 복사하도록 했습니다. 이 PC는 3-2-1 백업 전략을 따르고 있습니다.

아직 부족한 점은?

Immich에는 (현재로서는?) 사진 편집 기능이 없기 때문에, 이미지를 회전하거나 자르려면 다운로드한 뒤 GIMP를 사용합니다.

이미지를 공유할 때는 (누구와 공유하느냐에 따라) 여전히 Google Photos에 업로드합니다.

왜 Immich인가?

셀프 호스팅 이미지 관리 도구 중 가장 유망해 보이는 두 가지는 ImmichEnte입니다.

제 주변에서는 Immich가 더 인기 있는 것 같았고, Ente는 제가 찾는 것보다 범위가 훨씬 넓다는 인상을 받았습니다:

Ente는 서비스 제공자를 신뢰하지 않고도 클라우드에 데이터를 저장할 수 있는 완전한 오픈소스 종단간 암호화 플랫폼을 제공하는 서비스입니다. 이 플랫폼 위에서 지금까지 두 가지 앱을 만들었습니다: Ente Photos(Apple 및 Google Photos의 대안)와 Ente Auth(지원이 종료된 Authy를 대체하는 2FA 앱)입니다.

저는 종단간 암호화 플랫폼이 필요하지 않습니다. 이미 전송 계층(Tailscale)과 디스크 계층(LUKS)에서 암호화를 적용하고 있어 더 복잡하게 만들 필요가 없습니다.

결론

Immich는 정말 훌륭한 앱입니다! 매우 빠르고 전반적으로 잘 동작합니다.

초기 가져오기는 올바른 도구를 사용할 때만 원활합니다. 가능하다면 공식 immich-cli가 개선되면 좋겠습니다. 혹은 immich-go가 공식 도구가 되어도 좋겠고요.

iPhone에서 자동 백업 설정이 너무 어렵다고 생각하므로, 이 부분도 개선되면 좋겠습니다.

하지만 이러한 초기 진입 장벽을 제외하면 불만은 없습니다.

원문은 Michael Stapelberg님이 에 게재했습니다.

이 글은 muse-spark-1.2-contributor 모델을 사용해 번역했습니다.