deploy.sh: Vite-Build EACCES vermeiden, chown nur storage/bootstrap/public/build

Made-with: Cursor
This commit is contained in:
Stefan Zwischenbrugger 2026-03-30 21:19:32 +02:00
parent 1de5d089e9
commit d77a1b1181

View File

@ -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"