diff --git a/deploy.sh b/deploy.sh index 32b2b52..e376772 100755 --- a/deploy.sh +++ b/deploy.sh @@ -2,7 +2,8 @@ set -Eeuo pipefail # Usage: -# ./deploy.sh +# ./deploy.sh (benoetigt sudo fuer chown; npm/composer als dein User) +# sudo ./deploy.sh (empfohlen: SUDO_USER bekommt public/build vor dem Vite-Build) # Optional env vars: # APP_DIR=/web/einkauf (Standard; anpassen wenn die App woanders liegt) # PHP_BIN=/usr/bin/php @@ -10,10 +11,9 @@ set -Eeuo pipefail # NPM_BIN=/usr/bin/npm # RUN_SEED=true # -# Rechte: Am Ende wird chown www-data gesetzt. Dann kann ein normaler User -# composer.lock nicht schreiben — composer update ggf. mit: -# sudo chown -R "$(whoami):$(whoami)" "${APP_DIR}" # oder nur composer.json + composer.lock -# oder: sudo -u www-data composer update (wenn Composer fuer www-data erreichbar ist). +# Rechte: Nur storage, bootstrap/cache und public/build gehen an www-data. +# Code + vendor bleiben beim Deploy-User — sonst schlagen npm/vite/composer fehl (EACCES). +# Bei sudo ./deploy.sh ist der Build-User SUDO_USER (z. B. stefanz). APP_DIR="${APP_DIR:-/web/einkauf}" PHP_BIN="${PHP_BIN:-/usr/bin/php}" @@ -36,6 +36,24 @@ fi cd "${APP_DIR}" +if [ "$(id -u)" -eq 0 ] && [ -n "${SUDO_USER:-}" ]; then + DEPLOY_OWNER="${SUDO_USER}" +else + DEPLOY_OWNER="$(id -un)" +fi + +chown_path_for_build() { + local p="${1:?}" + [ -e "$p" ] || return 0 + if [ "$(id -u)" -eq 0 ]; then + chown -R "${DEPLOY_OWNER}:${DEPLOY_OWNER}" "$p" + elif command -v sudo >/dev/null 2>&1; then + sudo chown -R "${DEPLOY_OWNER}:${DEPLOY_OWNER}" "$p" + else + echo "Warnung: kann ${p} nicht chownen — ggf. sudo nutzen oder manuell: chown -R ${DEPLOY_OWNER} ${p}" >&2 + fi +} + echo "==> Deploy startet in ${APP_DIR}" if [ ! -f "artisan" ]; then @@ -59,6 +77,11 @@ git reset --hard origin/main echo "==> PHP-Abhaengigkeiten installieren" "${COMPOSER_BIN}" install --no-dev --prefer-dist --optimize-autoloader --no-interaction +echo "==> Frontend: Schreibrechte (Vite leert public/build)" +mkdir -p "${APP_DIR}/public/build" +chown_path_for_build "${APP_DIR}/public/build" +chown_path_for_build "${APP_DIR}/node_modules" + echo "==> Frontend-Abhaengigkeiten installieren" "${NPM_BIN}" ci @@ -82,8 +105,19 @@ echo "==> Caches aufbauen" "${PHP_BIN}" artisan route:cache "${PHP_BIN}" artisan view:cache -echo "==> Rechte setzen" -chown -R www-data:www-data "${APP_DIR}" -chmod -R 775 "${APP_DIR}/storage" "${APP_DIR}/bootstrap/cache" +echo "==> Rechte setzen (www-data nur wo noetig)" +if [ "$(id -u)" -eq 0 ]; then + DO_CHOWN=(chown -R) + DO_CHMOD=(chmod -R) + DO_FIND=(find) +else + DO_CHOWN=(sudo chown -R) + DO_CHMOD=(sudo chmod -R) + DO_FIND=(sudo find) +fi +"${DO_CHOWN[@]}" www-data:www-data "${APP_DIR}/storage" "${APP_DIR}/bootstrap/cache" "${APP_DIR}/public/build" +"${DO_CHMOD[@]}" 775 "${APP_DIR}/storage" "${APP_DIR}/bootstrap/cache" +"${DO_FIND[@]}" "${APP_DIR}/public/build" -type d -exec chmod 755 {} + 2>/dev/null || true +"${DO_FIND[@]}" "${APP_DIR}/public/build" -type f -exec chmod 644 {} + 2>/dev/null || true echo "==> Deploy erfolgreich"