BookStack 개인 로컬 환경 한방 설치: Docker Compose로 손쉽게 시작하기

daev681·2025년 3월 27일

Bookstack Docker 설정, 백업 및 복원
1. Docker Compose 명령어

  • 컨테이너 시작 :
docker compose up
  • 컨테이너 중지 :
docker compose down

  1. 백업 스크립트 (backup.sh)
    이 스크립트는
    Bookstack** 데이터베이스와 관련 파일을 백업합니다.
  • crontab -e
    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 "백업 작업이 성공적으로 완료되었습니다."

  1. 복원 스크립트 (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

  1. docker-compose.yml
    다음은 BookStack과 MariaDB를 실행하기 위한
    Docker Compose** 설정 예시입니다.

PDF 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 를 실행하도록 구성되어 있으므로, 별도의 프록시 컨테이너는 필요하지 않습니다.

필요에 따라 환경변수나 볼륨, 네트워크 설정 등을 수정하여 사용하시기 바랍니다.

profile
개인 개발 공부

0개의 댓글