PhotoPrism vs Immich 비교: 나에게 맞는 사진 서버는?
자체 호스팅 사진 서버인 PhotoPrism과 Immich를 비교합니다. RAM 점유율, 모바일 앱 성능, 지도 기능 및 VPS 환경에서의 필수 백업 명령어까지 두 서비스의 핵심 차이를 상세히 분석합니다.
PhotoPrism와 Immich: 요약
PhotoPrism와 Immich를 비교하는 것은 같은 제품의 두 버전을 선택하는 것이 아니라, 서로 다른 목적을 가진 두 도구 중 하나를 선택하는 것입니다. Immich는 Google Photos를 대체합니다. 휴대폰 앱이 카메라 롤을 자동으로 백업하며, 타임라인 구성은 휴대폰 갤러리를 사용하던 사용자에게 익숙한 형태입니다. 반면 PhotoPrism은 이미 보유한 사진 라이브러리를 정리합니다. 디스크에 있는 파일 폴더를 인덱싱하고 메타데이터를 읽어 지도에 표시하며, 파일은 원래 위치 그대로 유지합니다.
"휴대폰 용량이 부족하고 Google Photos에서 벗어나고 싶다"면 Immich를 선택하십시오. "드라이브에 400 GB의 사진이 있는데 무엇이 어디 있는지 찾기 어렵다"면 PhotoPrism을 선택하십시오. 두 서비스 모두 오픈 소스이며, 일반적인 VPS에서 Docker 컨테이너로 실행됩니다. 또한 제3자에게 데이터를 전송하지 않고 라이브러리를 인덱싱하고 검색할 수 있습니다.
철학의 차이와 그에 따른 결정적 영향
Immich는 파일을 직접 관리합니다. 업로드 위치를 지정하면 휴대폰 앱이나 웹 업로더가 원본 파일을 전송하고, Immich는 이를 자체 경로와 명명 규칙에 따라 저장합니다. 앨범, 얼굴 인식, 검색에 대한 정보는 데이터베이스가 관리합니다. 이러한 설계 덕분에 서버가 모든 자산의 상태를 항상 완벽하게 파악할 수 있어 모바일 환경에서 우수한 사용자 경험을 제공합니다.
PhotoPrism은 파일을 읽습니다. 사용자가 이미 관리 중인 originals 폴더를 마운트하면 PhotoPrism이 그 위에 인덱스를 생성합니다. 디렉터리 구조는 사용자의 소유로 유지됩니다. 내일 당장 PhotoPrism을 삭제하더라도 사진은 원래 폴더에 원래 이름 그대로 남아 있습니다. PhotoPrism이 분석한 내용을 기록한 사이드카 YAML 파일은 기본적으로 별도의 저장소 폴더에 보관됩니다.
이 단 하나의 차이가 나머지 대부분의 특징을 설명합니다. Immich는 데이터 수집 과정을 직접 제어하기 때문에 모바일 지원이 강력합니다. PhotoPrism은 기존 파일 구조를 변경하지 않으므로 라이브러리 큐레이션에 강점이 있습니다. 휴대폰에 사진이 저장되는 가족 단위 사용자에게는 Immich가 더 나은 선택입니다. 디스크에 아카이브를 보관하는 사용자에게는 PhotoPrism이 더 적합합니다.
하드웨어 요구 사양: 더 많은 자원을 요구하는 Immich
문서화된 최소 RAM 요구 사양은 큰 차이가 있으며, 소규모 VPS 환경에서는 이것이 보통 결정적인 요인이 됩니다.
이 차트의 데이터
[
{
"label": "Immich",
"min_ram_gb": 6
},
{
"label": "PhotoPrism",
"min_ram_gb": 3
}
]Immich는 최소 6 GB의 RAM을 요구하며 8 GB를 권장합니다. 4 GB 장비에서는 머신러닝 기능을 끄고 실행해야 한다는 점을 명시하고 있습니다. PhotoPrism은 3 GB의 물리 메모리와 2개의 CPU 코어를 최소 사양으로 제시하며, 그 이상부터는 RAM 용량이 코어 수와 일치해야 한다고 설명합니다.
이 격차는 머신러닝 컨테이너에서 발생합니다. Immich는 별도의 immich-machine-learning 서비스에서 모델을 실행하며, CLIP(contrastive language image pretraining) 및 얼굴 인식 모델을 메모리에 로드합니다. 2 GB 장비에서는 커널이 해당 컨테이너를 강제 종료하며, Docker에서 메모리 부족(OOM) 시 발생하는 신호인 9번 신호에 의해 프로세스가 종료되었음을 나타내는 코드 137이 출력됩니다. PhotoPrism의 내장 모델은 ONNX 기반으로 실행되며, 문서에 따르면 모든 유형의 하드웨어에서 일반적으로 잘 작동합니다. 또한 메모리가 부족할 경우를 대비한 대체 기능도 갖추고 있습니다. 1 GB 이하의 장비에서는 RAW 변환과 얼굴 인식을 비활성화합니다. 하지만 이것이 안정성을 보장하는 것은 아닙니다. 3 GB 최소 사양 미만에서는 프로젝트 측에서 불안정성과 성능 문제를 경고하므로, 최소 사양은 반드시 지켜야 합니다.
PhotoPrism 문서는 서버에 최소 4 GB의 스왑(swap) 공간을 확보할 것을 명시합니다. Immich의 요구 사양 페이지에는 스왑에 대한 언급이 없지만, 소규모 장비에서는 스왑이 머신러닝 컨테이너에 여유 공간을 제공합니다. 두 서비스 중 무엇을 설치하든 미리 스왑을 설정하십시오.
sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
free -h이제 free -h를 실행하면 4.0Gi가 포함된 Swap: 라인이 출력되어야 합니다. 만약 0B이 출력된다면 swapon이 실패한 것입니다. 이는 보통 파일 시스템이 fallocate를 지원하지 않기 때문이며, sudo dd if=/dev/zero of=/swapfile bs=1M count=4096이 대체 수단으로 사용됩니다. 컨테이너 메모리 제한도 중요하며, Docker Compose에서 메모리 제한 설정하기를 통해 하나의 서비스가 과도한 자원을 사용하여 서버 전체를 다운시키는 것을 방지할 수 있습니다. 단, PhotoPrism은 예외입니다. 대용량 파일 인덱싱 시 일시적으로 추가 메모리가 필요할 수 있어 컨테이너에 엄격한 메모리 제한을 두지 말 것을 권장합니다. 제한을 설정하면 예기치 않은 재시작이 발생할 수 있습니다.
사용자들이 자주 놓치는 요구 사항이 하나 더 있습니다. Immich의 Postgres 데이터베이스는 로컬 저장소의 일반적인 Unix 파일 시스템 위에 있어야 하며, 네트워크 공유 드라이브를 사용해서는 안 됩니다. PhotoPrism 또한 데이터베이스 파일을 공유 네트워크 폴더에 저장하지 말라고 경고하며, 로컬 SSD 저장소를 가장 권장합니다. 두 앱 모두 마운트된 객체 스토리지(object store)에 데이터베이스를 두는 것은 안전하지 않습니다.
각각의 설치 방법
두 설치 모두 벤더가 제공하는 compose 파일과 하나의 명령어로 진행됩니다. VPS에서의 Docker Compose 가이드에서 다룬 대로 먼저 Docker Engine과 Compose 플러그인을 설치하십시오.
Immich는 모든 릴리스마다 compose 파일과 예제 환경 파일을 함께 제공합니다.
sudo mkdir -p /opt/immich && cd /opt/immich
wget -O docker-compose.yml https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml
wget -O .env https://github.com/immich-app/immich/releases/latest/download/example.env시작하기 전에 .env를 편집하십시오. UPLOAD_LOCATION는 원본 파일이 저장될 위치입니다. DB_PASSWORD에는 기본값이 설정되어 있으나, Immich는 필수는 아니더라도 무작위 비밀번호로 변경할 것을 권장합니다. Postgres는 외부로 노출되지 않으므로 이 비밀번호는 로컬 인증에만 사용되지만, 무작위 값을 사용하는 것이 좋습니다. Immich 문서에 따르면 다른 문자를 사용할 경우 Docker가 값을 파싱할 때 문제가 발생할 수 있으므로 A-Za-z0-9 문자만 사용하십시오. 그 후 서비스를 시작하십시오.
docker compose up -d
docker compose ps웹 인터페이스는 2283 포트에서 응답합니다. 해당 페이지를 통해 처음 등록된 계정이 관리자가 되므로, 인스턴스를 인터넷에 열어둔 채 방치하지 말고 즉시 접속하여 등록하십시오.
PhotoPrism은 MariaDB가 포함된 단일 compose 파일을 제공합니다.
sudo mkdir -p /opt/photoprism && cd /opt/photoprism
wget https://dl.photoprism.app/docker/compose.yamlcompose.yaml을 열고 첫 시작 전에 PHOTOPRISM_ADMIN_PASSWORD를 변경하십시오. 문서는 이 부분에 대해 명확히 경고합니다. 애플리케이션은 파일에 있는 초기 비밀번호로 시작하며, 최소 길이는 8자이고, 기본값을 공개 서버에서 절대 사용해서는 안 됩니다. 동시에 originals 볼륨을 사진이 저장된 폴더로 설정하십시오.
docker compose up -d
docker compose logs -f photoprismPhotoPrism은 2342 포트에서 admin 사용자로 응답합니다. 두 애플리케이션 모두 직접 노출해서는 안 됩니다. Docker, TLS, 백업을 사용하는 자가 호스팅 Nextcloud와 동일한 구성으로 TLS(전송 계층 보안)가 적용된 리버스 프록시를 앞에 두거나, 서버를 비공개로 유지하고 VPN을 통해 접속하십시오. 만약 VPS에서 사진 외의 다른 서비스도 운영한다면, 추가하는 모든 서비스에 동일한 제한을 적용하십시오. 예를 들어 자가 호스팅 RustDesk 릴레이는 필요한 두 개의 포트만 외부에서 접근 가능하면 충분합니다.
어떤 프로젝트의 모바일 앱이 더 우수한가
이 부분에서 두 프로젝트의 차이가 가장 극명하게 드러나며, 대부분의 사용자가 결국 Immich를 선택하는 이유이기도 합니다.
Immich는 Android와 iOS용 공식 앱을 제공합니다. 이 앱은 백그라운드에서 카메라 롤을 백업하므로, 사용자가 앱을 직접 열지 않아도 새로운 사진이 자동으로 서버로 전송됩니다. 집 밖에서 사용하기 위해 Immich는 세 가지 방법을 문서화하고 있습니다. WireGuard나 OpenVPN 같은 VPN 사용, Tailscale 사용, 또는 HTTPS를 제공하는 리버스 프록시 사용입니다. 리버스 프록시를 사용하면 각 휴대폰에 별도의 VPN 앱을 설치하지 않고도 모바일 앱을 연결할 수 있습니다. 단, Immich는 추가적인 보안 설정 없이 2283 포트를 인터넷에 직접 개방하는 행위를 절대 금지하고 있습니다.
PhotoPrism은 공식 네이티브 앱을 제공하지 않습니다. 대신 브라우저에서 홈 화면에 추가할 수 있는 프로그레시브 웹 앱(PWA)을 제공하며, 휴대폰과의 동기화 방법으로 WebDAV(Web Distributed Authoring and Versioning)를 문서화하고 있습니다. 이 프로젝트는 이를 위해 PhotoSync라는 서드파티 앱을 사용하여 /import/ 또는 /originals/ 디렉터리를 WebDAV로 연결하는 방식을 권장합니다. 이 방식은 정상적으로 작동하지만, Immich가 자체 클라이언트 내부에서 처리하는 기능을 유료 서드파티 앱을 통해 수행해야 한다는 번거로움이 있습니다.
여러 가족 구성원을 위한 자동 사진 백업이 필수 요구 사항이라면, 고민할 필요 없이 Immich를 선택하십시오.
머신러닝이 제공하는 실제 기능
Immich는 CLIP을 사용하여 라이브러리 전체를 의미론적으로 검색합니다. 따라서 "눈 속의 빨간 자전거"와 같이 별도의 태그를 달지 않은 사진도 검색할 수 있습니다. 또한 얼굴 인식, 클러스터링, 중복 사진 탐지 기능을 제공합니다. CPU를 사용하여 대규모 데이터를 인덱싱할 때는 백그라운드에서 몇 시간 동안 작업이 진행되는데, 이는 정상적인 현상이며 GPU(그래픽 처리 장치)가 필수는 아닙니다.
PhotoPrism은 내장된 ONNX 모델을 사용하여 이미지를 레이블별로 분류하고, 얼굴을 감지하여 인물별로 그룹화하며, 위치 메타데이터를 읽어 장소 지도를 생성합니다. 설정 폴더의 vision.yml 파일을 수정하면 레이블과 캡션 생성에 Ollama나 OpenAI를 연동할 수 있습니다. 사용자들이 이 기능을 위해 머무르는 핵심 기능은 지도입니다. 사진이 촬영된 장소를 기준으로 라이브러리를 인덱싱하는 방식은 20년 치 사진을 탐색하는 완전히 새로운 방법입니다. 이 개념은 다른 미디어 컬렉션에도 적용할 수 있으며, Jellyfin을 위한 Halcyon의 90년대 비디오 가게 프론트엔드는 영화 버전에 해당하며, 목록 대신 진열대를 통해 영화를 탐색합니다. 얼굴 인식 기능은 무료 커뮤니티 에디션에 포함되어 있습니다. 유료인 Essentials 및 Plus 멤버십은 더 풍부한 지도 레이어, 추가 사용자 역할, 사용자 관리 인터페이스 등을 제공하며, 2026년 10월 기준 연간 결제 방식으로 월 몇 유로 수준부터 시작합니다.
Immich는 유료 기능이 없으며, 앞으로도 없을 것이라고 프로젝트 측은 밝히고 있습니다. 2024년 7월 발표된 가격 정책에 따라 사용자 1인당 25달러, 서버 전체 기준 100달러의 선택적 평생 라이선스 키를 판매하지만, 이를 구매한다고 해서 추가 기능이 잠금 해제되는 것은 아니며 구매하지 않아도 모든 기능을 제한 없이 사용할 수 있습니다. PhotoPrism은 핵심 기능은 무료로 제공하되 선택적인 유료 부가 기능을 운영합니다.
백업은 데이터 보존 여부를 결정합니다
백업이 없는 사진 서버는 디스크 장애 한 번으로 가족의 모든 추억을 잃을 수 있습니다. 두 애플리케이션 모두 데이터베이스와 파일, 두 가지 백업이 필요합니다.
Immich의 경우, Postgres 컨테이너에서 데이터베이스를 덤프하고 업로드 경로를 복사하십시오.
docker exec -t immich_postgres pg_dump --clean --if-exists --dbname=immich --username=postgres | gzip > /backup/immich-db.sql.gz그런 다음 UPLOAD_LOCATION을 백업하십시오. 대체 불가능한 데이터가 포함된 폴더는 upload, library, profile입니다. thumbs 및 encoded-video 폴더는 수 시간의 CPU 자원을 소모하여 재생성할 수 있습니다. 데이터베이스 덤프만으로는 메타데이터만 포함되어 있으므로 아무것도 복구할 수 없습니다.
PhotoPrism의 경우, 인덱스 전용 명령어가 있습니다.
docker compose exec photoprism photoprism backup -i -f이 명령은 storage/backup/ 아래에 SQL 덤프를 생성합니다. 그 후 originals 폴더와 storage 폴더를 복사하십시오. PhotoPrism은 각 사진을 설명하는 사이드카 YAML 파일도 함께 기록하므로, 인덱스를 분실하더라도 파일만으로 복구할 수 있습니다. 이는 수십 년간 보관할 아카이브에 큰 장점입니다.
어떤 방식을 선택하든 암호화되고 중복 제거된 restic 백업을 원격 저장소로 전송하도록 일정을 설정한다. 라이브러리와 같은 디스크에 있는 백업은 백업이 아니다. 작업이 실패하면 알림을 보내도록 설정한다. 3월에 조용히 중단된 백업은 필요한 날이 되기 전까지 어젯밤에 정상 실행된 백업과 똑같아 보인다. self-hosted ntfy 서버를 사용하면 그 실패 알림을 같은 날 저녁에 휴대전화로 전송할 수 있다.
어떤 것을 실행해야 하는가
사진이 휴대폰에 있고, 여러 사람이 각자의 카메라 롤을 백업해야 하며, 서버에 6 GB 이상의 RAM을 할당할 수 있다면 Immich를 실행하십시오. 직접 호스팅할 수 있는 Google Photos와 가장 유사한 서비스이며, 모바일 사용 경험이 핵심입니다. Immich 단계별 설치 가이드에서 메모리 부족 문제와 업그레이드 시 주의사항을 상세히 다룹니다.
이미 디스크에 사진 아카이브가 있고, 지도와 메타데이터, 기존 폴더 구조를 유지하는 것이 중요하거나, VPS의 RAM이 4 GB뿐이라 스왑(swapping)이 발생하는 환경보다 안정적인 라이브러리 운영을 원한다면 PhotoPrism을 실행하십시오. 큐레이션 도구로서 더 뛰어나며 저사양 하드웨어에서도 부담이 적습니다.
두 서비스를 모두 운영하는 것도 합리적인 선택입니다. Immich는 일상적인 휴대폰 사진 수집을 담당하고, 1년에 한 번씩 보관할 사진을 정리하여 아카이브로 옮긴 뒤 PhotoPrism이 이를 인덱싱하게 할 수 있습니다. PhotoPrism은 폴더를 읽기만 하고 Immich는 자체 저장소를 관리하므로 두 서비스 간의 충돌은 발생하지 않습니다.
FAQ
PhotoPrism와 Immich가 동일한 사진 폴더를 공유할 수 있습니까?
양방향으로 안전하게 공유할 수 없습니다. PhotoPrism은 originals 폴더를 인덱싱하며, 읽기 전용 모드로 실행하지 않는 한 해당 폴더에 데이터를 기록하는 기능이 있습니다. 반면 Immich는 업로드 위치의 콘텐츠를 독점적으로 관리할 것으로 예상합니다. PhotoPrism이 Immich의 library 폴더를 읽기 전용으로 참조하여 탐색하게 할 수는 있지만, 두 애플리케이션이 동일한 파일을 관리하게 해서는 안 됩니다. Immich의 스토리지 템플릿이 인덱싱 중인 PhotoPrism의 자산을 이동하거나 이름을 변경할 수 있기 때문입니다.
Immich는 사진의 유일한 사본을 보관할 만큼 안정적입니까?
어떤 셀프 호스팅 애플리케이션도 데이터의 유일한 사본을 보관하는 용도로 사용해서는 안 됩니다. Immich는 현재 시맨틱 버전 관리(semantic versioning)를 따르며 주요 릴리스에서만 호환성이 깨지는 변경 사항이 발생한다고 명시합니다. 따라서 IMMICH_VERSION을 v3과 같은 메이저 버전 태그로 고정하고, 릴리스 노트를 읽은 뒤 docker compose pull && docker compose up -d를 사용하여 업그레이드하십시오. 동일한 마이너 버전 내에서도 다운그레이드는 지원되지 않으므로, 모든 업그레이드 전에 데이터베이스 덤프를 생성하십시오. 원본 파일을 서버 외부로 백업해 두면 위험을 최소화할 수 있습니다.
Immich 머신 러닝 컨테이너가 계속 재시작되는 이유는 무엇입니까?
대개 메모리 부족으로 인해 프로세스가 강제 종료되기 때문입니다. 중지된 컨테이너는 해당 플래그 없이는 보이지 않으므로 docker compose ps --all을 실행하여 머신 러닝 서비스가 코드 137로 종료되었는지 확인하십시오. 이 코드는 프로세스가 시그널 9로 종료되었음을 의미합니다. 커널의 OOM(Out of Memory) 킬러가 일반적인 원인이지만 유일한 원인은 아니므로 sudo dmesg | grep -i 'out of memory'을 통해 확인하십시오. 4 GB 메모리 환경이라면 스왑을 추가하거나 머신 러닝 기능을 완전히 비활성화하십시오. 컨테이너에 메모리 제한을 설정해도 성능이 저하되는 것이 아니라 제한 도달 시 강제 종료되지만, 서버의 다른 서비스가 자원 부족으로 멈추는 것을 방지할 수 있습니다. 머신 러닝을 비활성화하면 스마트 검색과 얼굴 인식 기능은 작동하지 않지만, Immich의 나머지 기능은 정상적으로 작동합니다.
PhotoPrism은 MariaDB가 필요합니까, 아니면 SQLite로 충분합니까?
SQLite도 개인용 라이브러리로는 충분히 사용할 수 있습니다. 하지만 SQLite 사용 시 PhotoPrism은 워커 수를 4개로 제한하며, 높은 동시성을 처리하기 위해 MariaDB로 전환할 것을 권장합니다. 프로젝트에서 제공하는 compose 파일에는 이미 MariaDB가 포함되어 있으므로, 권장되는 방식은 기본 설정 그대로 사용하는 것입니다.
라이브러리 크기 외에 어느 정도의 디스크 공간을 예산으로 잡아야 합니까?
두 애플리케이션 모두 원본 크기에 10에서 20퍼센트를 추가로 확보하십시오. 이 공간은 생성된 썸네일과 트랜스코딩된 비디오 미리보기를 위한 것입니다. 200 GB 규모의 컬렉션이라면 라이브러리 자체만으로 약 220에서 240 GB가 필요하며, 여기에 데이터베이스와 향후 증가분을 고려해야 합니다. 동일한 볼륨에 전체 로컬 백업 사본을 유지한다면, 다른 요소를 제외하고도 원본과 사본을 합쳐 최소 400 GB가 필요합니다. 따라서 약 450 GB를 예산으로 잡거나 백업 사본을 별도의 볼륨에 저장하십시오.