Ghost 블로그 업그레이드 완벽 가이드 - Docker 환경에서 안전하게 버전 올리기
Ghost 셀프호스팅 블로그를 Docker 환경에서 안전하게 업그레이드하는 방법을 단계별로 설명합니다.
1. 왜 업그레이드가 중요한가
Ghost는 활발하게 개발되는 오픈소스 프로젝트로, 정기적인 업데이트가 필요합니다.
1.1 업그레이드의 이점
업그레이드 이유:
├── 보안 패치 적용
├── 새로운 기능 사용 (ActivityPub, Analytics 등)
├── 버그 수정
├── 성능 개선
└── 장기 지원 (LTS) 보장
1.2 주요 버전 변경사항
| 버전 | 주요 변경사항 |
|---|---|
| Ghost 5.x | 기본 기능, 안정적 |
| Ghost 6.0 | ActivityPub, Tinybird Analytics 지원 |
| Ghost 6.x | 지속적인 개선 |
1.3 업그레이드 주기 권장
| 유형 | 주기 | 예시 |
|---|---|---|
| 패치 버전 | 즉시 | 6.10.0 → 6.10.1 |
| 마이너 버전 | 1-2주 내 | 6.10.x → 6.11.x |
| 메이저 버전 | 테스트 후 | 5.x → 6.x |
2. 업그레이드 전 체크리스트
2.1 필수 확인 사항
[ ] 현재 Ghost 버전 확인
[ ] 최신 버전 릴리즈 노트 확인
[ ] 데이터베이스 백업 완료
[ ] 콘텐츠(이미지, 테마) 백업 완료
[ ] 충분한 디스크 공간 확인
[ ] 롤백 계획 수립
2.2 현재 버전 확인
# Ghost 컨테이너에서 버전 확인
docker exec ghost ghost --version
# Ghost-CLI version: 1.26.1
# Ghost version: 6.13.2 (at /var/lib/ghost)
또는 Ghost Admin에서:
- Settings → 하단 About 섹션
2.3 릴리즈 노트 확인
새 버전의 변경사항을 반드시 확인하세요:
주의: 메이저 버전 업그레이드(5.x → 6.x)는 Breaking Changes가 있을 수 있습니다. 릴리즈 노트를 꼼꼼히 읽어보세요.
3. 백업 수행
업그레이드 전 백업은 필수입니다. 3편에서 설정한 백업 스크립트를 활용합니다.
3.1 수동 백업 실행
# 백업 스크립트 실행
~/scripts/backup.sh
3.2 백업 파일 확인
ls -la ~/backup/
# ghost-db-20260121_120000.sql
# ghost-content-20260121_120000.tar.gz
# docker-compose-20260121_120000.yml
3.3 백업 파일 별도 보관 (권장)
# 업그레이드용 백업을 별도 디렉토리에 복사
mkdir -p ~/backup/pre-upgrade
cp ~/backup/ghost-db-*.sql ~/backup/pre-upgrade/
cp ~/backup/ghost-content-*.tar.gz ~/backup/pre-upgrade/
4. Docker 이미지 업그레이드 방법
4.1 방법 1: latest 태그 사용 (자동 업그레이드)
docker-compose.yml에서 latest 태그를 사용하면 pull 시 최신 버전을 받습니다.
services:
ghost:
image: ghost:6-alpine # 6.x 최신 버전
# 또는
image: ghost:latest # 가장 최신 버전
업그레이드 명령:
cd ~/docker/ghost
# 최신 이미지 pull
docker compose pull
# 컨테이너 재생성
docker compose up -d
4.2 방법 2: 특정 버전 지정 (권장)
프로덕션 환경에서는 특정 버전을 명시하는 것이 안전합니다.
services:
ghost:
image: ghost:6.13.2-alpine # 특정 버전 지정
업그레이드 명령:
cd ~/docker/ghost
# docker-compose.yml에서 버전 수정
# ghost:6.10.0-alpine → ghost:6.13.2-alpine
# 이미지 pull 및 재생성
docker compose pull
docker compose up -d
4.3 업그레이드 후 확인
# 컨테이너 상태 확인
docker ps
# 버전 확인
docker exec ghost ghost --version
# 로그 확인 (에러 없는지)
docker logs ghost --tail 50
5. 메이저 버전 업그레이드 (5.x → 6.x)
메이저 버전 업그레이드는 더 신중하게 진행해야 합니다.
5.1 Ghost 6.0 주요 변경사항
| 기능 | 설명 |
|---|---|
| ActivityPub | Fediverse 연동 지원 |
| Tinybird Analytics | 새로운 Analytics 시스템 |
| UI 개선 | Admin 인터페이스 업데이트 |
| Node.js 요구사항 | Node.js 18+ 필요 |
5.2 업그레이드 절차
# 1. 백업 확인
ls -la ~/backup/pre-upgrade/
# 2. 컨테이너 중지
cd ~/docker/ghost
docker compose down
# 3. docker-compose.yml 수정
# image: ghost:5-alpine → ghost:6-alpine
# 4. 새 이미지 pull
docker compose pull
# 5. 컨테이너 시작
docker compose up -d
# 6. 마이그레이션 로그 확인
docker logs ghost -f
5.3 마이그레이션 확인
메이저 업그레이드 시 Ghost는 자동으로 데이터베이스 마이그레이션을 수행합니다.
# 로그에서 마이그레이션 완료 확인
docker logs ghost | grep -i migration
# [INFO] Migrations complete
5.4 기능 확인
업그레이드 후 새 기능 활성화:
- Ghost Admin → Settings → Growth → Network (ActivityPub)
- 대시보드에서 Analytics 확인
6. 롤백 방법
업그레이드 후 문제가 발생하면 롤백합니다.
6.1 컨테이너 롤백
cd ~/docker/ghost
# 1. 컨테이너 중지
docker compose down
# 2. docker-compose.yml에서 이전 버전으로 수정
# ghost:6.13.2-alpine → ghost:6.10.0-alpine
# 3. 이전 이미지로 시작
docker compose up -d
6.2 데이터베이스 롤백 (필요시)
데이터베이스 스키마가 변경된 경우 백업에서 복원해야 합니다.
# 1. 컨테이너 중지
docker compose down
# 2. 데이터베이스 볼륨 삭제
docker volume rm ghost_ghost-db-data
# 3. 새 볼륨 생성 및 DB 시작
docker volume create ghost_ghost-db-data
docker compose up -d ghost-db
sleep 15 # DB 초기화 대기
# 4. 백업에서 복원
docker exec -i ghost-db mysql -u ghost -p${GHOST_DB_PASSWORD} ghost < ~/backup/pre-upgrade/ghost-db-*.sql
# 5. 콘텐츠 복원
docker volume rm ghost_ghost-content
docker volume create ghost_ghost-content
docker run --rm \
-v ghost_ghost-content:/data \
-v ~/backup/pre-upgrade:/backup \
alpine tar xzf /backup/ghost-content-*.tar.gz -C /data
# 6. Ghost 시작 (이전 버전)
docker compose up -d
6.3 롤백 확인
# 버전 확인
docker exec ghost ghost --version
# 사이트 접속 테스트
curl -s https://blog.example.com | head -5
7. 자동 업그레이드 설정 (선택)
7.1 Watchtower 사용
Watchtower는 Docker 컨테이너를 자동으로 업데이트하는 도구입니다.
# docker-compose.yml에 추가
services:
watchtower:
image: containrrr/watchtower
container_name: watchtower
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
- WATCHTOWER_CLEANUP=true
- WATCHTOWER_SCHEDULE=0 0 4 * * * # 매일 새벽 4시
- WATCHTOWER_LABEL_ENABLE=true
command: --label-enable
ghost:
image: ghost:6-alpine
labels:
- "com.centurylinklabs.watchtower.enable=true"
# ... 기존 설정
주의: 프로덕션 환경에서 자동 업그레이드는 위험할 수 있습니다. 패치 버전만 자동 업그레이드하고, 마이너/메이저는 수동으로 진행하세요.
7.2 업그레이드 알림 설정
수동 업그레이드를 선호한다면, 새 버전 알림만 받을 수 있습니다:
# GitHub Watch → Releases only
# https://github.com/TryGhost/Ghost
8. 트러블슈팅
8.1 업그레이드 후 500 에러
원인: 데이터베이스 마이그레이션 실패
# 로그 확인
docker logs ghost | grep -i error
# 해결: 롤백 후 재시도
8.2 "Ghost was able to start, but errored during boot"
원인: 설정 파일 호환성 문제
# 환경변수 확인
docker exec ghost env | grep -i ghost
# 해결: 새 버전의 환경변수 요구사항 확인
8.3 테마 호환성 문제
원인: 테마가 새 버전과 호환되지 않음
# 기본 테마로 전환
# Ghost Admin → Settings → Design → Change theme → Casper
8.4 플러그인/통합 문제
원인: 서드파티 통합이 새 버전과 호환되지 않음
# Ghost Admin → Settings → Integrations
# 문제 있는 통합 비활성화 후 테스트
9. 핵심 개념 정리
| 개념 | 설명 |
|---|---|
| Semantic Versioning | MAJOR.MINOR.PATCH 버전 체계 |
| Breaking Changes | 기존 기능을 변경하는 업데이트 |
| 마이그레이션 | 데이터베이스 스키마 자동 업데이트 |
| 롤백 | 이전 버전으로 되돌리기 |
| Watchtower | Docker 컨테이너 자동 업데이트 도구 |
10. 베스트 프랙티스
체크리스트
- [ ] 업그레이드 전 반드시 백업
- [ ] 릴리즈 노트 확인
- [ ] 테스트 환경에서 먼저 테스트 (가능하다면)
- [ ] 트래픽이 적은 시간대에 진행
- [ ] 롤백 계획 수립
- [ ] 업그레이드 후 기능 테스트
권장 사항
| 상황 | 권장 |
|---|---|
| 보안 패치 | 즉시 적용 |
| 마이너 업데이트 | 1-2주 내 적용 |
| 메이저 업데이트 | 충분한 테스트 후 적용 |
| 자동 업데이트 | 패치만 또는 비권장 |
11. FAQ
Q: 업그레이드 중 데이터가 손실될 수 있나요?
A: Docker 볼륨을 사용하면 컨테이너 재생성 시에도 데이터가 유지됩니다. 하지만 백업은 필수입니다.
Q: 다운타임 없이 업그레이드할 수 있나요?
A: 단일 서버에서는 어렵습니다. 컨테이너 재시작 동안 수 초 ~ 수십 초의 다운타임이 발생합니다.
Q: 여러 버전을 건너뛰어 업그레이드해도 되나요?
A: 네, Ghost는 누적 마이그레이션을 지원합니다. 하지만 메이저 버전은 순차적으로 하는 것이 안전합니다 (5.x → 6.x).
Q: MySQL도 함께 업그레이드해야 하나요?
A: Ghost 버전에 따라 다릅니다. Ghost 6.x는 MySQL 8.0을 권장합니다. MySQL 업그레이드는 별도로 신중하게 진행하세요.
Q: 테마와 플러그인도 업데이트해야 하나요?
A: 테마는 Ghost 버전과 호환성을 확인하세요. 공식 테마(Casper)는 자동으로 호환됩니다.
12. 다음 단계
Ghost 업그레이드 방법을 익혔습니다! 다음 글에서는 ActivityPub으로 블로그를 Fediverse에 연결하는 방법을 다룹니다.
시리즈 목차:
- Oracle Cloud 무료 서버 세팅
- Ghost 블로그 Docker 설치
- Ghost 블로그 백업 자동화
- 검색엔진 등록 (Google/Naver)
- Ghost 6.0 업그레이드 ← 현재 글
- Ghost ActivityPub 설정 (Fediverse)
- Ghost Analytics 설정 (Tinybird)