release: v0.8.28
Some checks failed
Deploy server-up (dev) / deploy (push) Has been cancelled
Release / release (push) Successful in 3s
Deploy server-up (prod) / deploy (push) Successful in 12m56s

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 850a80f86b
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
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"
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)"

View file

@ -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