Bookstack: create-admin fails on a reinstall because the account is already provisioned. That took the generic-failure branch, which printed the upstream defaults (admin@admin.com / password) as "the" login — those credentials were replaced on the first install, so the one line a user would act on was the wrong one. Detect "already exists" and say the existing account was kept and its password not reset. Firewall: uninstall deleted only resource_type='port', orphaning the port_tag_*/traefik_managed/url_accessible rows the rebuild reads. Every rebuild then walked ports for long-gone apps and printed "Skipped: <app> (app not found)" per row. Widen the uninstall delete to all non-'ip' rows (the source), and prune already-orphaned rows in the rebuild (the self-heal). Pruning requires both no container dir AND status != 1 in the apps table, so a mid-flight install can't prune itself. Verified on a live bookstack reinstall: admin path reports correctly, firewall pruned nextcloud + stalwart once, second run silent, 11 rules added / 0 failed throughout. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
94 lines
4.1 KiB
Bash
94 lines
4.1 KiB
Bash
#!/bin/bash
|
|
|
|
# Bookstack install hooks — drive the post-start admin account bootstrap.
|
|
# Generic installApp driver handles compose / start / db / monitoring; this
|
|
# adds the readiness probe + first-admin provisioning the original
|
|
# installBookstack() did inline.
|
|
|
|
bookstack_install_post_start()
|
|
{
|
|
local app_name="$1"
|
|
|
|
local bookstack_target_email="${CFG_BOOKSTACK_ADMIN_EMAIL:-admin@admin.com}"
|
|
local bookstack_target_pass="${CFG_BOOKSTACK_ADMIN_PASSWORD_1:-password}"
|
|
|
|
local bookstack_compose_file="$containers_dir$app_name/docker-compose.yml"
|
|
local bookstack_port_pair
|
|
bookstack_port_pair=$(tagsManagerGetTagContent "$bookstack_compose_file" "PORTS_TAG_1")
|
|
local bookstack_host_port="${bookstack_port_pair%%:*}"
|
|
local 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..."
|
|
|
|
local bookstack_attempts=0
|
|
local bookstack_ready=0
|
|
local bookstack_http_code
|
|
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 ""
|
|
return 0
|
|
fi
|
|
isSuccessful "Bookstack is online (HTTP ${bookstack_http_code})."
|
|
|
|
local bookstack_create_output
|
|
bookstack_create_output=$(runFileOp 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')
|
|
local 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
|
|
runFileOp 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 ""
|
|
elif [[ "$bookstack_create_output" == *"already exists"* ]]; then
|
|
# Reinstall over existing data: the account is already provisioned, so
|
|
# create-admin refuses. NOT a failure, and printing the upstream
|
|
# defaults here would be actively wrong — those credentials were
|
|
# replaced on the first install, and the password in the config was
|
|
# never re-applied to the live account.
|
|
isSuccessful "Bookstack admin account already exists (email: $bookstack_target_email) — kept as-is."
|
|
isNotice "Its password was NOT reset by this install. Sign in with the credentials from the original install, or reset from inside Bookstack."
|
|
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
|
|
}
|