#!/usr/bin/env bash # bootstrap-install.sh — klona från Gitea och integrera i befintlig nextcloud-node-red # # Skapar INTE ny Node-RED-container. Patchar /home/ncdeploy/nextcloud-node-red och bygger om. # # One-liner: # curl -fsSL https://git.domain.name/your-user/nextcloud-collabora-nodered/raw/branch/main/bootstrap-install.sh | bash # # 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}" # Som root: använd ncdeploy-sökvägar (inte /root) if [ "$(id -u)" -eq 0 ] && [ -d "/home/ncdeploy" ]; then INSTALL_DIR="${INSTALL_DIR:-/home/ncdeploy/nextcloud-collabora-nodered}" NODERED_DIR="${NODERED_DIR:-/home/ncdeploy/nextcloud-node-red}" else INSTALL_DIR="${INSTALL_DIR:-${HOME}/nextcloud-collabora-nodered}" NODERED_DIR="${NODERED_DIR:-${HOME}/nextcloud-node-red}" fi NC_HOST="${NC_HOST:-cloud.domain.name}" CODE_CONTAINER="${CODE_CONTAINER:-code}" NODERED_CONTAINER="${NODERED_CONTAINER:-nextcloud-node-red}" NODERED_PORT="${NODERED_PORT:-1880}" SKIP_APT="${SKIP_APT:-0}" SKIP_DOCKER_INSTALL="${SKIP_DOCKER_INSTALL:-1}" log() { printf '[bootstrap] %s\n' "$*"; } warn() { printf '[bootstrap] VARNING: %s\n' "$*" >&2; } die() { printf '[bootstrap] 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 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 log "Installerar git, curl, rsync..." run_as_root apt-get update -qq run_as_root apt-get install -y -qq git curl ca-certificates rsync } install_docker() { [ "${SKIP_DOCKER_INSTALL}" = "1" ] && return 0 command -v docker >/dev/null 2>&1 && docker info >/dev/null 2>&1 && return 0 log "Installerar Docker..." curl -fsSL https://get.docker.com | run_as_root sh } 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 git -C "${INSTALL_DIR}" checkout "${GIT_BRANCH}" git -C "${INSTALL_DIR}" pull --ff-only origin "${GIT_BRANCH}" || warn "git pull misslyckades" return 0 fi log "Klonar ${GIT_REPO_URL} → ${INSTALL_DIR}" mkdir -p "$(dirname "${INSTALL_DIR}")" git clone --branch "${GIT_BRANCH}" --depth 1 "${GIT_REPO_URL}" "${INSTALL_DIR}" fix_repo_ownership ensure_git_safe_directory } preflight() { command -v docker >/dev/null 2>&1 || die "Docker saknas" docker ps --format '{{.Names}}' | grep -qx "${NODERED_CONTAINER}" \ || die "'${NODERED_CONTAINER}' körs inte — detta skript integrerar i befintlig Node-RED, skapar ingen ny" docker ps --format '{{.Names}}' | grep -qx "${CODE_CONTAINER}" \ || die "'${CODE_CONTAINER}' (Collabora) körs inte" [ -d "${NODERED_DIR}" ] || die "nextcloud-node-red-katalog saknas: ${NODERED_DIR}" log "OK: ${NODERED_CONTAINER} + ${CODE_CONTAINER} körs" } 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 ] && [ "$(runtime_user)" = "root" ]; then warn "Körs som root — rekommenderat: curl ... | sudo -u ncdeploy bash" fi install_apt_packages install_docker clone_or_update_repo preflight chmod +x "${INSTALL_DIR}/install.sh" "${INSTALL_DIR}/scripts/integrate-into-nodered.sh" INSTALL_DIR="${INSTALL_DIR}" \ INSTALL_MODE="${INSTALL_MODE}" \ NODERED_DIR="${NODERED_DIR}" \ CODE_CONTAINER="${CODE_CONTAINER}" \ bash "${INSTALL_DIR}/install.sh" local host_ip host_ip="$(hostname -I 2>/dev/null | awk '{print $1}' || echo "127.0.0.1")" cat <