diff --git a/CHANGELOG.md b/CHANGELOG.md index 086a732..d704927 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,47 @@ +# v0.10.10-beta — Het installatiescript loog op drie plekken + +Een controle van het hele installatiepad leverde drie fouten op die alledrie op +`curl … | sh` liggen — de regel die de README noemt. + +**Vragen werden niet gesteld en beantwoordden zichzelf met "ja".** `vraag()` +keek naar stdin, en bij `curl … | sh` is dat de pipe. Alle andere prompts in het +script gebruiken `/dev/tty`, dat gewoon bereikbaar is. Gevolg: "Nu installeren +via het officiële script van docker.com?" werd overgeslagen en met ja +beantwoord, `--uninstall` brak je installatie af zonder bevestiging, en de vraag +of je een beheerdersaccount wilde bleef ongesteld terwijl de vervolgprompt +("Gebruikersnaam:") wél verscheen. Er is nu één `terminal_beschikbaar()` die +alle vijf de plekken gebruiken. + +**Met een eigen bind-adres mislukte de healthcheck én het beheerdersaccount.** +Compose publiceert op `$BIND`, maar het script vroeg altijd `127.0.0.1`. Met +`--bind 10.0.20.5` luistert daar niets, dus meldde het "reageerde niet binnen +anderhalve minuut" en daarna "Server Up was niet bereikbaar; account niet +aangemaakt" — terwijl alles draaide. Je hield een installatie over zonder +account, precies het venster waar het script voor waarschuwt. Het controleadres +volgt nu `$BIND`, met blokhaken om IPv6. + +**Een mislukte update meldde zich als geslaagd.** `wacht_op_gereed || true` +gevolgd door `goed "Bijgewerkt."` maakte een kapotte update niet te +onderscheiden van een goede, ook niet aan de exitcode. Nu stopt hij met een +foutmelding en de weg terug. Bij een verse installatie gaat hij wél door — die +aanwijzingen zijn juist dán nuttig — maar het slot zegt eerlijk dat er niet +geantwoord is en de exitcode is 1. + +Verder: + +- `curl` kreeg tijdslimieten bij het pollen. Zonder die limieten bleef hij + hangen op een adres waar niets naartoe routeert en betekende het aantal + pogingen niets. Het aantal is nu ook instelbaar met `SU_WACHT_POGINGEN`, voor + trage machines. +- Het slot zei nog "Server Up beheert Docker als root" en noemt nu onder welk + account het draait. + +Onderweg gevonden en meteen verholpen: de eerste versie van +`terminal_beschikbaar()` gebruikte `{ : /dev/null || return 1 + return 0 +} + vraag() { # vraag "Vraag?" -> 0 bij ja. Met --yes of zonder terminal: altijd ja. [ "$JA" -eq 1 ] && return 0 - [ -t 0 ] || return 0 + terminal_beschikbaar || return 0 printf ' %s [J/n] ' "$1" read -r antwoord /dev/null 2>&1; then + # Zonder tijdslimiet blijft curl hangen op een adres waar niets naartoe + # routeert, en betekent het aantal pogingen niets meer. + tijden="--connect-timeout 2 --max-time 5" + while [ "$i" -lt "$pogingen" ]; do + if curl -fsS $tijden "${basis}/healthz" >/dev/null 2>&1; then # Spatie na de dubbele punt toestaan: of json compact is, # hangt af van de Flask-versie. - versie="$(curl -fsS "http://127.0.0.1:${POORT}/healthz" 2>/dev/null \ + versie="$(curl -fsS $tijden "${basis}/healthz" 2>/dev/null \ | sed -n 's/.*"version" *: *"\([^"]*\)".*/\1/p')" printf '\n' goed "Server Up${versie:+ }${versie:-} draait" @@ -619,7 +661,7 @@ wacht_op_gereed() { sleep 2 done printf '\n' - waarschuw "Server Up reageerde niet binnen anderhalve minuut." + waarschuw "Server Up reageerde niet op ${basis}." log "Bekijk de logs met: $SUDO docker compose -f $DOEL/docker-compose.yml logs --tail=50" return 1 } @@ -681,7 +723,7 @@ bepaal_wachtwoord() { BEHEERDER_WW="$SU_ADMIN_PASSWORD" return 0 fi - if [ "$JA" -eq 0 ] && [ -e /dev/tty ]; then + if [ "$JA" -eq 0 ] && terminal_beschikbaar; then vraag_wachtwoord && return 0 fi BEHEERDER_WW="$(genereer_wachtwoord)" @@ -696,7 +738,7 @@ vraag_beheerder() { [ -n "$BEHEERDER" ] && return 0 [ "$JA" -eq 1 ] && return 0 [ "$DROOG" -eq 1 ] && return 0 - [ -e /dev/tty ] || return 0 + terminal_beschikbaar || return 0 stap "Beheerdersaccount" if ! vraag "Nu meteen een beheerdersaccount aanmaken?"; then @@ -740,9 +782,10 @@ maak_beheerder() { code="$(printf '{"username":"%s","password":"%s"}' \ "$(json_tekst "$BEHEERDER")" "$(json_tekst "$BEHEERDER_WW")" \ | curl -sS -o "$antwoord" -w '%{http_code}' \ + --connect-timeout 5 --max-time 20 \ -X POST -H 'Content-Type: application/json' \ --data-binary @- \ - "http://127.0.0.1:${POORT}/api/auth/setup" 2>/dev/null || true)" + "http://$(probe_adres):${POORT}/api/auth/setup" 2>/dev/null || true)" # Bij een mislukte verbinding schrijft curl zelf al "000"; kan curl helemaal # niet draaien, dan blijft het leeg. Beide gevallen zijn hetzelfde verhaal. case "$code" in ''|*[!0-9]*) code="000" ;; esac @@ -775,9 +818,19 @@ afsluiting() { fi printf '\n%s────────────────────────────────────────────────────────%s\n' "$C_KOP" "$C_UIT" - printf '%s Server Up draait op %s%s\n' "$C_OK" "$adres" "$C_UIT" + if [ "$GEREED" -eq 1 ]; then + printf '%s Server Up draait op %s%s\n' "$C_OK" "$adres" "$C_UIT" + else + printf '%s Server Up antwoordde niet op %s%s\n' "$C_WAARSCHUW" "$adres" "$C_UIT" + fi printf '%s────────────────────────────────────────────────────────%s\n\n' "$C_KOP" "$C_UIT" + if [ "$GEREED" -eq 0 ]; then + printf ' De container is aangemaakt, maar reageerde nog niet. Kijk wat\n' + printf ' er aan de hand is met:\n' + printf ' %s docker compose -f %s/docker-compose.yml logs --tail=50\n\n' "${SUDO:-}" "$DOEL" + fi + if [ -n "$BEHEERDER" ]; then printf ' %s✔%s Inloggen als: %s%s%s\n' "$C_OK" "$C_UIT" "$C_KOP" "$BEHEERDER" "$C_UIT" if [ "$WW_GEGENEREERD" -eq 1 ]; then @@ -797,10 +850,12 @@ afsluiting() { printf ' 2. sed -i "s/^BIND=.*/BIND=0.0.0.0/" %s/.env\n' "$DOEL" printf ' 3. %s docker compose -f %s/docker-compose.yml up -d\n\n' "${SUDO:-}" "$DOEL" else - printf ' %sDe interface staat open op je netwerk. Server Up beheert%s\n' "$C_WAARSCHUW" "$C_UIT" - printf ' Docker als root, dus zet er een reverse proxy met TLS voor.\n\n' + printf ' %sDe interface staat open op je netwerk.%s Server Up beheert de\n' "$C_WAARSCHUW" "$C_UIT" + printf ' Docker-daemon, dus wie erbij kan, kan alles op deze server.\n' + printf ' Zet er een reverse proxy met TLS voor.\n\n' fi + printf ' Draait als: %s\n' "${SU_NAAM:-root}" printf ' Bijwerken: sh %s/install.sh --update\n' "$DOEL" printf ' Logs: %s docker compose -f %s/docker-compose.yml logs -f\n' "${SUDO:-}" "$DOEL" printf ' Documentatie: %s/README.md\n\n' "$DOEL" @@ -854,9 +909,19 @@ case "$ACTIE" in schrijf_env zet_mappen_klaar start - wacht_op_gereed || true - printf '\n' - goed "Bijgewerkt." + # Niet wegkijken als hij niet opkomt: "Bijgewerkt." bij een kapotte + # update zag er precies zo uit als een geslaagde, en een script dat dit + # aanroept zag exitcode 0. + if wacht_op_gereed; then + printf '\n' + goed "Bijgewerkt." + else + printf '\n' + log "Terug naar de vorige versie kan met:" + log " cd $DOEL && git log --oneline -5 # kies een eerdere versie" + log " $SUDO docker compose -f $DOEL/docker-compose.yml up -d --build" + fout "Bijwerken mislukt: de nieuwe versie kwam niet omhoog." + fi ;; create-admin) # Losse actie voor een installatie die al draait: handig als het @@ -865,7 +930,7 @@ case "$ACTIE" in # en één verzoek naar de draaiende server — dus geen bepaal_rechten. lees_env_terug "$DOEL/.env" if [ -z "$BEHEERDER" ]; then - if [ -e /dev/tty ] && [ "$JA" -eq 0 ]; then + if terminal_beschikbaar && [ "$JA" -eq 0 ]; then printf '\n Gebruikersnaam: ' read -r naam