티스토리 뷰

Immich를 사용하고 있지 않다면 아래 링크를 먼저 참조
https://daten-kunst.tistory.com/m/5

Google Photo 대신 Immich를 써보자

Home Server를 위한 중요한 서비스 중 하나는 나와 가족을 위한 사진, 동영상 관리 서비스이다. 본인 Home Server에 적용한 사진, 동영상 관리 오픈소스 Immich에 대해서 알아보자Google Photo 단점용량 제한

daten-kunst.tistory.com

Google Photo에 과거 대부분의 데이터가 저장되어 있고 Immich에 옮겨서 계속 관리하고 싶을 때 유용한 방법이다.
보통 수 만장의 사진, 동영상을 보관하고 있기 때문에 한장 한장 업로드 하는 것은 거의 불가능하고 뭔가 프로그램으로 만들자니 방법이 막막하다. 이번에는 수 만장의 사진, 동영상을 빠르고 안전하게 Immich로 업로드 할 수 있는 방법을 소개 하고자 한다.

Google Photo Takeout

Google Photo에서는 Google Photo 내 저장된 모든 사진, 동영상, 앨범을 한꺼번에 내려받기 할 수 있는 기능을 제공하고 있다. Google Photo Takeout 이라는 기능인데, 신청 즉시 내려받기 할 수 있는 건 아니고 1 ~ 2일 후 내려받기가 가능하기 때문에 다소 불편하지만, 수 만장을 한꺼번에 받을 수 있어서 유용한 기능이다.

데이터 내보내기

Google Photo 에서 상단바를 통해 설정으로 이동하고 중간 쯤 데이터 내보내기에 있는 백업으로 이동한다.

Google Photo 상단바에서 톱니바퀴 버튼 클릭

Google 테이크아웃

이후 Google 테이크아웃 화면으로 이동하고 각 단계에서 아래와 같이 선택한다.

포함할 데이터: 구글 포토
파일 형식: ZIP 형식 ( 업로드 프로그램에서 zip 분석 기능 제공)

이렇게 신청하고 나면 1일 ~ 2일 정도 지나 내보내기 관리 관련 메일이 한통 도착한다.

파일 다운로드

1~2일 뒤에 Google 테이크아웃에서 "Google 데이터 다운로드 가능" 이라는 메일을 받게 된다.
메일을 열어서 내보내기 관리 다운로드를 진행하면 Takeout 파일들을 다운 받을 수 있다.

위와 같이 메일을 받게 된다.
본인의 경우 Google 내에서 10GB 정도 사용하고 있었지만, Takeout 한 실제 용량은 70GB가 훌쩍 넘었다.

 
그렇게 받은 데이터는 Home Server 옮겨 아래와 같이 ZIP 파일 형태로 저장되어 있는 것을 확인 할 수 있다. 여기서 받은 ZIP 파일을 풀진 않는다. 

/google-takeout# ls
 takeout-20250127T074446Z-003.zip

Takeout 한 파일을 Immich로 Upload (Immich-go)

Immich로 사진과 동영상을 분석해서 Upload 해 주는 오픈소스가 Immich-go 이다.
생각보다 간단하게 동작하고 사진과 동영상이 많음에도 매우 깔끔하게 Upload 되는 것을 확인 했기에 추천하는 방식이다.
https://github.com/simulot/immich-go

GitHub - simulot/immich-go: An alternative to the immich-CLI command that doesn't depend on nodejs installation. It tries its be

An alternative to the immich-CLI command that doesn't depend on nodejs installation. It tries its best for importing google photos takeout archives. - simulot/immich-go

github.com

 

Immich-go 설치

아래와 같이 wget으로 최근 release 된 Linux 관련 실행파일(바이너리)을 다운로드 받는다.

$ wget https://github.com/simulot/immich-go/releases/download/v0.23.0-RC9/immich-go_Linux_x86_64.tar.gz

--2025-01-30 23:14:47--  https://github.com/simulot/immich-go/releases/download/v0.23.0-RC9/immich-go_Linux_x86_64.tar.gz
github.com (github.com) 해석 중... 20.200.245.247
다음으로 연결 중: github.com (github.com)|20.200.245.247|:443... 연결했습니다.
HTTP 요청을 보냈습니다. 응답 기다리는 중... 302 Found
위치: https://objects.githubusercontent.com/github-production-release-asset-2e65be/669185591/54d1b9bb-c222-486e-bb91-e0c907e79875?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=releaseassetproduction%2F20250130%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250130T141447Z&X-Amz-Expires=300&X-Amz-Signature=78a6925d5100e058d4c6a5801e5cca2c7a0d199d0261538dd786bb5e42b9f02b&X-Amz-SignedHeaders=host&response-content-disposition=attachment%3B%20filename%3Dimmich-go_Linux_x86_64.tar.gz&response-content-type=application%2Foctet-stream [따라감]
--2025-01-30 23:14:47--  https://objects.githubusercontent.com/github-production-release-asset-2e65be/669185591/54d1b9bb-c222-486e-bb91-e0c907e79875?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=releaseassetproduction%2F20250130%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250130T141447Z&X-Amz-Expires=300&X-Amz-Signature=78a6925d5100e058d4c6a5801e5cca2c7a0d199d0261538dd786bb5e42b9f02b&X-Amz-SignedHeaders=host&response-content-disposition=attachment%3B%20filename%3Dimmich-go_Linux_x86_64.tar.gz&response-content-type=application%2Foctet-stream
objects.githubusercontent.com (objects.githubusercontent.com) 해석 중... 185.199.111.133, 185.199.110.133, 185.199.108.133, ...
다음으로 연결 중: objects.githubusercontent.com (objects.githubusercontent.com)|185.199.111.133|:443... 연결했습니다.
HTTP 요청을 보냈습니다. 응답 기다리는 중... 200 OK
길이: 4907301 (4.7M) [application/octet-stream]
저장 위치: ‘immich-go_Linux_x86_64.tar.gz’

immich-go_Linux_x86_64.tar.g 100%[==============================================>]   4.68M   806KB/s    / 6.1s

2025-01-30 23:15:00 (780 KB/s) - ‘immich-go_Linux_x86_64.tar.gz’ 저장함 [4907301/4907301]

 
받은 파일 압축 해제 한다.

root@joo-NUC:/mnt/nvmedata/google-takeout# tar -zxvf immich-go_Linux_x86_64.tar.gz
LICENSE
readme.md
immich-go

 

Immich-go 실행

아래의 파라메터를 참고하여 실행한다.
--server: immich 서버 IP
--api-key: immich 설정에서 발급받은 key
--dry-run: 해당 옵션을 넣으면 zip 파일을 풀어서 테스트만 할 뿐 직접 업로드 하지 않는다.
--skip-verify-ssl : https:// 를 사용하지 않는 경우 추가한다.
from-google-photos : google photo 이므로 추가한다.

./immich-go --server=http://localhost:2283 --api-key=WvoNkSt067VrEWwbWjuQGbFzdy1zvMIYMNz7RT75yTQ upload --dry-run --skip-verify-ssl from-google-photos ./takeout-\*.zip

 

. _ _  _ _ . _|_     _  _
|| | || | ||(_| | ─ (_|(_)
               v dev _)

┌────────────Input analysis────────────┐┌───────────────Uploading──────────────┐┌──────────────────────────────Server's jobs: active: 0, waiting: 0───────────────────────────────┐
│Images                         22150  ││Files uploaded                  9535  ││                                                                                                 │
│Videos                          1135  ││Errors during upload               0  ││                                                                                                 │
│Metadata files                 23051  ││Files not selected                 0  ││                                                                                                 │
│Discarded files                   25  ││Server's asset upgraded            0  ││                                                                                                 │
│Unsupported files                  4  ││Server has same quality            2  ││                                                                                                 │
│Duplicates in the input            0  ││Server has better quality          0  ││                                                                                                 │
│Files with a sidecar           23260  ││                                      ││                                                                                                 │
│Files without sidecar              0  ││                                      ││                                                                                                 │
└──────────────────────────────────────┘└──────────────────────────────────────┘└─────────────────────────────────────────────────────────────────────────────────────────────────┘
┌───────────────────────────────────────────────────────────────────────────────────────Log───────────────────────────────────────────────────────────────────────────────────────┐
│2025-02-01 00:22:00 INF uploaded file=takeout-20250127T074446Z-002:Takeout/Google 포토/Photos from 2018/IMG_0081.JPG                                                             │
│2025-02-01 00:22:00 INF Tagged file=takeout-20250127T074446Z-002:Takeout/Google 포토/Photos from 2018/IMG_0081.JPG tags=[takeout-20250127T074446Z]                               │
│2025-02-01 00:22:00 INF uploaded file=takeout-20250127T074446Z-002:Takeout/Google 포토/Photos from 2018/IMG_0082.JPG                                                             │
│2025-02-01 00:22:00 INF Tagged file=takeout-20250127T074446Z-002:Takeout/Google 포토/Photos from 2018/IMG_0082.JPG tags=[takeout-20250127T074446Z]                               │
│2025-02-01 00:22:00 INF uploaded file=takeout-20250127T074446Z-002:Takeout/Google 포토/Photos from 2018/IMG_0083.JPG                                                             │
│2025-02-01 00:22:00 INF Tagged file=takeout-20250127T074446Z-002:Takeout/Google 포토/Photos from 2018/IMG_0083.JPG tags=[takeout-20250127T074446Z]                               │
│2025-02-01 00:22:00 INF uploaded file=takeout-20250127T074446Z-002:Takeout/Google 포토/Photos from 2018/IMG_0084.JPG                                                             │
│2025-02-01 00:22:00 INF Tagged file=takeout-20250127T074446Z-002:Takeout/Google 포토/Photos from 2018/IMG_0084.JPG tags=[takeout-20250127T074446Z]                               │
│2025-02-01 00:22:00 INF uploaded file=takeout-20250127T074446Z-002:Takeout/Google 포토/Photos from 2018/IMG_0085.HEIC                                                            │
│2025-02-01 00:22:00 INF Tagged file=takeout-20250127T074446Z-002:Takeout/Google 포토/Photos from 2018/IMG_0085.HEIC tags=[takeout-20250127T074446Z]                              │
│2025-02-01 00:22:00 INF uploaded file=takeout-20250127T074446Z-002:Takeout/Google 포토/Photos from 2018/IMG_0086.HEIC                                                            │
│2025-02-01 00:22:00 INF Tagged file=takeout-20250127T074446Z-002:Takeout/Google 포토/Photos from 2018/IMG_0086.HEIC tags=[takeout-20250127T074446Z]                              │
│2025-02-01 00:22:00 INF uploaded file=takeout-20250127T074446Z-002:Takeout/Google 포토/Photos from 2018/IMG_0087.HEIC                                                            │
│2025-02-01 00:22:00 INF Tagged file=takeout-20250127T074446Z-002:Takeout/Google 포토/Photos from 2018/IMG_0087.HEIC tags=[takeout-20250127T074446Z]                              │
│2025-02-01 00:22:00 INF uploaded file=takeout-20250127T074446Z-002:Takeout/Google 포토/Photos from 2018/IMG_0088.HEIC                                                            │
│2025-02-01 00:22:00 INF Tagged file=takeout-20250127T074446Z-002:Takeout/Google 포토/Photos from 2018/IMG_0088.HEIC tags=[takeout-20250127T074446Z]                              │
│2025-02-01 00:22:00 INF uploaded file=takeout-20250127T074446Z-002:Takeout/Google 포토/Photos from 2018/IMG_0089.HEIC                                                            │
│2025-02-01 00:22:00 INF Tagged file=takeout-20250127T074446Z-002:Takeout/Google 포토/Photos from 2018/IMG_0089.HEIC tags=[takeout-20250127T074446Z]                              │
│2025-02-01 00:22:00 INF uploaded file=takeout-20250127T074446Z-002:Takeout/Google 포토/Photos from 2018/IMG_0090.HEIC

 
아래와 같이 --dry-run 으로 실행하는 경우 scan 만 하고 완료한다. 본인은 약 2만개의 파일이 저장되어 있었다.

$ ./immich-go --server=http://localhost:2283 --api-key=WvoNkSt067VrEWwbWjuQGbFzdy1zvMIYMNz7RT75yTQ upload --dry-run --skip-verify-ssl from-google-photos ./takeout-\*.zip

. _ _  _ _ . _|_     _  _
|| | || | ||(_| | ─ (_|(_)
               v dev _)

Log file: /root/.cache/immich-go/immich-go_2025-02-01_00-19-48.log

Input analysis:
---------------
scanned image file                      :   22150
scanned video file                      :    1135
scanned sidecar file                    :   23051
discarded file                          :      25
unsupported file                        :       4
file duplicated in the input            :      70
associated metadata file                :   23260
missing associated metadata file        :       0

Uploading:
----------
uploaded                                :   23184
upload error                            :       0
file not selected                       :       0
server's asset upgraded with the input  :       0
server has same asset                   :       6
server has a better asset               :       0

Check the log file: /root/.cache/immich-go/immich-go_2025-02-01_00-19-48.log

 
--dry-run을 빼고 본격적으로 Upload를 시작한다.

$ ./immich-go --server=http://localhost:2283 --api-key=WvoNkSt067VrEWwbWjuQGbFzdy1zvMIYMNz7RT75yTQ upload --skip-verify-ssl from-google-photos ./takeout-\*.zip

. _ _  _ _ . _|_     _  _
|| | || | ||(_| | ─ (_|(_)
               v dev _)

┌────────────Input analysis────────────┐┌───────────────Uploading──────────────┐┌─────────────────────────────Server's jobs: active: 15, waiting: 397─────────────────────────────┐
│Images                         22150  ││Files uploaded                   139  ││                                                     ██                                          │
│Videos                          1135  ││Errors during upload               0  ││                                             ██████████████     █ █                              │
│Metadata files                 23051  ││Files not selected                 0  ││                                       ████████████████████████████                              │
│Discarded files                   25  ││Server's asset upgraded            0  ││                                      █████████████████████████████                              │
│Unsupported files                  4  ││Server has same quality            0  ││                                     ██████████████████████████████                              │
│Duplicates in the input            0  ││Server has better quality          0  ││                                     ██████████████████████████████                              │
│Files with a sidecar           23260  ││                                      ││                                     ██████████████████████████████                              │
│Files without sidecar              0  ││                                      ││▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁███████████████████████████████                              │
└──────────────────────────────────────┘└──────────────────────────────────────┘└─────────────────────────────────────────────────────────────────────────────────────────────────┘
┌───────────────────────────────────────────────────────────────────────────────────────Log───────────────────────────────────────────────────────────────────────────────────────┐
│2025-02-01 00:24:00 INF Tagged file=takeout-20250127T074446Z-001:Takeout/Google 포토/Photos from 2011/P20111126_204300000_00000000-0000-0000-0000-000.JPG                        │
│tags=[takeout-20250127T074446Z]                                                                                                                                                  │
│2025-02-01 00:24:00 INF uploaded file=takeout-20250127T074446Z-001:Takeout/Google 포토/Photos from 2011/P20111127_165044000_00000000-0000-0000-0000-000.JPG                      │
│2025-02-01 00:24:00 INF Tagged file=takeout-20250127T074446Z-001:Takeout/Google 포토/Photos from 2011/P20111127_165044000_00000000-0000-0000-0000-000.JPG                        │
│tags=[takeout-20250127T074446Z]                                                                                                                                                  │
│2025-02-01 00:24:00 INF uploaded file=takeout-20250127T074446Z-001:Takeout/Google 포토/Photos from 2011/P20111231_183700000_00000000-0000-0000-0000-000.JPG                      │
│2025-02-01 00:24:00 INF Tagged file=takeout-20250127T074446Z-001:Takeout/Google 포토/Photos from 2011/P20111231_183700000_00000000-0000-0000-0000-000.JPG                        │
│tags=[takeout-20250127T074446Z]                                                                                                                                                  │
│2025-02-01 00:24:00 INF uploaded file=takeout-20250127T074446Z-001:Takeout/Google 포토/Photos from 2012/03103323918B53EE00C3990773490063D09_ahumcafe_PC.mp4                      │
│2025-02-01 00:24:00 INF Tagged file=takeout-20250127T074446Z-001:Takeout/Google 포토/Photos from 2012/03103323918B53EE00C3990773490063D09_ahumcafe_PC.mp4                        │
│tags=[takeout-20250127T074446Z]                                                                                                                                                  │
│2025-02-01 00:24:00 INF uploaded file=takeout-20250127T074446Z-001:Takeout/Google 포토/Photos from 2012/IMG_0005.JPG                                                             │
│2025-02-01 00:24:00 INF Tagged file=takeout-20250127T074446Z-001:Takeout/Google 포토/Photos from 2012/IMG_0005.JPG tags=[takeout-20250127T074446Z]                               │
│2025-02-01 00:24:00 INF uploaded file=takeout-20250127T074446Z-001:Takeout/Google 포토/Photos from 2012/IMG_0013.JPG                                                             │
│2025-02-01 00:24:00 INF Tagged file=takeout-20250127T074446Z-001:Takeout/Google 포토/Photos from 2012/IMG_0013.JPG tags=[takeout-20250127T074446Z]                               │
│2025-02-01 00:24:01 INF uploaded file=takeout-20250127T074446Z-001:Takeout/Google 포토/Photos from 2012/IMG_0014.JPG                                                             │
│2025-02-01 00:24:01 INF Tagged file=takeout-20250127T074446Z-001:Takeout/Google 포토/Photos from 2012/IMG_0014.JPG tags=[takeout-20250127T074446Z]                               │
│2025-02-01 00:24:01 INF uploaded file=takeout-20250127T074446Z-001:Takeout/Google 포토/Photos from 2012/IMG_0048.JPG                                                             │
│2025-02-01 00:24:01 INF Tagged file=takeout-20250127T074446Z-001:Takeout/Google 포토/Photos from 2012/IMG_0048.JPG tags=[takeout-20250127T074446Z]

 
완료되고 나면 아래와 같이 메세지가 출력된다.

. _ _  _ _ . _|_     _  _
|| | || | ||(_| | ─ (_|(_)
               v dev _)

┌────────────Input analysis────────────┐┌───────────────Uploading──────────────┐┌────────────────────────────Server's jobs: active: 11, waiting: 67137────────────────────────────┐
│Images                         22150  ││Files uploaded                 23173  ││                                              █          ██                   █                  │
│Videos                          1135  ││Errors during upload               0  ││                                            ██████       ██                  ██             ██   │
│Metadata files                 23051  ││Files not selected                 0  ││          █                              ███████████████████  ███    ███ ██████████ ██ ██████████│
│Discarded files                   25  ││Server's asset upgraded            0  ││█████████████████████████████████████████████████████████████████████████████████████████████████│
│Unsupported files                  4  ││Server has same quality           17  ││█████████████████████████████████████████████████████████████████████████████████████████████████│
│Duplicates in the input           70  ││Server has better quality          0  ││█████████████████████████████████████████████████████████████████████████████████████████████████│
│Files with a sidecar           23260  ││                                      ││█████████████████████████████████████████████████████████████████████████████████████████████████│
│Files without sidecar              0  ││                                      ││█████████████████████████████████████████████████████████████████████████████████████████████████│
└──────────────────────────────────────┘└──────────────────────────────────────┘└─────────────────────────────────────────────────────────────────────────────────────────────────┘
┌───────────────────────────────────────────────────────────────────────────────────────Log───────────────────────────────────────────────────────────────────────────────────────┐
│2025-02-01 00:54:38 WRN file duplicated in the input file=takeout-20250127T074446Z-001:Takeout/Google 포토/주건님, 주지영님/20140802_205806.jpg reason=local duplicate           │
│2025-02-01 00:54:38 WRN file duplicated in the i╔═══════════════════════════════Upload completed═══════════════════════════════╗사진/20200120_190031.jpg reason=local duplicate  │
│2025-02-01 00:54:38 WRN file duplicated in the i║                                                                              ║사진/IMG_1205.JPG reason=local duplicate         │
│2025-02-01 00:54:38 WRN file duplicated in the i║You can quit the program safely.                                              ║사진/20190518_234216.jpg reason=local duplicate  │
│2025-02-01 00:54:38 WRN file duplicated in the i║                                                                              ║사진/20240106_193145.jpg reason=local duplicate  │
│2025-02-01 00:54:38 WRN file duplicated in the i╚══════════════════════════════════════════════════════════════════════════════╝사진/IMG_3634.HEIC reason=local duplicate        │
│2025-02-01 00:54:38 WRN file duplicated in the input file=takeout-20250127T074446Z-002:Takeout/Google 포토/주건님의 기억에 남는 사진/IMG_1205-COLLAGE.jpg reason=local duplicate │
│2025-02-01 00:54:38 WRN file duplicated in the input file=takeout-20250127T074446Z-002:Takeout/Google 포토/주건님의 기억에 남는 사진/20180102_143039.jpg reason=local duplicate  │
│2025-02-01 00:54:38 WRN file duplicated in the input file=takeout-20250127T074446Z-002:Takeout/Google 포토/주건님의 기억에 남는 사진/20181121_135842.jpg reason=local duplicate  │
│2025-02-01 00:54:38 WRN file duplicated in the input file=takeout-20250127T074446Z-002:Takeout/Google 포토/주건님의 기억에 남는 사진/20190705_222108.jpg reason=local duplicate  │
│2025-02-01 00:54:38 WRN file duplicated in the input file=takeout-20250127T074446Z-002:Takeout/Google 포토/주건님의 기억에 남는 사진/20191116_145212.jpg reason=local duplicate  │
│2025-02-01 00:54:38 WRN file duplicated in the input file=takeout-20250127T074446Z-002:Takeout/Google 포토/주건님의 기억에 남는 사진/20220407_200856.jpg reason=local duplicate  │
│2025-02-01 00:54:38 WRN file duplicated in the input file=takeout-20250127T074446Z-002:Takeout/Google 포토/주건님의 기억에 남는 사진/20230929_123938.jpg reason=local duplicate  │
│2025-02-01 00:54:38 WRN file duplicated in the input file=takeout-20250127T074446Z-002:Takeout/Google 포토/주건님의 기억에 남는 사진/IMG_0328.JPG reason=local duplicate         │
│2025-02-01 00:54:38 WRN file duplicated in the input file=takeout-20250127T074446Z-002:Takeout/Google 포토/주건님의 기억에 남는 사진/IMG_9115.JPG reason=local duplicate         │
│2025-02-01 00:54:38 WRN file duplicated in the input file=takeout-20250127T074446Z-002:Takeout/Google 포토/주건님의 기억에 남는 사진/20170828_093503.jpg reason=local duplicate  │
│2025-02-01 00:54:38 WRN file duplicated in the input file=takeout-20250127T074446Z-002:Takeout/Google 포토/주건님의 기억에 남는 사진/IMG_7892.JPG reason=local duplicate         │
│2025-02-01 00:54:38 INF server has same asset file=takeout-20250127T074446Z-001:Takeout/Google 포토/주건/IMG_1098.JPG reason=the server has this file                            │
│2025-02-01 00:54:38 INF added to an album file=takeout-20250127T074446Z-001:Takeout/Google 포토/주건/IMG_1098.JPG Album=주건                                                     │
│2025-02-01 00:54:38 INF Tagged file=takeout-20250127T074446Z-001:Takeout/Google 포토/주건/IMG_1098.JPG tags=[takeout-20250127T074446Z]

 

immich-go 실행 결과

본인의 경우 2만개 파일을 업로드 하는데, 약 30분 정도 시간이 소요된 거 같다. 
참고로 Upload가 완료되고 나면 4 ~ 5시간 동안 Immich 썸네일을 만드는데, 그 동안에는 Immich 에서 올린 사진, 동영상 일부를 확인 할 수 없다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함