# Wiki Server : Bookstack

# Bookstack 소개

개인 Wiki를 운영할 수 있는 오픈소스 프로그램 입니다.

제가 운영하는 "DH Cloud Wiki"가 이 Bookstack으로 운영 되고 있습니다.

[![bookstack.png](https://wiki.dhcloud.me/uploads/images/gallery/2023-07/scaled-1680-/IKlwjz1dXazWKisy-bookstack.png)](https://wiki.dhcloud.me/uploads/images/gallery/2023-07/IKlwjz1dXazWKisy-bookstack.png)

# 사전준비

Database 설치가 필요 합니다.

1\. Database는 MariaDB를 이용하며, Synology Package 센터에 있는 MariaDB 10을 예제로 설명 합니다.

 다른 DBMS가 이미 있다면 이 단계는 넘어가시면 됩니다.

2\. Synology Package 센터에서 MariaDB 10 앱을 설치 후 "TCP/IP 연결 활성화"를 체크하고, 포트는 3306으로 설정 합니다.

[ ![mariadb1.png](https://wiki.dhcloud.me/uploads/images/gallery/2023-06/scaled-1680-/mariadb1.png)](https://wiki.dhcloud.me/uploads/images/gallery/2023-06/mariadb1.png)

<span class="syno-fontsize-x-small">2. MariaDB에 Nextcloud Database 및 사용자 생성을 위해 Synology Package 센터에 있는 phpMyAdmin을 설치 합니다.</span>

<span class="syno-fontsize-x-small"> 1) "데이터베이스 &gt; 새로운"에서 "bookstack"로 신규 Database를 생성 합니다.</span>

<span class="syno-fontsize-x-small">[ ![mariadb2.png](https://wiki.dhcloud.me/uploads/images/gallery/2023-06/scaled-1680-/mariadb2.png)](https://wiki.dhcloud.me/uploads/images/gallery/2023-06/mariadb2.png)</span>

<span class="syno-fontsize-x-small"> 2) "bookstack" Database를 선택하고 우측 상단의 "권한"을 선택 합니다.</span>

<span class="syno-fontsize-x-small"> [![mariadb3.png](https://wiki.dhcloud.me/uploads/images/gallery/2023-06/scaled-1680-/mariadb3.png)](https://wiki.dhcloud.me/uploads/images/gallery/2023-06/mariadb3.png)</span>

 3) 아래 예제와 같이 사용자명에 "<span class="syno-fontsize-x-small">bookstack</span>"를 입력하고 암호와 재입력란에 사용하고자하는 암호를 입력 합니다.

 그런 후 전체적 권한에 "모두 체크"를 선택하여, 사용자가 <span class="syno-fontsize-x-small">Database의 모든 권한을 사용할 수 있게 설정 합니다.</span>

<span class="syno-fontsize-x-small">[![mariadb4.png](https://wiki.dhcloud.me/uploads/images/gallery/2023-06/scaled-1680-/mariadb4.png)](https://wiki.dhcloud.me/uploads/images/gallery/2023-06/mariadb4.png)</span>

# 설치

볼륨 Mapping을 위한 "/volume1/docker/bookstack/config" 디렉토리와 "/volume1/docker/bookstack/fonts" 생성 합니다.

```shell
mkdir /volume1/docker/bookstack/config

# weasyprint를 이용한 한글 PDF 출력 옵션을 사용할 경우 아래를 추가로 진행 합니다.
mkdir /volume1/docker/bookstack/fonts
```

 Docker 설치에 앞서 자신의 계정에 대한 "PUID"와 "PGID"를 확인 합니다.

```shell
id 계정명
```

여기서 uid값 (PUID)과 gid값 (PGID)를 기록해 둡니다. 제 경우 uid=1026, gid=100 입니다.

"docker-compose.yml" 파일을 아래와 같이 생성 합니다.

```yaml
version: "2"
services:
  bookstack:
    image: lscr.io/linuxserver/bookstack
    container_name: bookstack
    environment:
      - PUID=1026
      - PGID=100
      - APP_URL="도메인" # 예 : "http://...."와 같은 실제 사용하실 도메인을 넣어줍니다.
      - TZ="Asia/Seoul"
      - DB_HOST="DB_IP" # 예 : "192.168.1.200"
      - DB_PORT=DB_PORT # 예 : 3306
      - DB_USER="bookstack"
      - DB_PASS="DB비번"
      - DB_DATABASE="bookstack"
    volumes:
      - '/volume1/docker/bookstack/config:/config'
      # weasyprint를 이용한 한글 PDF 출력 옵션을 사용할 경우 아래를 추가로 진행 합니다. 
      - '/volume1/docker/bookstack/fonts:/usr/share/fonts'
    ports:
      - '6875:80' # APP_URL의 연결이 https일 경우 80을 443으로 수정해 주셔야 합니다.
    restart: unless-stopped
```

아래 명령으로 Docker를 실행 합니다.

```shell
docker-compose up -d
```

접속은 "IP:6875" 입니다. 초기 계정은 아래와 같으며, 최초 로그인 후 수정해 주시면 됩니다.

<p class="callout success">ID : admin@admin.com  
PW : password</p>

# 환경설정

# SMTP 설정

사용자 생성 및 이후 원활한 사용을 위해서는 반드시 smtp 설정이 필요 합니다.

설치된 Docker와 Mapping된 아래 파일을 열어 ".env" 파일 (config/www/.env)을 수정해 줍니다.

<p class="callout success">\# Mail system to use  
\# Can be 'smtp' or 'sendmail'  
MAIL\_DRIVER=smtp</p>

<p class="callout success">\# Mail sender details  
MAIL\_FROM\_NAME="**<span style="color: rgb(224, 62, 45);">메일발송자</span>**"  
MAIL\_FROM=**<span style="color: rgb(224, 62, 45);">이메일주소</span>**</p>

<p class="callout success">\# SMTP mail options  
\# These settings can be checked using the "Send a Test Email"  
\# feature found in the "Settings &gt; Maintenance" area of the system.  
MAIL\_HOST=**<span style="color: rgb(224, 62, 45);">smtp.naver.com</span>**  
MAIL\_PORT=**<span style="color: rgb(224, 62, 45);">465</span>**  
MAIL\_USERNAME=**<span style="color: rgb(224, 62, 45);">smtp계정아이디</span>**  
MAIL\_PASSWORD=**<span style="color: rgb(224, 62, 45);">smtp계정비번</span>**  
MAIL\_ENCRYPTION=**<span style="color: rgb(224, 62, 45);">tls</span>**</p>

위 예제는 네이버 smtp 이며 사용자 환경에 맞게 수정해 주시면 됩니다.

# 언어설정

기본언어를 한국어로 설정하는 방법입니다.

설치된 Docker와 Mapping된 아래 파일을 열어 ".env" 파일 (config/www/.env)을 추가해 줍니다.

<p class="callout success">\# Sets application language to Korean  
APP\_LANG=ko  
APP\_AUTO\_LANG\_PUBLIC=false</p>

# Redis 설정

먼저 Redis가 설치되어 있다고 가정합니다. ([Redis 설치](https://wiki.dhcloud.me/books/redis "Redis") 문서를 참고 하세요)

Redis의 Network와 bookstack의 네트워크를 같은 네트워크로 연결해 줍니다.

아래 예제는 "home\_network"라는 곳에 연결해 주었습니다.

\["home\_network" 생성\]

```shell
docker network create home_network
```

 \["home\_network"와 "bookstack" 네트워크 연결\]

```shell
docker network connect home_network bookstack
```

설치된 Docker와 Mapping된 아래 파일을 열어 ".env" 파일 (config/www/.env)을 추가해 줍니다.

<p class="callout success">\# Set both the cache and session to use Redis  
CACHE\_DRIVER=redis  
SESSION\_DRIVER=redis  
  
\# Example of using a single local Redis server  
REDIS\_SERVERS=<span style="color: rgb(224, 62, 45);">**Redis\_IP**</span>:6379:0  
</p>

<span style="color: rgb(224, 62, 45);">**Redis\_IP**</span>는 Portainer의 Network에서 확인 가능합니다. Redis가 사용 중인 IP 값 또는<span style="color: rgb(224, 62, 45);"> **IP가 변동될 시 "Host Name"**</span>을 넣어주시면 됩니다.

<p class="callout success">REDIS\_SERVERS=<span style="color: rgb(224, 62, 45);">**redis**</span>:6379:0</p>

[![redis_hostname.png](https://wiki.dhcloud.me/uploads/images/gallery/2023-07/scaled-1680-/MAaYdmrcm3rpB2z6-redis-hostname.png)](https://wiki.dhcloud.me/uploads/images/gallery/2023-07/MAaYdmrcm3rpB2z6-redis-hostname.png)

# 목록 형태

Grid 형식과 List 형식 두 가지중 아래와 같이 선택 가능합니다.

설치된 Docker와 Mapping된 아래 파일을 열어 ".env" 파일 (config/www/.env)을 추가해 줍니다.

**<span class="line"><span class="cl"><span class="nv">\[그리드 형식\]</span></span></span>**

<p class="callout success"><span class="line"><span class="cl"><span class="nv">APP\_VIEWS\_BOOKS</span><span class="o">=</span>grid </span></span></p>

**<span class="line"><span class="cl"><span class="nv">\[리스트 형식\]</span></span></span>**

<p class="callout success"><span class="line"><span class="cl"><span class="nv">APP\_VIEWS\_BOOKS</span><span class="o">=</span>list</span></span></p>

# PDF 변환 한글 지원

먼저 Bookstack "설정 &gt; 맞춤 &gt; 헤드 작성"에 아래 코드를 넣어 줍니다. (Google 한글 웹폰트를 사용하기 위함)

```html
<link href=" https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@100;300;400;500;700;900&display=swap " rel="stylesheet">
<style>
  body {
  text-rendering: geometricPrecision;
  }  
  body, button, input, select, label, textarea {
font-family: "Noto Sans KR";
  }
</style>
```

Portainer를 통해 Bookstack 콘솔로 진입하시던가 아니면 아래와 같이 ssh로 Bookstack 콘솔로 진입 합니다.

```shell
sudo docker exec -it bookstack bash
```

Font 디렉토리로 이동 합니다.

```shell
cd /usr/share/fonts
```

notosanskr 디렉토리를 생성하고 이동합니다.

```shell
mkdir notosanskr
cd notosanskr
```

Google "Noto Sans KR" 폰트를 다운받습니다.

```shell
curl -o Noto_Sans_KR.zip https://fonts.google.com/download?family=Noto%20Sans%20KR (동작 X)

wget https://gqm.trigem.com/Share/font/Noto_Sans_KR.zip
```

[![bookstack_font1.png](https://wiki.dhcloud.me/uploads/images/gallery/2023-07/scaled-1680-/Hm4lG5D6fskh4KOb-bookstack-font1.png)](https://wiki.dhcloud.me/uploads/images/gallery/2023-07/Hm4lG5D6fskh4KOb-bookstack-font1.png)

압축을 해제하기 위해 unzip을 설치해 줍니다.

```shell
apk add --no-cache unzip
```

[![bookstack_font2.png](https://wiki.dhcloud.me/uploads/images/gallery/2023-07/scaled-1680-/PbNyywoav6RE70cq-bookstack-font2.png)](https://wiki.dhcloud.me/uploads/images/gallery/2023-07/PbNyywoav6RE70cq-bookstack-font2.png)

압축을 해제하고 원본 zip파일을 삭제합니다.

```shell
unzip Noto_Sans_KR.zip -d /usr/share/fonts/notosanskr/
rm Noto_Sans_KR.zip
```

[![bookstack_font3.png](https://wiki.dhcloud.me/uploads/images/gallery/2023-07/scaled-1680-/pUrsxxIr6ZcBVfzr-bookstack-font3.png)](https://wiki.dhcloud.me/uploads/images/gallery/2023-07/pUrsxxIr6ZcBVfzr-bookstack-font3.png)

폰트를 설치 합니다.

```shell
fc-cache -fv
```

[![bookstack_font4.png](https://wiki.dhcloud.me/uploads/images/gallery/2023-07/scaled-1680-/eIjvFTwYI28KDfQv-bookstack-font4.png)](https://wiki.dhcloud.me/uploads/images/gallery/2023-07/eIjvFTwYI28KDfQv-bookstack-font4.png)

폰트 설치를 확인합니다.

```shell
fc-list | grep noto
```

[![bookstack_font5.png](https://wiki.dhcloud.me/uploads/images/gallery/2023-07/scaled-1680-/6V8ECtTHsAbkvkyt-bookstack-font5.png)](https://wiki.dhcloud.me/uploads/images/gallery/2023-07/6V8ECtTHsAbkvkyt-bookstack-font5.png)

"bookstack/config/www/" 밑에 있는 ".env" 파일을 열어 아래 내용을 추가해 줍니다.

<p class="callout success">EXPORT\_PDF\_COMMAND="weasyprint {input\_html\_path} {output\_pdf\_path}"</p>

"production.ERROR: PDF Export via command failed due to timeout at 15 second(s)"라는 오류가 발생시 아래 timeout 시간을 추가해 줍니다.

<p class="callout success">EXPORT\_PDF\_COMMAND\_TIMEOUT=120</p>

weasyprint 사용을 위해서는 weasyprint apk 설치가 필요 합니다.

기본적으로 docker 콘솔에 접속해 apk를 설치해 주면 되는데 docker image가 업데이트 될 경우 설치된 apk가 삭제 됩니다.

```shell
sudo docker exec -it bookstack bash
```

```shell
apk add --no-cache weasyprint
```

docker 컨테이너가 시작될 때 weasyprint apk 설치 유무를 확인 후 없을 시 자동으로 설치를 진행하는 절차를 성명 드립니다.

"/volume1/docker/bookstack/config/weasyprint\_apk.sh"에 아래 sh스크립트를 작성 합니다.

```bash
#!/bin/sh

# Check if weasyprint is installed
if ! apk info | grep -q weasyprint; then
    echo "WeasyPrint is not installed. Installing now..."
    # Install weasyprint without cache
    apk add --no-cache weasyprint
else
    echo "WeasyPrint is already installed."
fi

# Keep the container running
tail -f /dev/null
```

docker 콘솔에 접속하여 작성된 sh에 대한 권한을 부여해 줍니다.

```shell
sudo docker exec -it bookstack bash
```

```shell
chmod +x /config/weasyprint_apk.sh
```

docker 컨테이터의 cmd에 "/config/weasyprint.sh"를 입력해 주고, "Deploy the container"를 실행 합니다.

[![docker_cmd.jpg](https://wiki.dhcloud.me/uploads/images/gallery/2024-11/scaled-1680-/Dagfr8dUjXRArPc2-docker-cmd.jpg)](https://wiki.dhcloud.me/uploads/images/gallery/2024-11/Dagfr8dUjXRArPc2-docker-cmd.jpg)

\----------------------------------------------------------------------------------------------------

추가 문자 폰트 설치 (옵션)

\----------------------------------------------------------------------------------------------------

**1. 이모지 폰트 설치**

아래 github ([https://github.com/adobe-fonts/emojione-color](https://github.com/adobe-fonts/emojione-color))에서 폰트를 로컬에 다운로드 합니다.

<p class="callout success">[https://github.com/adobe-fonts/emojione-color/archive/refs/heads/master.zip](https://github.com/adobe-fonts/emojione-color/archive/refs/heads/master.zip)</p>

다운로드 받은 zip 파일을 bookstack의 "config" 디렉토리에 업로드 합니다.

[![bookstack_font6.png](https://wiki.dhcloud.me/uploads/images/gallery/2023-07/scaled-1680-/hOY0rBhqPtnb0Kcr-bookstack-font6.png)](https://wiki.dhcloud.me/uploads/images/gallery/2023-07/hOY0rBhqPtnb0Kcr-bookstack-font6.png)

Bookstack 콜솔로 진입합니다.

```shell
sudo docker exec -it bookstack bash
```

"config"로 이동 합니다.

```shell
cd /config/
```

업로드한 zip 파일을 폰트 디렉토리로 이동합니다.

```
mv emojione-color-master.zip /usr/share/fonts
```

폰트 디렉토리로 이동합니다.

```
cd /usr/share/fonts
```

압축을 해제 합니다.

```
unzip -d emojionecolor emojione-color-master.zip
```

[![bookstack_font7.png](https://wiki.dhcloud.me/uploads/images/gallery/2023-07/scaled-1680-/zkDdPLtdwozHiuDO-bookstack-font7.png)](https://wiki.dhcloud.me/uploads/images/gallery/2023-07/zkDdPLtdwozHiuDO-bookstack-font7.png)

폰트를 설치 합니다.

```shell
fc-cache -fv
```

[![bookstack_font8.png](https://wiki.dhcloud.me/uploads/images/gallery/2023-07/scaled-1680-/H5PtnJcukZihvB6r-bookstack-font8.png)](https://wiki.dhcloud.me/uploads/images/gallery/2023-07/H5PtnJcukZihvB6r-bookstack-font8.png)

설치를 확인 합니다.

```
fc-list | grep emojione
```

[![bookstack_font9.png](https://wiki.dhcloud.me/uploads/images/gallery/2023-07/scaled-1680-/AOc4eJotBkqyveCV-bookstack-font9.png)](https://wiki.dhcloud.me/uploads/images/gallery/2023-07/AOc4eJotBkqyveCV-bookstack-font9.png)

Bookstack 콜솔에 접속 중이라면 아래 명령어로 빠져나갑니다.

```shell
exit
```

**2. MS 폰트 설치**

Bookstack 콘솔로 진입합니다.

```shell
sudo docker exec -it bookstack bash
```

"config"로 이동 합니다.

```shell
cd /config/www
```

MS 폰트를 설치해 줍니다. (Option 사항 입니다.)

```shell
apk add --no-cache --virtual .build-deps msttcorefonts-installer 
update-ms-fonts  
fc-cache -f  
rm -rf /tmp/*  
apk del .build-deps
```

마지막으로 폰트 리스트를 업데이해 해줍니다.

```
fc-cache -fv
```

[![bookstack_font14.png](https://wiki.dhcloud.me/uploads/images/gallery/2023-07/scaled-1680-/7pTWPYXEOGT1qhX1-bookstack-font14.png)](https://wiki.dhcloud.me/uploads/images/gallery/2023-07/7pTWPYXEOGT1qhX1-bookstack-font14.png)

Bookstack 컨테이너를 재실행해 줍니다.

<p class="callout warning"><span style="color: rgb(224, 62, 45);">**\[주의\]**</span>   
1. 도커 이미지가 업데이트 되면 위 설정은 모두 <span style="color: rgb(224, 62, 45);">**초기화** </span>됩니다. **<span style="color: rgb(224, 62, 45);">Watchtower</span>**를 이용 중이라면 <span style="text-decoration: underline;">**<span style="color: rgb(224, 62, 45); text-decoration: underline;">예외 </span><span style="color: rgb(224, 62, 45); text-decoration: underline;">Lable 처리</span>**</span>를 하셔야 합니다.  
 ([https://wiki.dhcloud.me/books/docker-updater-watchtower/page/94f6d](https://wiki.dhcloud.me/books/docker-updater-watchtower/page/94f6d))  
2. Watchtower를 통한 자동 이미지 업데이트를 사용하신다면 위 본문에 설명명 **<span style="color: rgb(224, 62, 45);">"weasyprint\_apk.sh" CMD</span>**를 설정해 주시기 바랍니다.</p>

# SSL 인증서 오류 (기존 시놀로지 인증서 활용 방법)

SSL 관련 오류를 해결하기 위해서는 SSL 인증서를 설치해 주셔야 합니다.

본 해결 방법은 시놀로지를 사용할 경우 간단히 시놀로지의 인증서를 빼내서 Bookstack에 적용하는 방법입니다.

1\. "시놀로지 제어판 &gt; 보안 &gt; 인증서" 항목에서 기존 보유한 인증서를 선택 후 "인증서 내보내기"를 실행 합니다. (PC로 다운로드)

2\. 압축을 풀고 이 중에서 사용할 인증서는 "cert.pem"와 "privkey.pem" 입니다.

3\. Bookstack에 적용  
 1) "docker/bookstack/config/keys" 밑에 "cert.crt"와 "cert.key" 두개의 파일이 있습니다.  
 2) "cert.crt"을 열어 앞서 다운로드 받은 "cert.pem" 파일의 내용을 메모장을 열어 복사하고 붙여 줍니다.  
 3) "cert.key"을 열어 앞서 다운로드 받은 "privkey.pem" 파일의 내용을 메모장을 열어 복사하고 붙여 줍니다.

[![bookstack_ssl.png](https://wiki.dhcloud.me/uploads/images/gallery/2023-07/scaled-1680-/et5fskEvhMDhQ5iN-bookstack-ssl.png)](https://wiki.dhcloud.me/uploads/images/gallery/2023-07/et5fskEvhMDhQ5iN-bookstack-ssl.png)

<div class="pointer-container" id="bkmrk-%C2%A0" tabindex="-1"><div class="pointer flex-container-row items-center justify-space-between p-s anim is-page-editable"><div class="flex-container-row items-center gap-s"><div class="input-group"> </div></div></div></div>4\. Docker Container를 재시작 합니다.