BookStack: мой опыт настройки и использования open-source базы знаний

от автора

Почему я выбрал именно BookStack

Мы в команде давно искали удобный инструмент для хранения технической документации и инструкций. Пробовали всё подряд — от Wiki.js до Confluence. Но то санкции, то интерфейс перегружен, то кастомизация страдает. В какой-то момент я наткнулся на BookStack — лёгкую, симпатичную open-source платформу на Laravel. Решил попробовать. В итоге — развернул, настроил, и теперь она у нас в проде.

Расскажу, как это было.

Установка BookStack на Ubuntu 24.04 (через официальный скрипт)

Самый простой и быстрый способ развернуть BookStack — воспользоваться официальным bash-скриптом, который автоматизирует установку всех зависимостей и конфигурацию. Я проверил это на чистой Ubuntu 24.04 — всё заработало без проблем.

1. Подготовка системы

Перед началом убедитесь, что у вас:

  • Ubuntu 24.04 (минимальная версия)

  • Права root или sudo

  • Интернет-доступ для скачивания скрипта

Обновим пакеты:

sudo apt update && sudo apt upgrade -y

Скрипт установки Ubuntu 24.04:

# Скачать скрипт wget https://codeberg.org/bookstack/devops/raw/branch/main/scripts/installation-ubuntu-24.04.sh  # Сделать его исполняемым chmod a+x installation-ubuntu-24.04.sh  # Запустить скрипт с правами администратора sudo ./installation-ubuntu-24.04.sh

Что делает скрипт:
Ссылка на скрипт

#!/bin/bash  echo "This script installs a new BookStack instance on a fresh Ubuntu 24.04 server." echo "This script does not ensure system security." echo ""  # Создание пути для файла лога для отладки LOGPATH=$(realpath "bookstack_install_$(date +%s).log")  # Получение текущего пользователя, запускающего скрипт SCRIPT_USER="${SUDO_USER:-$USER}"  # Получение IP-адреса текущей машины CURRENT_IP=$(ip addr | grep 'state UP' -A4 | grep 'inet ' | awk '{print $2}' | cut -f1  -d'/')  # Генерация пароля для базы данных DB_PASS="$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 13)"  # Каталог для установки BookStack BOOKSTACK_DIR="/var/www/bookstack"  # Получение домена из аргументов (запрашивается позже, если не указано) DOMAIN=$1  # Предотвращение интерактивных запросов в приложениях export DEBIAN_FRONTEND=noninteractive  # Вывод сообщения об ошибке в командную строку и завершение программы # Также записывает сообщение в файл лога function error_out() {   echo "ERROR: $1" | tee -a "$LOGPATH" 1>&2   exit 1 }  # Вывод информационного сообщения в командную строку и файл лога function info_msg() {   echo "$1" | tee -a "$LOGPATH" }  # Выполнение проверок перед установкой, чтобы избежать нарушения существующей настройки веб-сервера function run_pre_install_checks() {   # Проверка, запущен ли скрипт от имени root, и завершение, если нет   if [[ $EUID -gt 0 ]]   then     error_out "This script must be ran with root/sudo privileges"   fi    # Проверка, установлен ли Apache, и завершение, если он уже установлен   if [ -d "/etc/apache2/sites-enabled" ]   then     error_out "This script is intended for a fresh server install, existing apache config found, aborting install"   fi    # Проверка, установлена ли MySQL, и завершение, если данные MySQL уже существуют   if [ -d "/var/lib/mysql" ]   then     error_out "This script is intended for a fresh server install, existing MySQL data found, aborting install"   fi }  # Получение домена из первого переданного параметра или запрос ввода домена у пользователя function run_prompt_for_domain_if_required() {   if [ -z "$DOMAIN" ]   then     info_msg ""     info_msg "Enter the domain (or IP if not using a domain) you want to host BookStack on and press [ENTER]."     info_msg "Examples: my-site.com or docs.my-site.com or ${CURRENT_IP}"     read -r DOMAIN   fi    # Завершение с ошибкой, если домен не указан   if [ -z "$DOMAIN" ]   then     error_out "A domain must be provided to run this script"   fi }  # Установка основных системных пакетов function run_package_installs() {   apt update   apt install -y git unzip apache2 curl mysql-server-8.0 php8.3 \   php8.3-fpm php8.3-curl php8.3-mbstring php8.3-ldap php8.3-xml php8.3-zip php8.3-gd php8.3-mysql }  # Настройка базы данных function run_database_setup() {   # Убедиться, что служба базы данных запущена   systemctl start mysql-server.service   sleep 3    # Создание необходимой базы данных, пользователя и прав доступа   mysql -u root --execute="CREATE DATABASE bookstack;"   mysql -u root --execute="CREATE USER 'bookstack'@'localhost' IDENTIFIED WITH mysql_native_password BY '$DB_PASS';"   mysql -u root --execute="GRANT ALL ON bookstack.* TO 'bookstack'@'localhost';FLUSH PRIVILEGES;" }  # Загрузка BookStack function run_bookstack_download() {   cd /var/www || exit   git clone https://github.com/BookStackApp/BookStack.git --branch release --single-branch bookstack }  # Установка Composer function run_install_composer() {   EXPECTED_CHECKSUM="$(php -r 'copy("https://composer.github.io/installer.sig", "php://stdout");')"   php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"   ACTUAL_CHECKSUM="$(php -r "echo hash_file('sha384', 'composer-setup.php');")"    if [ "$EXPECTED_CHECKSUM" != "$ACTUAL_CHECKSUM" ]   then       >&2 echo 'ERROR: Invalid composer installer checksum'       rm composer-setup.php       exit 1   fi    php composer-setup.php --quiet   rm composer-setup.php    # Перемещение Composer в глобальную установку   mv composer.phar /usr/local/bin/composer }  # Установка зависимостей BookStack через Composer function run_install_bookstack_composer_deps() {   cd "$BOOKSTACK_DIR" || exit   export COMPOSER_ALLOW_SUPERUSER=1   php /usr/local/bin/composer install --no-dev --no-plugins }  # Копирование и обновление переменных окружения BookStack function run_update_bookstack_env() {   cd "$BOOKSTACK_DIR" || exit   cp .env.example .env   sed -i.bak "s@APP_URL=.*\$@APP_URL=http://$DOMAIN@" .env   sed -i.bak 's/DB_DATABASE=.*$/DB_DATABASE=bookstack/' .env   sed -i.bak 's/DB_USERNAME=.*$/DB_USERNAME=bookstack/' .env   sed -i.bak "s/DB_PASSWORD=.*\$/DB_PASSWORD=$DB_PASS/" .env   # Генерация ключа приложения   php artisan key:generate --no-interaction --force }  # Выполнение первоначальных миграций базы данных BookStack function run_bookstack_database_migrations() {   cd "$BOOKSTACK_DIR" || exit   php artisan migrate --no-interaction --force }  # Установка прав доступа к файлам и папкам # Устанавливает текущего пользователя как владельца и группу www-data как владельца группы, # затем предоставляет группе права на запись только для необходимых каталогов. # Скрывает файл `.env`, чтобы он не был виден другим пользователям в системе. function run_set_application_file_permissions() {   cd "$BOOKSTACK_DIR" || exit   chown -R "$SCRIPT_USER":www-data ./   chmod -R 755 ./   chmod -R 775 bootstrap/cache public/uploads storage   chmod 740 .env    # Указание git игнорировать изменения прав доступа   git config core.fileMode false }  # Настройка Apache с необходимыми модулями и конфигурацией function run_configure_apache() {   # Включение необходимых модулей и конфигурации Apache   a2enmod rewrite proxy_fcgi setenvif   a2enconf php8.3-fpm    # Настройка необходимой конфигурации Apache для BookStack   cat >/etc/apache2/sites-available/bookstack.conf <<EOL <VirtualHost *:80>   ServerName ${DOMAIN}    ServerAdmin webmaster@localhost   DocumentRoot /var/www/bookstack/public/    <Directory /var/www/bookstack/public/>       Options -Indexes +FollowSymLinks       AllowOverride None       Require all granted       <IfModule mod_rewrite.c>           <IfModule mod_negotiation.c>               Options -MultiViews -Indexes           </IfModule>            RewriteEngine On            # Handle Authorization Header           RewriteCond %{HTTP:Authorization} .           RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]            # Redirect Trailing Slashes If Not A Folder...           RewriteCond %{REQUEST_FILENAME} !-d           RewriteCond %{REQUEST_URI} (.+)/$           RewriteRule ^ %1 [L,R=301]            # Handle Front Controller...           RewriteCond %{REQUEST_FILENAME} !-d           RewriteCond %{REQUEST_FILENAME} !-f           RewriteRule ^ index.php [L]       </IfModule>   </Directory>    ErrorLog \${APACHE_LOG_DIR}/error.log   CustomLog \${APACHE_LOG_DIR}/access.log combined  </VirtualHost> EOL    # Отключение сайта Apache по умолчанию и включение BookStack   a2dissite 000-default.conf   a2ensite bookstack.conf    # Перезапуск Apache для загрузки новой конфигурации   systemctl restart apache2   # Убедиться, что служба php-fpm запущена   systemctl start php8.3-fpm.service }  info_msg "This script logs full output to $LOGPATH which may help upon issues." sleep 1  run_pre_install_checks run_prompt_for_domain_if_required info_msg "" info_msg "Installing using the domain or IP \"$DOMAIN\"" info_msg "" sleep 1  info_msg "[1/9] Installing required system packages... (This may take several minutes)" run_package_installs >> "$LOGPATH" 2>&1  info_msg "[2/9] Preparing MySQL database..." run_database_setup >> "$LOGPATH" 2>&1  info_msg "[3/9] Downloading BookStack to ${BOOKSTACK_DIR}..." run_bookstack_download >> "$LOGPATH" 2>&1  info_msg "[4/9] Installing Composer (PHP dependency manager)..." run_install_composer >> "$LOGPATH" 2>&1  info_msg "[5/9] Installing PHP dependencies using composer..." run_install_bookstack_composer_deps >> "$LOGPATH" 2>&1  info_msg "[6/9] Creating and populating BookStack .env file..." run_update_bookstack_env >> "$LOGPATH" 2>&1  info_msg "[7/9] Running initial BookStack database migrations..." run_bookstack_database_migrations >> "$LOGPATH" 2>&1  info_msg "[8/9] Setting BookStack file & folder permissions..." run_set_application_file_permissions >> "$LOGPATH" 2>&1  info_msg "[9/9] Configuring apache server..." run_configure_apache >> "$LOGPATH" 2>&1  info_msg "----------------------------------------------------------------" info_msg "Setup finished, your BookStack instance should now be installed!" info_msg "- Default login email: admin@admin.com" info_msg "- Default login password: password" info_msg "- Access URL: http://$CURRENT_IP/ or http://$DOMAIN/" info_msg "- BookStack install path: $BOOKSTACK_DIR" info_msg "- Install script log: $LOGPATH" info_msg "---------------------------------------------------------------"

Завершение установки

После установки BookStack будет доступен по IP-адресу сервера (или домену, если настроен). По умолчанию:

  • Логин: admin@admin.com

  • Пароль: password (его надо сменить сразу же!)

Если хотите поменять URL, заголовки, язык, загрузки и прочее — всё настраивается в .env файле по пути /var/www/bookstack/.env.

Пример:

APP_URL=http://10.50.10.188 APP_LANG=ru FILE_UPLOAD_SIZE_LIMIT=50

После изменений не забудьте:

php artisan config:clear php artisan cache:clear

Как устроена структура в BookStack и почему она удобная

Всё построено по принципу «как в реальных книгах». Есть Полки, Книги, Главы и Страницы. Мне это сразу зашло — легко объяснить коллегам, где что лежит.

У нас, например:

  • Полка DevOps

    • Книга CI/CD

      • Глава GitLab

        • Страница Автоматический деплой

Работает быстро, искать удобно, есть даже ссылки на конкретные абзацы.

Почему редакторы — это кайф

Два режима:

  • Для коллег, которые не любят разметку — WYSIWYG.

  • Для меня — Markdown. Поддержка подсветки кода, live preview, вставка сниппетов — очень удобно.

Безопасность, права доступа и интеграции

BookStack позволяет гибко управлять доступом. У нас, например, отдел продаж может читать, но не редактировать, а техотдел имеет полный доступ к своим разделам.

Аутентификацию подключили через GitHub — настроить легко, в официальной документации всё есть.

Что ещё круто

  • Есть REST API — можно автоматизировать создание страниц

  • Есть dark mode — коллеги кайфуют 🙂

  • Работает шустро даже на слабом VPS

Вывод

Если вы ищете простую, удобную и красивую базу знаний — попробуйте BookStack. Установка занимает 10 минут, а пользы — море. У нас это стал must-have инструмент в инфраструктуре.


ссылка на оригинал статьи https://habr.com/ru/articles/909222/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *