Addon: Bookstack Wiki, probleme OIDC

Hallo zusammen.

Ich hab mich an meinem ersten Addon Probiert :slight_smile:
Leider komme Ich bei den einstellungen für OIDC nicht so wirklich weiter, er bringt mir immer einen Timeout … und Ich komme einfach nicht dahinter wo mein fehler liegt.

Ich hoffe ihr könnt mir dabei weiterhelfen:

Hier ist meine Setup.sh, hier habe Ich zum Testen die Guppenübergabe in der .env auch mal deaktiviert … insgesamt vermute Ich, dass meine OIDC urls nicht pasen

#!/bin/bash
# This script gets these variables passed: $DOMAIN, $ADMIN_PASSWORD, $IP, $LDAP_DC
mkdir -p /root/bookstack
# Dont forget to escape " with a backslash:
cp docker-compose.yml /root/bookstack/docker-compose.yml
#set Volume data Path
if [ -d "/data" ]; then
    mkdir -p /data/docker/bookstack
    VDP="/data/docker/bookstack"
else
    # /data existiert nicht → Fallback
    VDP="/root/bookstack"
fi
#Generate AppKey
APP_KEY_B64=$(openssl rand -base64 32)
#Generate DB Password
DB_PW=$(libre-workspace-generate-secret)
#Generate MySQL Passwords
MYSQL_RP=$(libre-workspace-generate-secret)


if command -v timedatectl >/dev/null 2>&1; then
  TZ_HOST=$(timedatectl show -p Timezone --value)
else
  TZ_HOST=$(readlink /etc/localtime | sed 's|.*/zoneinfo/||')
fi

# Register bookstack with oidc provider
CLIENT_ID=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 8 | head -n 1)
CLIENT_SECRET=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1)
# Add the oidc client to the oidc provider
libre-workspace-add-oidc-client  "Bookstack" "$CLIENT_ID" "$CLIENT_SECRET" "https://wiki.$DOMAIN/accounts/oidc/callback/"


# Write .env File
echo "
#Bookstack environment
TZ=${TZ_HOST}
APP_URL=https://wiki.$DOMAIN
APP_KEY=base64:$APP_KEY_B64
DB_HOST=bookstack_db
DB_PORT=3306
DB_USERNAME=bookstack
DB_PASSWORD=$DB_PW
DB_DATABASE=bookstackapp
D_PATH=$VDP

#MYSQL environment
MYSQL_ROOT_PASSWORD=$MYSQL_RP
MYSQL_DATABASE=bookstackapp
MYSQL_USER=bookstack
MYSQL_PASSWORD=$DB_PW

#OIDC Settings
AUTH_METHOD=oidc
AUTH_AUTO_INITIATE=true
OIDC_NAME="OIDC"
OIDC_DISPLAY_NAME_CLAIMS=name
OIDC_CLIENT_ID=$CLIENT_ID
OIDC_CLIENT_SECRET=$CLIENT_SECRET
OIDC_ISSUER=https://portal.$DOMAIN/openid/
OIDC_END_SESSION_ENDPOINT=true
OIDC_ISSUER_DISCOVER=true
OIDC_USER_TO_GROUPS=true
OIDC_GROUPS_CLAIM=groups
OIDC_ADDITIONAL_SCOPES=groups
OIDC_REMOVE_FROM_GROUPS=true

" > /root/bookstack/.env




# Envsubst is used to replace variables in the docker-compose.yml file
#export DOMAIN=$DOMAIN
#export ADMIN_PASSWORD=$ADMIN_PASSWORD
#export IP=$IP
#export LDAP_DC=$LDAP_DC
#envsubst < docker-compose.yml > /root/bookstack/docker-compose.yml

docker compose -f /root/bookstack/docker-compose.yml up -d

echo "wiki.$DOMAIN {
    #tls internal
    reverse_proxy localhost:55100
}

" >> /etc/caddy/Caddyfile

# If domain is "int.de" uncomment the tls internal line for internal https
if [ "$DOMAIN" = "int.de" ]; then
    sed -i 's/#tls internal/tls internal/g' /etc/caddy/Caddyfile
fi

systemctl restart caddy

hier dann noch meine Compose:

services:
  bookstack:
    image: lscr.io/linuxserver/bookstack:latest
    container_name: bookstack
    environment:
      - TZ=${TZ}
      - APP_URL=${APP_URL}
      - APP_KEY=${APP_KEY}
      - DB_HOST=${DB_HOST}
      - DB_PORT=${DB_PORT}
      - DB_USERNAME=${DB_USERNAME}
      - DB_PASSWORD=${DB_PASSWORD}
      - DB_DATABASE=${DB_DATABASE}
    volumes:
      - ${D_PATH}/config:/config
    env_file:
      - .env
    ports:
      - "55100:80"
    restart: unless-stopped
    depends_on:
      - bookstack_db

  bookstack_db:
    image: lscr.io/linuxserver/mariadb
    container_name: bookstack_db
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
      TZ: ${TZ}
    volumes:
      - ${D_PATH}/database:/var/lib/mysql
      - ${D_PATH}/database/config:/config
    env_file:
      - .env
    restart: unless-stopped

Der Container fährt soweit korrekt hoch, alle Eintragungen und Volumes werden sauber erstellt

Danke für eure Hilfe

Sieht auf den ersten Blick gut aus :slight_smile:

Wo genau geschieht denn der Timeout? Hier hilft auch der Browser mit F12 und dann die Netzwerkanalyse.

Wenn er timouted, weil er aufs Portal zugreifen möchte,

Kann es sinnvoll sein, in der docker-compose bei dem bookstack service den extra host fürs Portal hinzuzufügen.

    extra_hosts:
      - "portal.int.de:IP_ADRESSE"

Hier siehst Du ein Beispiel:
https://codeberg.org/Libre_Workspace/libre-workspace/src/branch/main/src/usr/lib/libre-workspace/modules/desktop/docker-compose.yml

1 Like

Mir wirft es folgenden Fehler:

OIDC Discovery Error: HTTP request failed during discovery with error: cURL error 28: Resolving timed out after 5001 milliseconds (see libcurl - Error Codes) for https://portal.int.domain/openid/.well-known/openid-configuration

Der server läuft öffentlich, der extra_host würde die anfrage nach intern verbiegen oder verstehe ich die funktion falsch?

Wollte die Zip eben hochladen, bin aber noch zu jungfräulich im Forum.

kann ich diese anders bereit stellen?

Wenn ich den extra_host eintrage komme ich so wie es aussieht weiter:
Fehler jetzt:

OIDC Discovery Error: Unexpected issuer value found on discovery response

Wenn Ich das richtig verstehe, stimmt jetzt der issuer nicht mehr überein?!
Weil ich auf IP umleite?

PS.: was Ich noch vergessen hatte zu erwähnen:
Die DNS Auflösung im Container habe Ich auch geprüft, die kommt korrekt an, allerdings dauert sie gefühlt relativ lange bis er aufgelöst hat.

Ich glaube Ich habe den Fehler gefunden, verstehe ihn aber nicht!
Curl befehl :

curl -o /dev/null -s -w 'Establish Connection: %{time_connect}s\nTTFB: %{time_starttransfer}s\nTotal: %{time_total}s\n'  https://portal.int.domain/openid/.well-known/openid-configuration

ergebnis vom host:
Establish Connection: 0.000342s
TTFB: 0.007373s
Total: 0.007437s

Gleicher befehl aus dem container:
Establish Connection: 9.504945s
TTFB: 9.519421s
Total: 9.519509s

Wie im vorigen Post vermutet, braucht er viel zu lange um die verbindung zu etablieren

Ich glaube der extra hosts Eintrag in der docker-compose löst genau Dein Problem.
Das Routing innerhalb Docker ist manchmal etwas verwirrend.
So biegen wir das auf jeden Fall gerade und er braucht gar kein DNS Aufruf.

Der Rest ist dann OIDC Magic, muss man sich genauer ansehen.
Evtl. hilft da die KI Deines Vertrauens weiter und/oder die Anleitung von Bookstack für OIDC für bspw. Keycloak oder Authentik, daran können wir uns immer gut orientieren.

1 Like

Tadaaa

Danke dir Jean

der extra host hat es gebracht, allerdings hatte Ich noch 3 Fehler drin, weshalb er mir dann auch den Issuer Fehler gebracht hab.

beim Issuer hatte Ich noch einen “/” am ende
bei der callback URL war noch ein accounts zu viel und der abschließende “/” war eben auch wieder zu viel!

Ich würde das Addon am Montag nochmal Umschreiben und dann gerne zur Verfügung stellen.
Kann Ich das wem schicken zur Kontrolle und freigabe?

Ich hab das Komplette Plugin so geschriebn, dass es auf jeder LWS laufen sollte … denke Ich mal

Die Einzige Stelle, bei der Ich komplett von deinen Anleitungen abweiche sind die Volumes.
Ich gehe davon aus, wenn jemand eine /data eingerichtet hat, dann wirll er dort auch die “größeren” Datenmengen ablegen. Deshalb würde Ich die Volumes generel auf /data legen (in meinem Aufbau) wenn es denn vorhanden ist.

Container wie Immich oder Paperless können doch auch mal recht fgroß werden.

Danke für die Hilfe udn ein schönes WE

2 Likes

Freut mich!
Ein separates if else für /data kriegen wir hin.
Wie bspw. beim PaperlessNGX Plugin meine ich.

Schicke mir das gerne, dann schaue ich nochmal drüber und mache ein Repository auf Codeberg auf: Libre_Workspace - Codeberg.org

Mega, ich bin sehr gespannt auf das Addon :slight_smile:

Achso, und auf lokalen Libre Workspaces verhält sich das OIDC immer nochmal anders, also da am besten auch mal kurz durchtesten :slight_smile:

bookstack.zip (259,3 KB)

Hier mal meine bisher erstellt Zip

Könnte das mal noch jemand in einer Lokalen Installation testen?
Wenn es dort auch läuft … würde mich freuen :slight_smile:

Danke im voraus

1 Like

Hi Jean

Vielen Dank, dass das Plugin in Codeberg aufgenommen wurde :slight_smile:
Wie läuft das nun mit Änderungen? Ich würde gerne noch den Mail Versand für Passwörter einbauen.

Am besten einen Codeberg Account erstellen, das repo forken und dann später eine Pull Request stellen :slight_smile:

Tolles Addon werd ich gleich mal ausprobieren. Installation lief ohne Probleme. Was hat es mit dem Admin User admin@admin.com auf sich? Kann man den löschen?

Ich hätte ungerne einen unbekannten User mit unbekannten Login Möglichkeiten mit Admin Rechten aktiv.

Gruß

Michael

Der Admin User wird von BS leider im Standard bereit gestellt!
siehe auch z.B.
Default admin user account handling plan · Issue #4575 · BookStackApp/BookStack

Der Nutzer kann von Hand gelöscht werden, hab keine Möglichkeit gefunden den User automatisiert zu Löschen.

Konnte in jedem Fall nach dem Löschen weiterhin User anlegen über OIDC