#!/bin/bash # Category : Knowledge Management # Description : Bookstack - Wiki/Knowledge Base (c/u/s/r/i): installBookstack() { local config_variables="$1" if [[ "$bookstack" == *[cCtTuUsSrRiI]* ]]; then dockerConfigSetupToContainer silent bookstack; local app_name=$CFG_BOOKSTACK_APP_NAME initializeAppVariables $app_name; fi if [[ "$bookstack" == *[cC]* ]]; then editAppConfig $app_name; fi if [[ "$bookstack" == *[uU]* ]]; then dockerUninstallApp $app_name; fi if [[ "$bookstack" == *[sS]* ]]; then dockerComposeDown $app_name; fi if [[ "$bookstack" == *[rR]* ]]; then dockerComposeRestart $app_name; fi if [[ "$bookstack" == *[iI]* ]]; then isHeader "Install $app_name" ((menu_number++)) echo "" echo "---- $menu_number. Setting up install folder and config file for $app_name." echo "" dockerConfigSetupToContainer "loud" "$app_name" "install" "$config_variables"; isSuccessful "Install folders and Config files have been setup for $app_name." ((menu_number++)) echo "" ((menu_number++)) echo "" echo "---- $menu_number. Setting up the $app_name docker-compose.yml file." echo "" dockerComposeSetupFile $app_name; ((menu_number++)) echo "" echo "---- $menu_number. Updating file permissions before starting." echo "" fixPermissionsBeforeStart $app_name; ((menu_number++)) echo "" echo "---- $menu_number. Running the docker-compose.yml to install and start $app_name" echo "" dockerComposeUpdateAndStartApp $app_name install; ((menu_number++)) echo "" echo "---- $menu_number. Running Application specific updates (if required)" echo "" appUpdateSpecifics $app_name; ((menu_number++)) echo "" echo "---- $menu_number. Running Headscale setup (if required)" echo "" setupHeadscale $app_name; ((menu_number++)) echo "" echo "---- $menu_number. Adding $app_name to the Apps Database table." echo "" databaseInstallApp $app_name; ((menu_number++)) echo "" echo "---- $menu_number. Updating WebUI config file." echo "" webuiContainerSetup $app_name install; ((menu_number++)) echo "" echo "---- $menu_number. You can find $app_name files at $containers_dir$app_name" echo "" echo " You can now navigate to your $app_name service using any of the options below : " echo "" menuShowFinalMessages $app_name; bookstack_target_email="${CFG_BOOKSTACK_ADMIN_EMAIL:-admin@admin.com}" bookstack_target_pass="${CFG_BOOKSTACK_ADMIN_PASSWORD:-password}" bookstack_compose_file="$containers_dir$app_name/docker-compose.yml" bookstack_port_pair=$(tagsManagerGetTagContent "$bookstack_compose_file" "PORTS_TAG_1") bookstack_host_port="${bookstack_port_pair%%:*}" bookstack_probe_url="http://127.0.0.1:${bookstack_host_port}/login" isNotice "Waiting for Bookstack to come online at ${bookstack_probe_url} ..." isNotice "This may take up to 20 seconds, please wait..." bookstack_attempts=0 bookstack_ready=0 while ((bookstack_attempts < 60)); do bookstack_http_code=$(curl -sS -o /dev/null --max-time 3 -w '%{http_code}' "$bookstack_probe_url" 2>/dev/null) if [[ "$bookstack_http_code" =~ ^(200|302)$ ]]; then bookstack_ready=1 break fi sleep 2 ((bookstack_attempts++)) done if ((bookstack_ready == 0)); then isNotice "Bookstack did not respond on ${bookstack_probe_url} within $((60 * 2))s — admin account left at upstream defaults." echo "" isNotice "Bookstack admin login (default):" echo "" echo " Email : admin@admin.com" echo " Password : password" echo "" else isSuccessful "Bookstack is online (HTTP ${bookstack_http_code})." bookstack_create_output=$(sudo docker exec \ -e EZ_BS_NEW_EMAIL="$bookstack_target_email" \ -e EZ_BS_NEW_PASS="$bookstack_target_pass" \ bookstack sh -c 'cd /app/www && s6-setuidgid abc php artisan bookstack:create-admin --no-ansi --email="$EZ_BS_NEW_EMAIL" --name=Admin --password="$EZ_BS_NEW_PASS" 2>&1') bookstack_create_rc=$? if [[ $bookstack_create_rc -eq 0 ]]; then isSuccessful "Bookstack admin account created (email: $bookstack_target_email)." if [[ "$bookstack_target_email" != "admin@admin.com" ]]; then sudo docker exec -i bookstack php /app/www/artisan tinker --no-ansi >/dev/null 2>&1 <<'PHP' $c = class_exists('\BookStack\Users\Models\User') ? '\BookStack\Users\Models\User' : '\BookStack\Auth\User'; optional($c::where('email', 'admin@admin.com')->first())->delete(); PHP isSuccessful "Removed seeded admin@admin.com account." fi echo "" isNotice "Bookstack admin login:" echo "" echo " Email : ${bookstack_target_email}" echo " Password : ${bookstack_target_pass}" echo "" else isNotice "Bookstack admin auto-create failed (exit $bookstack_create_rc). Output:" echo "$bookstack_create_output" | sed 's/^/ /' echo "" isNotice "Falling back to upstream defaults — update from inside Bookstack." echo "" isNotice "Bookstack admin login (default):" echo "" echo " Email : admin@admin.com" echo " Password : password" echo "" fi fi menu_number=0 #sleep 3s cd fi bookstack=n }