Fix: sudo docker build context + bootstrap reexec sudo

This commit is contained in:
Hannes Ahlin
2026-08-22 15:28:06 +02:00
parent 0636d380df
commit c44e3fe1ef
2 changed files with 69 additions and 14 deletions
+3 -6
View File
@@ -3,11 +3,8 @@
# #
# Skapar INTE ny Node-RED-container. Patchar /home/ncadmin/nextcloud-node-red och bygger om. # Skapar INTE ny Node-RED-container. Patchar /home/ncadmin/nextcloud-node-red och bygger om.
# #
# One-liner: # One-liner (kör som ncadmin, INTE root):
# curl -fsSL https://kode.hannesahlin.se/n3wk/nextcloud-collabora-nodered/raw/branch/main/bootstrap-install.sh | bash # curl -fsSL https://kode.hannesahlin.se/n3wk/nextcloud-collabora-nodered/raw/branch/main/bootstrap-install.sh | sudo -u ncadmin bash
#
# Som ncadmin (rekommenderat):
# curl -fsSL ... | sudo -u ncadmin bash
# #
# Om git "dubious ownership" (root ägde repot): # Om git "dubious ownership" (root ägde repot):
# sudo bash scripts/fix-repo-ownership.sh # sudo bash scripts/fix-repo-ownership.sh
@@ -64,7 +61,7 @@ reexec_as_install_user() {
log "Kör om som ${user} (inte root)..." log "Kör om som ${user} (inte root)..."
export BOOTSTRAP_REEXEC=1 export BOOTSTRAP_REEXEC=1
export INSTALL_DIR NODERED_DIR INSTALL_MODE GIT_REPO_URL GIT_BRANCH export INSTALL_DIR NODERED_DIR INSTALL_MODE GIT_REPO_URL GIT_BRANCH
exec run_as_root sudo -u "${user}" -H env \ exec sudo -u "${user}" -H env \
BOOTSTRAP_REEXEC=1 \ BOOTSTRAP_REEXEC=1 \
INSTALL_DIR="${INSTALL_DIR}" \ INSTALL_DIR="${INSTALL_DIR}" \
NODERED_DIR="${NODERED_DIR}" \ NODERED_DIR="${NODERED_DIR}" \
+66 -8
View File
@@ -16,6 +16,68 @@ log() { printf '[integrate] %s\n' "$*"; }
warn() { printf '[integrate] VARNING: %s\n' "$*" >&2; } warn() { printf '[integrate] VARNING: %s\n' "$*" >&2; }
die() { printf '[integrate] FEL: %s\n' "$*" >&2; exit 1; } die() { printf '[integrate] FEL: %s\n' "$*" >&2; exit 1; }
run_as_root() {
if [ "$(id -u)" -eq 0 ]; then
"$@"
elif command -v sudo >/dev/null 2>&1; then
sudo "$@"
else
die "sudo/root krävs för: $*"
fi
}
runtime_user() {
if [ -n "${INSTALL_USER:-}" ]; then
echo "${INSTALL_USER}"
elif id ncadmin >/dev/null 2>&1; then
echo "ncadmin"
else
id -un
fi
}
# Docker build context måste kunna läsa nodes/ (inkl. odds-scraper — rör inte innehållet)
fix_nodered_build_permissions() {
local user group
user="$(runtime_user)"
group="$(id -gn "${user}" 2>/dev/null || echo "${user}")"
if [ ! -d "${NODERED_DIR}/nodes" ]; then
return 0
fi
if run_as_root test -r "${NODERED_DIR}/nodes/odds-scraper" 2>/dev/null; then
: # root kan läsa
else
warn "nodes/odds-scraper oläsbar — fixar läsrättigheter för build (innehåll orört)"
fi
log "Säkerställer läsbar Docker build context under ${NODERED_DIR}/nodes"
run_as_root find "${NODERED_DIR}/nodes" -type d -exec chmod a+rx {} + 2>/dev/null || true
run_as_root find "${NODERED_DIR}/nodes" -type f -exec chmod a+r {} + 2>/dev/null || true
# Alternativt: ge ncadmin ägarskap om katalogen ägs av root
if [ "$(stat -c '%U' "${NODERED_DIR}" 2>/dev/null)" = "root" ]; then
run_as_root chown -R "${user}:${group}" "${NODERED_DIR}"
fi
}
compose_cmd() {
if docker compose version >/dev/null 2>&1; then
echo "docker compose"
else
echo "docker-compose"
fi
}
# sudo docker compose: root läser hela build context (fixar permission denied på odds-scraper)
compose_run() {
local compose
compose="$(compose_cmd)"
cd "${NODERED_DIR}"
if [ "$(id -u)" -eq 0 ]; then
${compose} "$@"
else
run_as_root ${compose} "$@"
fi
}
resolve_paths() { resolve_paths() {
if [ "$(id -u)" -eq 0 ] && [ -d "/home/ncadmin/nextcloud-node-red" ]; then if [ "$(id -u)" -eq 0 ] && [ -d "/home/ncadmin/nextcloud-node-red" ]; then
NODERED_DIR="${NODERED_DIR:-/home/ncadmin/nextcloud-node-red}" NODERED_DIR="${NODERED_DIR:-/home/ncadmin/nextcloud-node-red}"
@@ -106,18 +168,14 @@ connect_code_network() {
} }
rebuild_nodered() { rebuild_nodered() {
local compose="docker compose"
if ! docker compose version >/dev/null 2>&1; then
compose="docker-compose"
fi
log "Bygger om ${NODERED_CONTAINER} (samma instans, port ${NODERED_PORT})..." log "Bygger om ${NODERED_CONTAINER} (samma instans, port ${NODERED_PORT})..."
cd "${NODERED_DIR}" fix_nodered_build_permissions
if [ "${FORCE_REBUILD:-0}" = "1" ]; then if [ "${FORCE_REBUILD:-0}" = "1" ]; then
${compose} build --no-cache compose_run build --no-cache
else else
${compose} build compose_run build
fi fi
${compose} up -d compose_run up -d
} }
wait_nodered() { wait_nodered() {