Bookstack Docker 설정, 백업 및 복원
1. Docker Compose 명령어
docker compose up
docker compose down
backup.sh)0 0 * * * /data/bookstack/backup.sh백업 항목 :
백업 디렉토리 : /data/bookstack/backup
백업 항목 :
데이터베이스 백업
파일 백업 (구성 파일, 업로드된 파일, 테마 포함)
스크립트 :
BACKUP_DIR="/data/bookstack/backup"
DATE=$(date +"%Y%m%d%H%M%S")
DB_NAME="bookstack"
DB_USER="bookstack"
DB_PASSWORD="bookstack"
DB_CONTAINER_NAME="bookstack_db"
APP_CONTAINER_NAME="bookstack_app"
CONFIG_DIR="/config/www" # bookstack_app의 실제 구성 파일 디렉토리 경로
UPLOADS_DIR="$CONFIG_DIR/uploads" # 업로드된 파일 경로
THEMES_DIR="$CONFIG_DIR/themes" # 테마 경로
# 데이터베이스 백업
echo "데이터베이스 백업 시작..."
docker exec $DB_CONTAINER_NAME /usr/bin/mysqldump -u$DB_USER -p$DB_PASSWORD $DB_NAME > $BACKUP_DIR/bookstack_backup_$DATE.sql
echo "데이터베이스 백업 완료."
# 파일 백업 (웹 애플리케이션 파일 및 업로드된 파일 백업)
echo "파일 백업 시작..."
docker cp $APP_CONTAINER_NAME:$CONFIG_DIR $BACKUP_DIR/bookstack_files_backup_$DATE # bookstack_app의 /config/www 디렉토리 전체 백업
#docker cp $APP_CONTAINER_NAME:$UPLOADS_DIR $BACKUP_DIR/uploads_backup_$DATE # 업로드된 파일만 백업
#docker cp $APP_CONTAINER_NAME:$THEMES_DIR $BACKUP_DIR/themes_backup_$DATE # 테마 파일 백업
echo "파일 백업 완료."
# 오래된 백업 파일 삭제 (예: 7일 이상된 파일 삭제)
echo "오래된 백업 파일 삭제 시작..."
find $BACKUP_DIR -type f -name "*.sql" -mtime +7 -exec rm {} \;
find $BACKUP_DIR -type f -name "*.tar.gz" -mtime +7 -exec rm {} \;
echo "오래된 백업 파일 삭제 완료."
# 완료 메시지
echo "백업 작업이 성공적으로 완료되었습니다."
restore.sh)**사용법:
./restore.sh <날짜 (예: 20250327)> <복원타입 (db, file, all)>
스크립트 :
BACKUP_DIR="/data/bookstack/backup"
DATE=$1 # 복원할 날짜 (예: 20250327)
TYPE=$2 # 복원할 타입 (예: db, file, all)
DB_NAME="bookstack"
DB_USER="bookstack"
DB_PASSWORD="bookstack"
DB_CONTAINER_NAME="bookstack_db"
APP_CONTAINER_NAME="bookstack_app"
CONFIG_DIR="/config/www" # bookstack_app의 실제 구성 파일 디렉토리 경로
# 날짜 인자가 제공되지 않으면 사용법을 출력하고 종료
if [ -z "$DATE" ] || [ -z "$TYPE" ]; then
echo "사용법: $0 <날짜 (예: 20250327)> <복원타입 (db, file, all)>"
exit 1
fi
# SQL 복원 (db만 또는 all에 포함)
if [[ "$TYPE" == "db" ]] || [[ "$TYPE" == "all" ]]; then
echo "$DATE 날짜의 데이터베이스 복원 시작..."
if [ -f "$BACKUP_DIR/bookstack_backup_$DATE.sql" ]; then
docker exec -i $DB_CONTAINER_NAME /usr/bin/mysql -u$DB_USER -p$DB_PASSWORD $DB_NAME < $BACKUP_DIR/bookstack_backup_$DATE.sql
echo "$DATE 날짜의 데이터베이스 복원 완료."
else
echo "$DATE 날짜의 데이터베이스 백업 파일이 존재하지 않습니다."
fi
fi
# 파일 복원 (file만 또는 all에 포함)
if [[ "$TYPE" == "file" ]] || [[ "$TYPE" == "all" ]]; then
echo "$DATE 날짜의 파일 복원 시작..."
BACKUP_DIR_TO_RESTORE="$BACKUP_DIR/bookstack_files_backup_$DATE"
if [ -d "$BACKUP_DIR_TO_RESTORE" ]; then
# 기존 파일 삭제 (framework 폴더 제외)
echo "/config/www 내부 파일 삭제 중 (framework 제외)..."
docker exec $APP_CONTAINER_NAME find $CONFIG_DIR -mindepth 1 -maxdepth 1 ! -name "framework" -exec rm -rf {} \;
# 백업된 파일을 복사하되, framework 폴더는 제외
rsync -av --exclude="framework" $BACKUP_DIR_TO_RESTORE/ ./temp_restore/
# 복사된 파일을 컨테이너 내부로 이동
docker cp ./temp_restore/. $APP_CONTAINER_NAME:$CONFIG_DIR/
# 임시 복사 폴더 정리
rm -rf ./temp_restore
# 컨테이너 내부에서 소유자와 권한 변경 (abc:abc)
docker exec $APP_CONTAINER_NAME chown -R abc:abc $CONFIG_DIR
docker exec $APP_CONTAINER_NAME chmod -R 755 $CONFIG_DIR
echo "$DATE 날짜의 파일 복원 완료."
else
echo "$DATE 날짜의 파일 백업이 존재하지 않습니다."
fi
fi
docker-compose.ymlPDF Export Command는 WeasyPrint를 동일 컨테이너 내에서 직접 호출하도록 설정되어 있습니다.
설정 파일 (docker-compose.yml)** :
version: '3.8'
services:
db:
image: mariadb:10.5
container_name: bookstack_db
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: bookstack
MYSQL_USER: bookstack
MYSQL_PASSWORD: bookstack
volumes:
- db_data:/var/lib/mysql
app:
image: ghcr.io/linuxserver/bookstack:latest
container_name: bookstack_app
restart: unless-stopped
depends_on:
- db
environment:
APP_URL: "http://IP:9999"
DB_HOST: bookstack_db
DB_DATABASE: bookstack
DB_USERNAME: bookstack
DB_PASSWORD: bookstack
APP_KEY: "base64: 발급 받아서 입력 "
FONTCONFIG_PATH: /etc/fonts
LD_LIBRARY_PATH: /usr/local/lib:/usr/lib:/lib
EXPORT_PDF_COMMAND: "weasyprint {input_html_path} {output_pdf_path}"
# EXPORT_PDF_COMMAND: 'EXPORT_HTML={input_html_path}; curl -F "html=@$EXPORT_HTML" http://caddy_proxy:3000 -o {output_pdf_path}'
ports:
- "9999:80"
volumes:
- bookstack_data:/config
entrypoint: >
sh -c
"apk add --no-cache libstdc++ libxrender libxext libx11 fontconfig ttf-dejavu ttf-droid font-noto-cjk weasyprint curl &&
fc-cache -fv &&
/init"
volumes:
db_data:
bookstack_data:
참고 :
base64: key 발급
docker run -it --rm --entrypoint /bin/bash lscr.io/linuxserver/bookstack:latest appkey
위 설정은 BookStack이 동일 컨테이너 내에서 WeasyPrint 를 실행하도록 구성되어 있으므로, 별도의 프록시 컨테이너는 필요하지 않습니다.
필요에 따라 환경변수나 볼륨, 네트워크 설정 등을 수정하여 사용하시기 바랍니다.