diff --git a/bootstrap-install.sh b/bootstrap-install.sh index 635cb21..ca751bf 100644 --- a/bootstrap-install.sh +++ b/bootstrap-install.sh @@ -9,10 +9,14 @@ # Som ncdeploy (rekommenderat): # curl -fsSL ... | sudo -u ncdeploy bash # +# Om git "dubious ownership" (root ägde repot): +# sudo bash scripts/fix-repo-ownership.sh +# set -euo pipefail VERSION="1.0.0" GIT_REPO_URL="${GIT_REPO_URL:-https://git.domain.name/your-user/nextcloud-collabora-nodered.git}" +BOOTSTRAP_URL="${BOOTSTRAP_URL:-https://git.domain.name/your-user/nextcloud-collabora-nodered/raw/branch/main/bootstrap-install.sh}" GIT_BRANCH="${GIT_BRANCH:-main}" INSTALL_MODE="${INSTALL_MODE:-integrate}" @@ -40,6 +44,60 @@ run_as_root() { if [ "$(id -u)" -eq 0 ]; then "$@"; elif command -v sudo >/dev/null 2>&1; then sudo "$@"; else die "sudo krävs"; fi } +runtime_user() { + if [ -n "${INSTALL_USER:-}" ]; then + echo "${INSTALL_USER}" + return + fi + if [ "$(id -u)" -eq 0 ] && id ncdeploy >/dev/null 2>&1; then + echo "ncdeploy" + return + fi + id -un +} + +# Root + curl|bash → kör om som ncdeploy (undvik root-ägt repo i /home/ncdeploy) +reexec_as_install_user() { + local user + user="$(runtime_user)" + if [ "$(id -un)" = "root" ] && [ "${user}" != "root" ] && [ -z "${BOOTSTRAP_REEXEC:-}" ]; then + log "Kör om som ${user} (inte root)..." + export BOOTSTRAP_REEXEC=1 + export INSTALL_DIR NODERED_DIR INSTALL_MODE GIT_REPO_URL GIT_BRANCH + exec run_as_root sudo -u "${user}" -H env \ + BOOTSTRAP_REEXEC=1 \ + INSTALL_DIR="${INSTALL_DIR}" \ + NODERED_DIR="${NODERED_DIR}" \ + INSTALL_MODE="${INSTALL_MODE}" \ + GIT_REPO_URL="${GIT_REPO_URL}" \ + GIT_BRANCH="${GIT_BRANCH}" \ + BOOTSTRAP_URL="${BOOTSTRAP_URL}" \ + bash -c "curl -fsSL '${BOOTSTRAP_URL}' | bash" + fi +} + +fix_repo_ownership() { + local user group owner + user="$(runtime_user)" + group="$(id -gn "${user}" 2>/dev/null || echo "${user}")" + [ -d "${INSTALL_DIR}" ] || return 0 + owner="$(stat -c '%U' "${INSTALL_DIR}" 2>/dev/null || echo "")" + if [ -n "${owner}" ] && [ "${owner}" != "${user}" ]; then + log "Repo ägs av ${owner} — sätter ägare ${user}:${group}" + run_as_root chown -R "${user}:${group}" "${INSTALL_DIR}" + fi +} + +ensure_git_safe_directory() { + local user + user="$(runtime_user)" + if [ "$(id -un)" = "${user}" ]; then + git config --global --add safe.directory "${INSTALL_DIR}" 2>/dev/null || true + else + run_as_root sudo -u "${user}" git config --global --add safe.directory "${INSTALL_DIR}" 2>/dev/null || true + fi +} + install_apt_packages() { [ "${SKIP_APT}" = "1" ] && return 0 command -v apt-get >/dev/null 2>&1 || return 0 @@ -56,6 +114,9 @@ install_docker() { } clone_or_update_repo() { + fix_repo_ownership + ensure_git_safe_directory + if [ -d "${INSTALL_DIR}/.git" ]; then log "Uppdaterar ${INSTALL_DIR}..." git -C "${INSTALL_DIR}" fetch origin @@ -66,9 +127,8 @@ clone_or_update_repo() { log "Klonar ${GIT_REPO_URL} → ${INSTALL_DIR}" mkdir -p "$(dirname "${INSTALL_DIR}")" git clone --branch "${GIT_BRANCH}" --depth 1 "${GIT_REPO_URL}" "${INSTALL_DIR}" - if [ "$(id -u)" -eq 0 ] && [ -d "/home/ncdeploy" ]; then - chown -R ncdeploy:ncdeploy "${INSTALL_DIR}" 2>/dev/null || true - fi + fix_repo_ownership + ensure_git_safe_directory } preflight() { @@ -82,11 +142,14 @@ preflight() { } main() { + reexec_as_install_user + log "bootstrap v${VERSION} — läge: ${INSTALL_MODE} (befintlig Node-RED :${NODERED_PORT})" + log "Användare: $(id -un)" log "Repo → ${INSTALL_DIR}" log "Integrera → ${NODERED_DIR}" - if [ "$(id -u)" -eq 0 ] && [ -z "${SUDO_USER:-}" ]; then + if [ "$(id -u)" -eq 0 ] && [ "$(runtime_user)" = "root" ]; then warn "Körs som root — rekommenderat: curl ... | sudo -u ncdeploy bash" fi diff --git a/scripts/fix-repo-ownership.sh b/scripts/fix-repo-ownership.sh new file mode 100644 index 0000000..3376575 --- /dev/null +++ b/scripts/fix-repo-ownership.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash +# Snabbfix om git "dubious ownership" efter root-kloning +set -euo pipefail +DIR="${1:-/home/ncdeploy/nextcloud-collabora-nodered}" +USER="${2:-ncdeploy}" +echo "chown ${USER} ${DIR}" +chown -R "${USER}:${USER}" "${DIR}" +sudo -u "${USER}" git config --global --add safe.directory "${DIR}" +echo "Klart. Kör: cd ${DIR} && ./install.sh"