diff --git a/CHANGELOG.md b/CHANGELOG.md index 69bcaa3..5808ad7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,19 @@ +# v0.8.28 — Installeren vanaf een ander adres + +De ingebouwde hostnaam in `install.sh` lost niet overal op. Staat je Forgejo +achter een naam die alleen op je eigen netwerk werkt, dan strandt bijwerken +vanaf een andere locatie op `could not resolve host` — ook door een tunnel, +want die repareert de naam niet. + +- **`--host ADRES`** geeft aan waar de broncode staat: een naam, een IP of een + tailnet-adres. Een schema mag mee (`--host http://10.0.20.22:3000`), want een + IP over https levert een certificaatfout op. +- **Een bestaande installatie gaat mee.** Die haalt op via de remote die in de + kloon staat — precies het adres dat het niet doet. Met `--host` wordt die + remote eerst omgezet, zodat bijwerken daarna vanzelf via het nieuwe adres + gaat. +- **`--branch` accepteert ook een tag**, en dat staat nu ook in de hulptekst. + # v0.8.27 — Wachtwoorden, wachtrijen, snelheid en versies Eerste stabiele uitgave sinds v0.8.12. Wie vanaf die versie bijwerkt, krijgt de diff --git a/VERSION b/VERSION index 54e9046..da8dfd3 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.8.27 +0.8.28 diff --git a/install.sh b/install.sh index 161314e..d8bb322 100755 --- a/install.sh +++ b/install.sh @@ -15,6 +15,8 @@ set -eu SCRIPT_VERSIE="1.2" GIT_HOST="git.ramonbesselink.nl" +GIT_SCHEMA="https" +HOST_EXPLICIET=0 GIT_PAD="bes-r/server-up" BRANCH="main" DOEL="/opt/server-up" @@ -118,7 +120,15 @@ Gebruik: install.sh [opties] --bind ADRES Waarop de poort luistert (standaard: ${BIND}) Gebruik 0.0.0.0 om er van buiten de server bij te kunnen, maar zet er dan wel een reverse proxy met TLS voor. - --branch NAAM Branch om te installeren (standaard: ${BRANCH}) + --branch NAAM Branch of tag om te installeren (standaard: ${BRANCH}) + --host ADRES Waar de broncode staat, als ${GIT_HOST} daar niet + oplost of niet bereikbaar is. Een naam, een IP of een + tailnet-adres; een schema mag mee omdat een IP over https + een certificaatfout geeft: + --host 10.0.20.22 + --host http://10.0.20.22:3000 + Bij een bestaande installatie wordt de git-remote meteen + omgezet, zodat bijwerken daarna via dit adres gaat. --token TOKEN Toegangstoken, als je git-repo niet openbaar is --base-dir PAD Hoofdmap voor stacks, appdata en backups (standaard: /opt/serverup). Later wijzigen kan via @@ -157,6 +167,27 @@ Voorbeelden: UITLEG } +# Waar de broncode vandaan komt. Standaard de naam hierboven, maar die is niet +# overal te gebruiken: staat je Forgejo achter een naam die alleen thuis +# oplost, dan kom je er vanaf een andere locatie (of door een tunnel) niet uit. +# Met `--host` geef je dan het adres op dat daar wél werkt — een IP, een +# tailnet-adres, een andere naam — zonder aan /etc/hosts te komen. +# +# Een IP over https levert een certificaatfout op, dus een schema mag mee: +# --host 10.0.20.22 → https://10.0.20.22 +# --host http://10.0.20.22:3000 → precies dat +zet_host() { + _waarde="${1%/}" + case "$_waarde" in + http://*) GIT_SCHEMA="http"; _waarde="${_waarde#http://}" ;; + https://*) GIT_SCHEMA="https"; _waarde="${_waarde#https://}" ;; + esac + # Alles achter de eerste schuine streep is een pad; dat komt uit GIT_PAD. + GIT_HOST="${_waarde%%/*}" + [ -n "$GIT_HOST" ] || fout "--host vereist een adres, bijvoorbeeld 10.0.20.22:3000" + HOST_EXPLICIET=1 +} + # ── Argumenten ─────────────────────────────────────────────────────────────── while [ $# -gt 0 ]; do case "$1" in @@ -164,6 +195,7 @@ while [ $# -gt 0 ]; do --port) POORT="${2:?--port vereist een nummer}"; POORT_EXPLICIET=1; shift 2 ;; --bind) BIND="${2:?--bind vereist een adres}"; BIND_EXPLICIET=1; shift 2 ;; --branch) BRANCH="${2:?--branch vereist een naam}"; shift 2 ;; + --host) zet_host "${2:?--host vereist een adres}"; shift 2 ;; --token) TOKEN="${2:?--token vereist een waarde}"; shift 2 ;; --user) GEBRUIKER="${2:?--user vereist een accountnaam}" GEBRUIKER_EXPLICIET=1; shift 2 ;; @@ -324,7 +356,7 @@ controleer_docker() { # In plaats daarvan: een bestand met modus 0600 dat na afloop weer weg is. Git # leest het via een credential-helper, curl via --config; in beide gevallen # staat alleen het pád op de opdrachtregel. -bron_url() { printf 'https://%s/%s.git' "$GIT_HOST" "$GIT_PAD"; } +bron_url() { printf '%s://%s/%s.git' "$GIT_SCHEMA" "$GIT_HOST" "$GIT_PAD"; } TOKEN_BESTAND="" CURL_BESTAND="" @@ -373,6 +405,13 @@ haal_broncode() { # installatie is er niets om naar terug te gaan. VORIGE_COMMIT="$($SUDO git -C "$DOEL" rev-parse HEAD 2>/dev/null || echo '')" [ -n "$VORIGE_COMMIT" ] && log "Huidige versie: $(printf '%.9s' "$VORIGE_COMMIT")" + # Een bestaande kloon haalt op via de remote die erin staat, en die + # wijst naar de naam van toen. Juist bij --host is dat het adres dat het + # niet doet — dus eerst omzetten, anders heeft de optie geen effect. + if [ "$HOST_EXPLICIET" -eq 1 ]; then + log "Bron omgezet naar $(bron_url)" + doe $SUDO git -C "$DOEL" remote set-url origin "$(bron_url)" + fi git_doe -C "$DOEL" fetch --depth 1 origin "$BRANCH" # FETCH_HEAD en niet origin/$BRANCH: een tag krijgt geen origin/-ref, # dus `--branch v0.7.92-beta` installeerde prima maar kon daarna nooit @@ -396,7 +435,7 @@ haal_broncode() { waarschuw "Klonen mislukte; ik probeer het archief." fi - archief="https://${GIT_HOST}/${GIT_PAD}/archive/${BRANCH}.tar.gz" + archief="${GIT_SCHEMA}://${GIT_HOST}/${GIT_PAD}/archive/${BRANCH}.tar.gz" log "Downloaden: $archief" if [ "$DROOG" -eq 0 ]; then tijdelijk="$(mktemp -d)" diff --git a/tests/test_install_script.py b/tests/test_install_script.py index fc99fc7..9c9d061 100644 --- a/tests/test_install_script.py +++ b/tests/test_install_script.py @@ -53,7 +53,7 @@ def test_geen_bashismen(): def test_help_werkt_en_noemt_alle_opties(): r = _draai("--help") assert r.returncode == 0 - for optie in ("--dir", "--port", "--bind", "--branch", "--token", + for optie in ("--dir", "--port", "--bind", "--branch", "--host", "--token", "--update", "--uninstall", "--yes", "--dry-run", "--admin", "--admin-password-file", "--create-admin"): assert optie in r.stdout, f"{optie} niet gedocumenteerd in --help" @@ -1213,3 +1213,51 @@ def test_doctor_kijkt_naar_koppelingen_onder_base_dir(): assert "eigen koppeling, maar niet in de container" in blok # De uitweg hoort erbij te staan, anders weet je nog niets. assert "docker-compose.yml" in blok + + +# ── Een andere bron opgeven ────────────────────────────────────────────────── +# De ingebouwde hostnaam lost niet overal op: staat je Forgejo achter een naam +# die alleen thuis werkt, dan kom je er vanaf een andere locatie niet uit en +# strandt het bijwerken op "could not resolve host". + +def test_host_wordt_in_de_bron_url_gebruikt(tmp_path): + r = _draai("--dry-run", "--yes", "--dir", str(tmp_path / "su"), + "--host", "10.0.20.22") + assert "https://10.0.20.22/bes-r/server-up" in r.stdout, r.stdout[-800:] + assert "git.ramonbesselink.nl" not in r.stdout + + +def test_host_met_schema_en_poort(tmp_path): + """Een IP over https geeft een certificaatfout, dus http moet kunnen.""" + r = _draai("--dry-run", "--yes", "--dir", str(tmp_path / "su"), + "--host", "http://10.0.20.22:3000") + assert "http://10.0.20.22:3000/bes-r/server-up" in r.stdout + + +def test_host_negeert_een_pad_erachter(tmp_path): + r = _draai("--dry-run", "--yes", "--dir", str(tmp_path / "su"), + "--host", "https://voorbeeld.nl/iets/anders/") + assert "https://voorbeeld.nl/bes-r/server-up" in r.stdout + + +def test_host_zonder_waarde_stopt(tmp_path): + r = _draai("--dry-run", "--host") + assert r.returncode != 0 + assert "--host" in (r.stdout + r.stderr) + + +def test_zonder_host_blijft_de_standaard_staan(tmp_path): + r = _draai("--dry-run", "--yes", "--dir", str(tmp_path / "su")) + assert "git.ramonbesselink.nl" in r.stdout + + +def test_bestaande_installatie_krijgt_de_nieuwe_remote(tmp_path): + """Een bestaande kloon haalt op via de remote die erin staat — precies het + adres dat het niet doet. Zonder omzetten heeft --host geen effect.""" + if not shutil.which("git"): + pytest.skip("git niet aanwezig") + doel = tmp_path / "su" + (doel / ".git").mkdir(parents=True) + r = _draai("--dry-run", "--yes", "--dir", str(doel), + "--host", "100.64.0.5") + assert "remote set-url origin https://100.64.0.5/bes-r/server-up.git" in r.stdout