release: v0.8.28

install.sh krijgt --host, zodat een server die de ingebouwde hostnaam niet
kan oplossen toch bij de broncode kan. Bij een bestaande installatie wordt de
git-remote meteen omgezet, anders had de optie daar geen effect.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01H9Vcwu7owJZ3nj5dCf4VFT
This commit is contained in:
Ramon 2026-08-07 14:05:29 +02:00
parent ac3a357ed7
commit d4e4f47760
4 changed files with 108 additions and 5 deletions

View file

@ -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 # v0.8.27 — Wachtwoorden, wachtrijen, snelheid en versies
Eerste stabiele uitgave sinds v0.8.12. Wie vanaf die versie bijwerkt, krijgt de Eerste stabiele uitgave sinds v0.8.12. Wie vanaf die versie bijwerkt, krijgt de

View file

@ -1 +1 @@
0.8.27 0.8.28

View file

@ -15,6 +15,8 @@ set -eu
SCRIPT_VERSIE="1.2" SCRIPT_VERSIE="1.2"
GIT_HOST="git.ramonbesselink.nl" GIT_HOST="git.ramonbesselink.nl"
GIT_SCHEMA="https"
HOST_EXPLICIET=0
GIT_PAD="bes-r/server-up" GIT_PAD="bes-r/server-up"
BRANCH="main" BRANCH="main"
DOEL="/opt/server-up" DOEL="/opt/server-up"
@ -118,7 +120,15 @@ Gebruik: install.sh [opties]
--bind ADRES Waarop de poort luistert (standaard: ${BIND}) --bind ADRES Waarop de poort luistert (standaard: ${BIND})
Gebruik 0.0.0.0 om er van buiten de server bij te kunnen, 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. 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 --token TOKEN Toegangstoken, als je git-repo niet openbaar is
--base-dir PAD Hoofdmap voor stacks, appdata en backups --base-dir PAD Hoofdmap voor stacks, appdata en backups
(standaard: /opt/serverup). Later wijzigen kan via (standaard: /opt/serverup). Later wijzigen kan via
@ -157,6 +167,27 @@ Voorbeelden:
UITLEG 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 ─────────────────────────────────────────────────────────────── # ── Argumenten ───────────────────────────────────────────────────────────────
while [ $# -gt 0 ]; do while [ $# -gt 0 ]; do
case "$1" in case "$1" in
@ -164,6 +195,7 @@ while [ $# -gt 0 ]; do
--port) POORT="${2:?--port vereist een nummer}"; POORT_EXPLICIET=1; shift 2 ;; --port) POORT="${2:?--port vereist een nummer}"; POORT_EXPLICIET=1; shift 2 ;;
--bind) BIND="${2:?--bind vereist een adres}"; BIND_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 ;; --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 ;; --token) TOKEN="${2:?--token vereist een waarde}"; shift 2 ;;
--user) GEBRUIKER="${2:?--user vereist een accountnaam}" --user) GEBRUIKER="${2:?--user vereist een accountnaam}"
GEBRUIKER_EXPLICIET=1; shift 2 ;; 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 # 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 # leest het via een credential-helper, curl via --config; in beide gevallen
# staat alleen het pád op de opdrachtregel. # 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="" TOKEN_BESTAND=""
CURL_BESTAND="" CURL_BESTAND=""
@ -373,6 +405,13 @@ haal_broncode() {
# installatie is er niets om naar terug te gaan. # installatie is er niets om naar terug te gaan.
VORIGE_COMMIT="$($SUDO git -C "$DOEL" rev-parse HEAD 2>/dev/null || echo '')" VORIGE_COMMIT="$($SUDO git -C "$DOEL" rev-parse HEAD 2>/dev/null || echo '')"
[ -n "$VORIGE_COMMIT" ] && log "Huidige versie: $(printf '%.9s' "$VORIGE_COMMIT")" [ -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" git_doe -C "$DOEL" fetch --depth 1 origin "$BRANCH"
# FETCH_HEAD en niet origin/$BRANCH: een tag krijgt geen origin/-ref, # FETCH_HEAD en niet origin/$BRANCH: een tag krijgt geen origin/-ref,
# dus `--branch v0.7.92-beta` installeerde prima maar kon daarna nooit # 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." waarschuw "Klonen mislukte; ik probeer het archief."
fi 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" log "Downloaden: $archief"
if [ "$DROOG" -eq 0 ]; then if [ "$DROOG" -eq 0 ]; then
tijdelijk="$(mktemp -d)" tijdelijk="$(mktemp -d)"

View file

@ -53,7 +53,7 @@ def test_geen_bashismen():
def test_help_werkt_en_noemt_alle_opties(): def test_help_werkt_en_noemt_alle_opties():
r = _draai("--help") r = _draai("--help")
assert r.returncode == 0 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", "--update", "--uninstall", "--yes", "--dry-run",
"--admin", "--admin-password-file", "--create-admin"): "--admin", "--admin-password-file", "--create-admin"):
assert optie in r.stdout, f"{optie} niet gedocumenteerd in --help" 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 assert "eigen koppeling, maar niet in de container" in blok
# De uitweg hoort erbij te staan, anders weet je nog niets. # De uitweg hoort erbij te staan, anders weet je nog niets.
assert "docker-compose.yml" in blok 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