BookStack 백업을 가지고 복구해보자. 2탄 (실제상황) in Coolify

"Coolify 환경에서 BookStack 백업 파일을 사용해 데이터를 복구하는 실전 과정을 다룹니다. 실제 상황을 가정한 단계별 가이드를 통해 소중한 데이터를 안전하게 되살려보세요."

BookStack 백업을 가지고 복구해보자. 2탄 (실제상황) in Coolify

긴 시간 동안 고생 많으셨습니다! 드디어 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. 최종 확인

  1. 웹사이트 접속: 브라우저에서 Ctrl + F5 (강력 새로고침)
  2. 데이터 확인: 책과 챕터가 정상적으로 보이는지 확인.
  3. 이미지 확인: 이미지가 깨지지 않고 잘 나오는지 확인.

모든 복구 과정이 완료되었습니다!