구글 포토 대안 immich 서버 스크립트로 한번에 설치하기 + 외장hdd 마운트 + 백업 예약
[영상]
이 설치 스크립트를 만들면서 시행착오를 겪었던 부분이 있습니다. 처음에는 gpt로만 했는데, gpt가 최근 immich 버전의 설치법과 변수를 잘못 알고 있고 웹 검색을 해도 알지 못해서 직접 immich 공식 github에 가서 docker-compose.yml을 가져와야 했습니다. 밑에 제가 만든 스크립트를 보시면 그렇게 공식 도커 컴포즈를 가져오는 부분이 있습니다.
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
32
33
34
35
36
37
38
39
40
41
42
43
#!/bin/bash
set -e
echo "📦 Immich 공식 설치 시작"
# 경로 설정
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
UPLOAD_DIR="$SCRIPT_DIR/upload"
PGDATA_DIR="$SCRIPT_DIR/pgdata"
# Docker 설치
if ! command -v docker &> /dev/null; then
echo "🔧 Docker 설치 중..."
sudo apt update
sudo apt install -y ca-certificates curl gnupg lsb-release docker.io
sudo systemctl enable docker
sudo usermod -aG docker $USER
fi
# Docker Compose plugin 설치
if ! docker compose version &> /dev/null; then
echo "🔧 Docker Compose Plugin 설치 중..."
COMPOSE_DIR="/usr/libexec/docker/cli-plugins"
sudo mkdir -p "$COMPOSE_DIR"
curl -SL https://github.com/docker/compose/releases/download/v2.24.4/docker-compose-linux-x86_64 -o docker-compose
chmod +x docker-compose
sudo mv docker-compose "$COMPOSE_DIR/docker-compose"
fi
# 디렉토리 생성
mkdir -p "$UPLOAD_DIR" "$PGDATA_DIR"
# .env 파일 생성
cat > .env /dev/null; then
sudo apt install -y ufw
fi
sudo ufw allow 22/tcp comment 'SSH'
sudo ufw allow 2283/tcp comment 'Immich Web Port'
sudo ufw --force enable
sudo ufw status numbered
echo "✅ 설치 완료: http://:2283 접속"
저는 immich는 공유기에서 외부로 포트를 열지는 않고 내부망에서만 접속되도록 했습니다.
주의할 점은 위 스크립트에서 열어준 포트들은 서버컴에서 공유기에게 열어주는 포트입니다. 공유기에서 내부망 바깥으로 나가는 포트만 잘 닫아주면 문제가 없습니다.
외부망 포트 오픈 없이 외부에서도 사용할 수 있도록 저는 asus 공유기에서 제공하는 wireguard vpn을 사용했습니다.
vpn을 사용하면 직접 생성한 클라이언트키가 유출되지 않는다면 보안을 지킬 수 있고, 키가 있는 스마트폰을 잃어버리더라도 서버에서 그 키를 제거하면 접근을 막을 수 있어 보안이 확실합니다.
이제 백업용 외장하드를 마운트하고 백업 예약 스크립트를 만들겠습니다.
외장하드를 준비합니다. 우분투이므로 ext4로 포맷되어 있어야 합니다.
외장하드 연결 경로를 확인해줍니다.
1
2
lsblk -o NAME,SIZE,FSTYPE,MOUNTPOINT,LABEL
저는 sda3를 /mnt/immich-backups에 마운트해줄 겁니다. 그래서 다음 명령어로 폴더를 만들었습니다.
1
2
3
# 폴더 생성
sudo mkdir -p /mnt/immich-backups
그 다음엔 sda3를 /mnt/immich-backups에 마운트해줍니다
1
2
3
# 임시 마운트
sudo mount /dev/sda3 /mnt/immich-photos
짜잔! 물리적 하드디스크가 해당 경로로 마운트가 되었습니다.
그런데 이 마운트는 임시적 마운트입니다. 왜냐하면, sda3라는 경로는 나중에 바뀔 수 있기 때문입니다.
제 경우도 원래는 sda가 1개 있는데 이걸 3개로 쪼갠겁니다. 쪼갤 수 있다면 합칠 수 도 있고 순서를 바꿀 수도 있겠죠.
그래서 이런 변동값으로 마운트를 하게 되면 추후 연결이 잘못되어 데이터 손실 위험이 있을 수 있기 때문에 uuid로 제대로 마운트 해주어야 합니다. uuid로 마운트를 지정해주는 것은 표준입니다.
1
2
3
4
5
6
# 임시 마운트
sudo mount /dev/sda3 /mnt/immich-backups ← 수동, 불안정
# 자동/안정 마운트
UUID=abcd-1234-5678-... /mnt/immich-backups ext4 defaults 0 2 ← /etc/fstab에 등록
| 예시 상황 | 결과 |
|---|---|
| 오늘: /dev/sda3 = 백업 디스크 | 정상 마운트 |
| 내일: USB를 먼저 꽂았더니 /dev/sda3가 다른 디스크로 바뀜 | ❌ 잘못된 디스크에 마운트됨 → 데이터 손실 위험 |
| UUID까지 등록해야 하는 이유 | 설명 |
|---|---|
| 1. 디바이스 이름(sda3)은 고정이 아님 | 시스템이 부팅할 때마다 /dev/sda, /dev/sdb 순서가 바뀔 수 있음 |
| 2. 마운트 대상이 바뀌면 위험 | 예를 들어 sda3이 아니라 다른 디스크가 sda3으로 잡히면 잘못된 디스크를 마운트하게 됨 |
| 3. fstab에 등록하려면 UUID가 가장 안전 | 운영체제는 /etc/fstab을 보고 자동 마운트함. 여기엔 UUID로 지정하는 게 표준이자 안전함 |
| 4. UUID는 디스크 포맷 시 고유하게 생성됨 | 디스크 바뀌지 않는 한 변하지 않음. 정확하고 재부팅해도 안전하게 동작 |
UUID를 쓰는 이유는 “재부팅 후에도 정확히 같은 디스크를 자동으로 마운트하기 위해서”입니다. ** 그럼 이렇게 uuid 자동 마운트 세팅까지 하는 스크립트를 만들어봅시다.
setup_mount_immich.sh
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
32
33
34
35
36
37
38
39
40
41
#!/bin/bash
# setup_mount_immich.sh
# [1] 대상 장치와 마운트 경로
DEVICE="/dev/sda3"
MOUNT_POINT="/mnt/immich-backups"
# [2] UUID 확인
UUID=$(blkid -s UUID -o value "$DEVICE")
if [ -z "$UUID" ]; then
echo "❌ UUID를 찾을 수 없습니다. $DEVICE가 존재하는지 확인하세요."
exit 1
fi
# [3] 마운트 포인트 디렉토리 생성
if [ ! -d "$MOUNT_POINT" ]; then
sudo mkdir -p "$MOUNT_POINT"
echo "📁 마운트 디렉토리 생성: $MOUNT_POINT"
fi
# [4] fstab에 UUID 등록 (이미 등록되어 있지 않을 경우만)
if ! grep -q "$UUID" /etc/fstab; then
echo "UUID=$UUID $MOUNT_POINT ext4 defaults 0 2" | sudo tee -a /etc/fstab
echo "✅ fstab에 자동 마운트 항목 추가 완료"
else
echo "ℹ️ fstab에 이미 UUID 등록되어 있음"
fi
# [5] 마운트 적용
sudo mount -a && echo "✅ mount -a 완료. 자동 마운트 적용됨."
# [6] 권한 설정 (Immich 컨테이너가 root일 경우 생략 가능)
if [[ "$1" == "--set-owner" ]]; then
sudo chown -R 1000:1000 "$MOUNT_POINT"
echo "✅ 권한 설정 완료 (UID:GID = 1000:1000)"
else
echo "ℹ️ 권한 설정 생략됨 (컨테이너가 root 실행 중이면 생략해도 무방)"
fi
echo "🎉 자동 마운트 설정이 완료되었습니다."
sudo nano /etc/fstab 을 열어보시면 맨 마지막 줄에 uuid로 잘 마운트 되어 있는 것을 보실 겁니다.
이제 자동 백업 스크립트도 만들어봅니다.
Immich 백업 스크립트: backup_immich.sh
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
#!/bin/bash
# 운영 경로 (SSD)
UPLOAD_SRC="/home/devram/family_services/immich/upload"
PGDATA_SRC="/home/devram/family_services/immich/pgdata"
# 백업 경로 (HDD)
UPLOAD_BACKUP="/mnt/immich-backups/upload"
PGDATA_BACKUP="/mnt/immich-backups/pgdata"
echo "📦 Immich 백업 시작: $(date)"
# 디렉토리 생성 (처음 1회)
mkdir -p "$UPLOAD_BACKUP"
mkdir -p "$PGDATA_BACKUP"
# 사진 백업
rsync -a --delete "$UPLOAD_SRC/" "$UPLOAD_BACKUP/"
echo "✅ 사진(upload) 백업 완료"
# DB 데이터 백업
rsync -a --delete "$PGDATA_SRC/" "$PGDATA_BACKUP/"
echo "✅ DB(pgdata) 백업 완료"
echo "🎉 Immich 백업 완료: $(date)"
다음은 제 github 레포지토리입니다.
GitHub - southglory/ubuntu_immich_setup: One-click Immich photo backup and deployment on Ubuntu with auto-mount and backup automation. One-click Immich photo backup and deployment on Ubuntu with auto-mount and backup automation. - southglory/ubuntu_immich_setup One-click Immich photo backup and deployment on Ubuntu with auto-mount and backup automation. - southglory/ubuntu_immich_setup
더 세련된 방식으로 개선했습니다. 많 관 부~!ㅎㅎ



