Files
homelab-infra/ops/renovate/run-renovate.sh
T
Micha bdae014bff Harden renovate runner: env-file, add-host, explicit DNS
Drei Issues beim Erstlauf gefunden und gefixt:

1. EAI_AGAIN: Renovate-Container konnte git.kaleschke.info nicht
   aufloesen. Analog zu Komodos extra_hosts mappen wir den Hostname
   per --add-host auf 192.168.178.58 (LAN-IP des Unraid-Hosts).
   Zusaetzlich --dns 1.1.1.1/8.8.8.8 fuer externe Image-Registries.

2. Token-Leak in ps und docker inspect: -e RENOVATE_TOKEN=... macht
   den Wert in Process-Listing sichtbar. Stattdessen --env-file mit
   einem 0600 tempfile unter $RENOVATE_STATE_DIR/.env, das nach dem
   Lauf via shred bzw. rm geloescht wird.

3. Doppelter rc=$? Block plus return innerhalb einer {}-Subshell
   waren Tot-Code; aufgeraeumt.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-29 20:04:24 +02:00

88 lines
3.3 KiB
Bash

#!/bin/bash
set -euo pipefail
# Self-hosted Renovate runner fuer Gitea.
#
# Wird vom Host-User-Script `renovate-six-hourly` aufgerufen. Liest das
# Gitea-PAT aus einer Host-Secret-Datei, startet den Renovate-Container
# ein einziges Mal, schreibt ein Log, beendet sich.
#
# Operator-Setup-Aufgaben (einmalig):
# 1. Gitea-User `renovate` anlegen (Service-Account), 2FA nicht zwingend
# 2. Diesem User Repo-Schreibrechte auf `Micha/*` geben
# 3. Im Gitea-Profil des renovate-Users ein Access-Token erzeugen:
# Scope: `write:repository` + `read:user`
# 4. Token in `/mnt/user/appdata/secrets/renovate_token.txt` ablegen (chmod 600)
# 5. Erstlauf: `bash /mnt/user/services/homelab-infra/ops/renovate/run-renovate.sh`
# 6. User-Script `renovate-six-hourly` aktivieren
RENOVATE_IMAGE="${RENOVATE_IMAGE:-renovate/renovate:41}"
RENOVATE_TOKEN_FILE="${RENOVATE_TOKEN_FILE:-/mnt/user/appdata/secrets/renovate_token.txt}"
RENOVATE_LOG_DIR="${RENOVATE_LOG_DIR:-/mnt/user/services/renovate/logs}"
RENOVATE_STATE_DIR="${RENOVATE_STATE_DIR:-/mnt/user/services/renovate/state}"
RENOVATE_CONFIG_FILE="${RENOVATE_CONFIG_FILE:-/mnt/user/services/homelab-infra/renovate.json}"
# Gitea sitzt hinter Traefik unter git.kaleschke.info; der WAN-Pfad geht
# ueber Public-IP -> FRITZBox. Vom Docker-Container aus loest der Standard-
# Resolver den Host moeglicherweise nicht auf (siehe `extra_hosts` im Komodo-
# Compose). Wir mappen direkt auf die LAN-IP des Unraid-Hosts.
GITEA_HOST_LAN_IP="${GITEA_HOST_LAN_IP:-192.168.178.58}"
if [ ! -r "$RENOVATE_TOKEN_FILE" ]; then
echo "Renovate token file missing or unreadable: $RENOVATE_TOKEN_FILE" >&2
echo "See ops/renovate/run-renovate.sh header for operator setup steps." >&2
exit 1
fi
if [ ! -r "$RENOVATE_CONFIG_FILE" ]; then
echo "Renovate config missing: $RENOVATE_CONFIG_FILE" >&2
exit 1
fi
mkdir -p "$RENOVATE_LOG_DIR" "$RENOVATE_STATE_DIR"
TS="$(date -u '+%Y-%m-%dT%H-%M-%SZ')"
LOG_FILE="$RENOVATE_LOG_DIR/renovate-$TS.log"
LATEST_SYMLINK="$RENOVATE_LOG_DIR/latest.log"
# Renovate liest die Konfiguration ueber RENOVATE_CONFIG_FILE als Pfad im
# Container; wir mounten die Repo-Datei read-only nach /usr/src/app/config.json.
{
echo "[renovate] starting $TS"
echo "[renovate] image: $RENOVATE_IMAGE"
echo "[renovate] config: $RENOVATE_CONFIG_FILE"
echo "[renovate] log: $LOG_FILE"
echo
# Token wird ueber --env-file uebergeben, damit der Wert weder in
# `ps`-Ausgabe noch im docker inspect -Snapshot landet. Das Env-File
# liegt unter $RENOVATE_STATE_DIR/.env und wird mit 0600 angelegt.
ENV_FILE="$RENOVATE_STATE_DIR/.env"
umask 077
cat > "$ENV_FILE" <<EFEOF
RENOVATE_TOKEN=$(cat "$RENOVATE_TOKEN_FILE")
RENOVATE_CONFIG_FILE=/usr/src/app/config.json
RENOVATE_PLATFORM=gitea
RENOVATE_ENDPOINT=https://git.kaleschke.info/api/v1
LOG_LEVEL=${RENOVATE_LOG_LEVEL:-info}
EFEOF
chmod 600 "$ENV_FILE"
docker run --rm \
--name renovate-run \
--add-host "git.kaleschke.info:$GITEA_HOST_LAN_IP" \
--dns 1.1.1.1 \
--dns 8.8.8.8 \
-v "$RENOVATE_CONFIG_FILE":/usr/src/app/config.json:ro \
-v "$RENOVATE_STATE_DIR":/tmp/renovate \
--env-file "$ENV_FILE" \
"$RENOVATE_IMAGE" 2>&1
rc=$?
shred -u "$ENV_FILE" 2>/dev/null || rm -f "$ENV_FILE"
echo
echo "[renovate] finished rc=$rc"
exit $rc
} | tee "$LOG_FILE"
ln -sfn "$LOG_FILE" "$LATEST_SYMLINK"