BookStack na Ubuntu 26.04 Server Docker

BookStack je jednoduchá open-source platforma určená na tvorbu internej dokumentácie, manuálov, postupov a znalostnej databázy.

V tomto návode si ukážeme inštaláciu BookStack pomocou Docker Compose, databázy MariaDB a následné sprístupnenie cez internú doménu s HTTPS certifikátom vystaveným pomocou FreeIPA CA.

Čo budeme potrebovať?

Na inštaláciu budeme potrebovať:

  • Linux server s Dockerom a Docker Compose
  • približne 2 GB RAM
  • niekoľko GB voľného diskového priestoru
  • interný DNS záznam
  • MariaDB databázu
  • SSL certifikát
  • funkčný systémový čas / NTP

V tomto návode budeme používať:

bookstack.example.local

a ukážkovú IP adresu:

192.0.2.10

Tieto hodnoty nahraďte vlastnou internou doménou a IP adresou servera.

Vytvorenie pracovného adresára

mkdir -p ~/bookstack
cd ~/bookstack

Vytvorenie APP_KEY

BookStack vyžaduje aplikačný šifrovací kľúč.

Pri použití LinuxServer.io image ho môžeme vygenerovať:

docker run --rm \
  --entrypoint /bin/bash \
  lscr.io/linuxserver/bookstack:latest \
  appkey

Výstup bude vyzerať približne:

base64:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Tento kľúč si uložíme do súboru .env.

Vytvorenie databázových hesiel

Vygenerujeme náhodné heslá:

DBPASS="$(openssl rand -hex 32)"
ROOTPASS="$(openssl rand -hex 32)"

Vytvoríme:

nano .env

Obsah:

APP_KEY=base64:SEM_VLOZTE_VYGENEROVANY_APP_KEY
BOOKSTACK_DB_PASSWORD=SEM_VLOZTE_DB_HESLO
BOOKSTACK_DB_ROOT_PASSWORD=SEM_VLOZTE_ROOT_DB_HESLO

Po vytvorení súbor zabezpečíme:

chmod 600 .env

Ak používame Git:

echo '.env' >> .gitignore

Súbor .env obsahuje citlivé údaje a nemal by byť publikovaný ani uložený vo verejnom Git repozitári.

Docker Compose

Vytvoríme:

nano docker-compose.yml

a vložíme:

services:
  bookstack:
    image: lscr.io/linuxserver/bookstack:latest
    container_name: bookstack
    restart: unless-stopped

    ports:
      - "192.0.2.10:6875:80"

    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Europe/Bratislava

      - APP_URL=https://bookstack.example.local
      - APP_KEY=${APP_KEY}

      - DB_HOST=bookstack-db
      - DB_PORT=3306
      - DB_USERNAME=bookstack
      - DB_PASSWORD=${BOOKSTACK_DB_PASSWORD}
      - DB_DATABASE=bookstackapp

    depends_on:
      - bookstack-db

    volumes:
      - bookstack_config:/config


  bookstack-db:
    image: lscr.io/linuxserver/mariadb:latest
    container_name: bookstack-db
    restart: unless-stopped

    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Europe/Bratislava

      - MYSQL_ROOT_PASSWORD=${BOOKSTACK_DB_ROOT_PASSWORD}
      - MYSQL_DATABASE=bookstackapp
      - MYSQL_USER=bookstack
      - MYSQL_PASSWORD=${BOOKSTACK_DB_PASSWORD}

    volumes:
      - bookstack_db_config:/config


volumes:
  bookstack_config:
  bookstack_db_config:

Použitím Docker volumes zabezpečíme, že konfigurácia BookStacku a databáza zostanú zachované aj po vytvorení nového kontajnera.

Kontrola konfigurácie

sudo docker compose config >/dev/null && echo "COMPOSE OK"

Správny výsledok:

COMPOSE OK

Stiahnutie Docker images

sudo docker compose pull

Spustenie BookStack

sudo docker compose up -d

Stav kontajnerov:

sudo docker compose ps

Mali by sme vidieť:

bookstack       Up
bookstack-db    Up

Kontrola webovej aplikácie

BookStack môžeme pred konfiguráciou HTTPS otestovať:

curl -sS -o /dev/null -w 'HTTP %{http_code}\n' \
http://192.0.2.10:6875/

Funkčná aplikácia môže odpovedať napríklad:

HTTP 302

Ide o presmerovanie na webové rozhranie alebo prihlasovaciu stránku.

Interný DNS záznam

V internom DNS vytvoríme A záznam:

bookstack.example.local → 192.0.2.10

Ak používame FreeIPA DNS, záznam môžeme vytvoriť priamo v administrácii FreeIPA.

SSL certifikát z FreeIPA

Keďže používame internú .local doménu, verejný Let’s Encrypt certifikát nie je vhodný.

SSL certifikát preto vystavíme pomocou internej FreeIPA CA.

Certifikát by mal obsahovať:

CN  = bookstack.example.local
SAN = DNS:bookstack.example.local

Výsledkom budú napríklad súbory:

bookstack.example.local.key
bookstack.example.local.pem
ca.crt

Klientske zariadenia musia dôverovať FreeIPA CA, aby sa HTTPS stránka zobrazovala bez bezpečnostného upozornenia.

Reverse proxy

Pred BookStack môžeme umiestniť Nginx reverse proxy.

Príklad konfigurácie:

server {
    listen 80;
    server_name bookstack.example.local;

    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name bookstack.example.local;

    ssl_certificate /etc/nginx/ssl/bookstack.example.local.pem;
    ssl_certificate_key /etc/nginx/ssl/bookstack.example.local.key;

    location / {
        proxy_pass http://192.0.2.10:6875;

        proxy_http_version 1.1;

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
    }
}

Po zmene konfigurácie skontrolujeme syntax:

sudo nginx -t

A následne Nginx reštartujeme:

sudo systemctl restart nginx

Finálny prístup

Po dokončení konfigurácie bude BookStack dostupný na:

https://bookstack.example.local

Prvé prihlásenie je

Meno: admin@admin.com
Heslo: password

V docker-compose.yml musí byť zároveň nastavené:

APP_URL=https://bookstack.example.local

Ak túto hodnotu zmeníme až po prvom spustení, BookStack kontajner znova vytvoríme:

sudo docker compose up -d --force-recreate bookstack

Kontrola kontajnerov

sudo docker compose ps

Log aplikácie:

sudo docker logs --tail 100 bookstack

Pri úspešnom spustení môžeme vidieť napríklad:

INFO  Nothing to migrate.
[ls.io-init] done.

Zálohovanie

Pri zálohovaní BookStack je potrebné uchovávať minimálne:

BookStack /config
MariaDB /config
docker-compose.yml
.env

Súbor .env obsahuje APP_KEY a databázové heslá a musí byť uložený bezpečne.

APP_KEY je obzvlášť dôležitý. Pri obnove existujúcej BookStack inštalácie by mal byť použitý rovnaký APP_KEY ako v pôvodnej inštalácii.

naspäť