Installation BookStack

Auf der Seite von BookStack findest du die Installationsanleitung, wie auch Shellskripte für die Betriebssysteme Ubuntu 16.04 bis 20.04. 

Das Skript wird von BookStack ausdrücklich für frisch aufgesetzte Betriebssysteme empfohlen, da es vorhandene Konfigurationen überschreiben kann

Skript-Download

# Download-Skript für Ubuntu 20.04
wget https://raw.githubusercontent.com/BookStackApp/devops/master/scripts/installation-ubuntu-20.04.sh

# Download-Skript für Ubuntu 18.04
wget https://raw.githubusercontent.com/BookStackApp/devops/master/scripts/installation-ubuntu-18.04.sh

# Download-Skript für Ubuntu 16.04
wget https://raw.githubusercontent.com/BookStackApp/devops/master/scripts/installation-ubuntu-16.04.sh

Installation MariaDB

In dem Skript von BookStack wird ein MySQL-Server installiert und auch gleich die Datenbank konfiguriert. Ich habe mich für den Standard (MariaDB) entschieden, den ich momentan auf all meinen Linuxservern installiere. 

# installiert die nötigen Pakete
apt-get install mariadb-client mariadb-server

# gleich im zweiten Schritt sichern wir die Installation ab
mysql_secure_installation
Beispiel:
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!


In order to log into MariaDB to secure it, we'll need the current
password for the root user.  If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.


Enter current password for root (enter for none): 
OK, successfully used password, moving on...


Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.


You already have a root password set, so you can safely answer 'n'.


Change the root password? [Y/n] y
New password:
Re-Enter new password:
Password updated successfully!
Reloading privilige tables..
 ... Success!


By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.


Remove anonymous users? [Y/n] y
 ... Success!


Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.


Disallow root login remotely? [Y/n] y
 ... Success!


By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.


Remove test database and access to it? [Y/n] y
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!


Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.


Reload privilege tables now? [Y/n] y
 ... Success!


Cleaning up...


All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.


Thanks for using MariaDB!

Aufsetzen der Datenbank 

mysql -u root -p

MariaDB [(none)]> CREATE DATABASE wiki_labrocks;
Query OK, 1 row affected (0.000 sec)

# Mein Passwort gegen ein sicheres Passwort tauschen
MariaDB [(none)]> CREATE USER 'wiki_labrocks'@'localhost' IDENTIFIED BY 'Mein_Passwort';
Query OK, 0 rows affected (0.000 sec)

MariaDB [(none)]> GRANT ALL ON wiki_labrocks.* TO 'wiki_labrocks'@'localhost';
Query OK, 0 rows affected (0.000 sec)

MariaDB [(none)]> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.000 sec)

MariaDB [(none)]> quit
Bye

Anpassungen an unsere Umgebung

Somit ist die Datenbank angelegt und das Skript kann nach ein paar Anpassungen gestartet werden. Als erstes sichern wir das Originalskript weg und  bearbeiten das Skript.

cp installation-ubuntu-20.04.sh installation-ubuntu-20.04.sh.alt

nano installation-ubuntu-20.04.sh
#!/bin/sh
# This script will install a new BookStack instance on a fresh Ubuntu 20.04 server.
# This script is experimental and does not ensure any security.

# Fetch domain to use from first provided parameter,
# Otherwise request the user to input their domain
DOMAIN=$1
if [ -z $1 ]
then
echo ""
printf "Enter the domain you want to host BookStack and press [ENTER]\nExamples: my-site.com or docs.my-site.com\n"
read DOMAIN
fi

# Get the current machine IP address
CURRENT_IP=$(ip addr | grep 'state UP' -A2 | tail -n1 | awk '{print $2}' | cut -f1  -d'/')

# Install core system packages
# Änderung Zeile 24 "mysql-server-8.0" entfernt
export DEBIAN_FRONTEND=noninteractive
add-apt-repository universe
apt update
apt install -y git unzip apache2 php7.4 curl php7.4-fpm php7.4-curl php7.4-mbstring php7.4-ldap \
php7.4-tidy php7.4-xml php7.4-zip php7.4-gd php7.4-mysql libapache2-mod-php7.4

# Set up database
# Änderung  Zeile 28 - 31. Die Datenbank haben wir schon händisch aufgesetzt
## DB_PASS="$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 13)"
## 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;"

# Download BookStack
cd /var/www/
git clone https://github.com/BookStackApp/BookStack.git --branch release --single-branch bookstack
BOOKSTACK_DIR="/var/www/bookstack"
cd $BOOKSTACK_DIR

# Install composer
EXPECTED_SIGNATURE=$(wget https://composer.github.io/installer.sig -O - -q)
curl -s https://getcomposer.org/installer > composer-setup.php
ACTUAL_SIGNATURE=$(php -r "echo hash_file('SHA384', 'composer-setup.php');")

if [ "$EXPECTED_SIGNATURE" = "$ACTUAL_SIGNATURE" ]
then
    php composer-setup.php --quiet
    RESULT=$?
    rm composer-setup.php
else
    >&2 echo 'ERROR: Invalid composer installer signature'
    rm composer-setup.php
    exit 1
fi

# Install BookStack composer dependencies
php composer.phar install --no-dev

# Copy and update BookStack environment variables
# Änderung Zeile 62 - 64 
cp .env.example .env
sed -i.bak "s@APP_URL=.*\$@APP_URL=http://$DOMAIN@" .env
sed -i.bak 's/DB_DATABASE=.*$/DB_DATABASE=wiki_labrocks/' .env
sed -i.bak 's/DB_USERNAME=.*$/DB_USERNAME=wiki_labrocks/' .env
sed -i.bak "s/DB_USERNAME=.*\$/DB_PASSWORD=Mein_Passwort" .env

# Generate the application key
php artisan key:generate --no-interaction --force
# Migrate the databases
php artisan migrate --no-interaction --force

# Set file and folder permissions
chown www-data:www-data -R bootstrap/cache public/uploads storage && chmod -R 755 bootstrap/cache public/uploads storage

# Set up apache
a2enmod rewrite
a2enmod php7.4

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

a2dissite 000-default.conf
a2ensite bookstack.conf

# Restart apache to load new config
systemctl restart apache2

echo ""
echo "Setup Finished, Your BookStack instance should now be installed."
echo "You can login with the email 'admin@admin.com' and password of 'password'"
echo "MySQL was installed without a root password, It is recommended that you set a root MySQL password."
echo ""
echo "You can access your BookStack instance at: http://$CURRENT_IP/ or http://$DOMAIN/"

Wir hätten hier auch gleich die Änderungen an den Pfaden vornehmen können. Für dieses Projekt habe ich es aber manuell nachkonfiguriert.

Installationsskript ausführen

# Skript ausführbar machen
chmod a+x installation-ubuntu-20.04.sh

# Ausführen des Skripts als Admin
sudo ./installation-ubuntu-20.04.sh

Nachdem das Skript gestartet wird, kommt noch die Nachfrage für welche Domain das System installiert wird. In diesem Fall tragen wir wiki.labrocks.de und bestätigen das mit "Enter"

Rechte im Installationspfad ändern

# Eigentümer das Verzeichnisses www auf www-data ändern
chown -R www-data:www-data /var/www

find /var/www/ -type d -exec chmod 755 {} \;
find /var/www/ -type f -exec chmod 644 {} \;

Composer updaten

Zum Schluss der Installation updaten wir noch Composer und sagen das keine Skripts ausgeführt werden dürfen

cd /var/www/bookstack
php composer.phar update --no-scripts

Ändern des Verzeichnisses und der .conf

#Ändern des Verzeichnissnamens
cd /var/www
mv bookstack wiki.labrocks.de

# Ändern des Confignamens der Domain
cd /etc/apache2/sites-available
mv bookstack.conf wiki.labrocks.de.conf

Nachdem wir die Pfade angepasst haben, müssen diese auch in die wiki.labrocks.de.conf eingetragen werden.

nano wiki.labrocks.de.conf

# Auszug aus der Konfigdatei
<VirtualHost *:80>
		ServerName wiki.labrocks.de
    
    	ServerAdmin webmaster@localhost
    	DocumentRoot /var/www/wiki.labrocks.de/public/
    
    <Directory /var/www/wiki.labrocks.de/public/>
    ...

Neue Konfiguration eintragen und Apache neustarten

a2dissite bookstack.conf
a2ensite wiki.labrocks.de.conf
systemctl reload apache2

Erste Anmeldung

Das CMS ist jetzt fertig installiert und du kommst mit einem Webbrowser und der URL auf die Startseite. Die Initialanmeldung ist:
E-Mail       admin@admin.com
Passwort   password