BookStack 백업을 가지고 복구해보자. 2탄 (실제상황) in Coolify
"Coolify 환경에서 BookStack 백업 파일을 사용해 데이터를 복구하는 실전 과정을 다룹니다. 실제 상황을 가정한 단계별 가이드를 통해 소중한 데이터를 안전하게 되살려보세요."
긴 시간 동안 고생 많으셨습니다! 드디어 DB, 파일, 권한, 그리고 이미지 주소까지 완벽하게 복구되었습니다.
이번 경험을 바탕으로, Coolify 환경에서 BookStack을 완벽하게 복구하는 최종 매뉴얼을 정리해 드립니다. 불필요한 시행착오는 모두 제거하고 성공했던 핵심 경로와 명령어만 담았습니다.
📘 Coolify BookStack 최종 복구 보고서
1. 사전 준비 (필수)
- 환경변수(ENV): Coolify 설정에서
APP_KEY가 백업 시점과 동일한지 반드시 확인하세요. (다르면 복호화 실패로 에러 발생) - 백업 파일: 서버의
/root/등 접근 가능한 경로에.sql파일과.tar.gz파일을 준비합니다.
2. 컨테이너 ID 확보
SSH에서 아래 명령어로 데이터베이스(DB)와 앱(App)의 컨테이너 ID를 확인합니다.
docker ps --format "table {{.ID}}\t{{.Names}}" | grep bookstack
docker ps --format "table {{.ID}}\t{{.Names}}" | grep mariadb
- APP ID:
bookstack이미지가 포함된 컨테이너 (예:ba3c...) - DB ID:
mariadb가 포함된 컨테이너 (예:7121...)
3. 데이터베이스(DB) 복원
글(Text)과 책 데이터를 먼저 복원합니다.
# <DB_ID>와 <SQL파일경로>를 실제 값으로 변경하세요.
cat /경로/bookstackapp_backup.sql | docker exec -i <DB_ID> mariadb -u root -p<비밀번호> bookstackapp
4. 이미지 및 첨부파일 복원
백업된 파일을 컨테이너 내부의 **올바른 경로(/app/www)**에 배치하고 권한을 수정합니다.
1. 파일을 컨테이너 임시 폴더로 복사
docker cp /경로/bookstack-data.tar.gz <APP_ID>:/tmp/
2. 컨테이너 내부 작업 (명령어 복사/붙여넣기)
# 앱 컨테이너 접속
docker exec -it <APP_ID> /bin/bash
# --- (이하 컨테이너 내부) ---
# 1. 압축 해제
cd /tmp
tar -xzf bookstack-data.tar.gz
# 2. 실제 운영 경로에 폴더 생성
mkdir -p /app/www/public/uploads
mkdir -p /app/www/storage/uploads
# 3. 파일 덮어쓰기 (백업 구조에 따라 유연하게 대응)
# (백업 내 'www/uploads' 폴더를 운영 경로로 복사)
cp -r www/uploads/* /app/www/public/uploads/
cp -r www/uploads/* /app/www/storage/uploads/
# (files 폴더가 따로 있다면 추가 복사)
if [ -d "www/files" ]; then cp -r www/files/* /app/www/storage/uploads/files/; fi
# 4. 권한 설정 (핵심: abc 유저)
chown -R abc:users /app/www/public/uploads
chown -R abc:users /app/www/storage/uploads
# 5. 임시 파일 삭제
rm -rf /tmp/www /tmp/bookstack-data.tar.gz
5. 시스템 동기화 및 권한 재생성 (가장 중요) 🔥
"책이 보이지 않는 문제"와 "DB 마이그레이션 오류"를 해결하는 단계입니다. 컨테이너 내부(/app/www)에서 진행합니다.
# 1. 마이그레이션 충돌 방지 (이미 존재하는 테이블 에러 회피)
# (새 창을 열어 DB 컨테이너에서 실행하거나, DB ID를 미리 알고 있어야 함)
# docker exec -it <DB_ID> mariadb -u root -p<비밀번호> bookstackapp -e "INSERT INTO migrations (migration, batch) VALUES ('2025_09_15_132850_create_entities_table', 1);"
# 2. DB 업데이트 강제 실행 (앱 컨테이너 내부 /app/www 에서)
php artisan migrate --force
# 3. 권한 장부(Permissions) 재생성 (책이 보이게 하는 명령어)
php artisan bookstack:regenerate-permissions
# 4. 검색 인덱스 재생성
php artisan bookstack:regenerate-search
6. 이미지 URL 주소 일괄 수정 🔗
이미지를 클릭했을 때 연결되는 주소가 예전 주소(HTTP 등)로 되어 있어 깨지는 현상을 수정합니다.
# 앱 컨테이너 내부 /app/www 에서 실행
# 사용법: php artisan bookstack:update-url <옛날_틀린주소> <현재_맞는주소>
# 예시 (https -> https 로 변경)
php artisan bookstack:update-url <옛날_틀린주소> <현재_맞는주소>
# 캐시 삭제 (필수)
php artisan cache:clear
php artisan view:clear
7. 최종 확인
- 웹사이트 접속: 브라우저에서
Ctrl+F5(강력 새로고침) - 데이터 확인: 책과 챕터가 정상적으로 보이는지 확인.
- 이미지 확인: 이미지가 깨지지 않고 잘 나오는지 확인.
모든 복구 과정이 완료되었습니다!