From b9c2eb5eef9201db440921188088badfa4e639db Mon Sep 17 00:00:00 2001 From: boban Date: Thu, 23 Apr 2026 21:33:53 +0200 Subject: [PATCH] Refactor: Installer-Reihenfolge korrigiert (Git-Clone zuerst, dann .env/composer/migrate) - composer create-project entfernt (wir klonen das eigene Repo) - .env wird nach dem Clone auf dem echten Codebase gesetzt - composer install, key:generate, migrate und storage:link nach Clone - nodesource curl|bash durch Datei-Download ersetzt (stdin-safe) Co-Authored-By: Claude Sonnet 4.6 --- installer.sh | 92 ++++++++++++++++++++++++++++------------------------ 1 file changed, 49 insertions(+), 43 deletions(-) diff --git a/installer.sh b/installer.sh index 84b2e1d..8ba8e14 100644 --- a/installer.sh +++ b/installer.sh @@ -462,85 +462,91 @@ while [[ $# -gt 0 ]]; do shift done -# ===== Laravel installieren (als eigener User) ===== -log "Laravel installieren…" -mkdir -p "$(dirname "$APP_DIR")" -chown -R "$APP_USER":$APP_GROUP "$(dirname "$APP_DIR")" - -if [ ! -d "${APP_DIR}" ] || [ -z "$(ls -A "$APP_DIR" 2>/dev/null || true)" ]; then - sudo -u "$APP_USER" -H bash -lc "cd /var/www && COMPOSER_ALLOW_SUPERUSER=0 composer create-project laravel/laravel ${APP_USER} --no-interaction" +# ===== Node/NPM installieren (für Vite/Tailwind Build) ===== +log "Node/NPM installieren…" +if [ "$NODE_SETUP" = "nodesource" ]; then + curl -fsSL https://deb.nodesource.com/setup_22.x -o /tmp/nodesource_setup.sh + bash /tmp/nodesource_setup.sh + rm -f /tmp/nodesource_setup.sh + apt-get install -y nodejs +else + apt-get install -y nodejs npm fi +# ===== Projekt aus Git holen ===== +log "Projekt aus Git klonen…" +mkdir -p "$(dirname "$APP_DIR")" +chown "$APP_USER":$APP_GROUP "$(dirname "$APP_DIR")" + +if [ ! -d "${APP_DIR}/.git" ]; then + rm -rf "${APP_DIR}" + sudo -u "$APP_USER" -H bash -lc "git clone --depth=1 -b ${GIT_BRANCH} ${GIT_REPO} ${APP_DIR}" +else + sudo -u "$APP_USER" -H bash -lc "cd ${APP_DIR} && git fetch --depth=1 origin ${GIT_BRANCH} && git checkout ${GIT_BRANCH} && git pull --ff-only" +fi + +# ===== .env erstellen und befüllen ===== +log ".env konfigurieren…" APP_URL="http://${SERVER_IP}" sudo -u "$APP_USER" -H bash -lc "cd ${APP_DIR} && cp -n .env.example .env || true" -sudo -u "$APP_USER" -H bash -lc "cd ${APP_DIR} && php artisan key:generate --force" -# .env befüllen (MariaDB & Redis Sessions) sed -i "s|^APP_NAME=.*|APP_NAME=${APP_NAME}|g" "${APP_DIR}/.env" sed -i "s|^APP_URL=.*|APP_URL=${APP_URL}|g" "${APP_DIR}/.env" sed -i "s|^APP_ENV=.*|APP_ENV=${APP_ENV}|g" "${APP_DIR}/.env" sed -i "s|^APP_DEBUG=.*|APP_DEBUG=${APP_DEBUG}|g" "${APP_DIR}/.env" sed -i "s|^DB_CONNECTION=.*|DB_CONNECTION=mysql|g" "${APP_DIR}/.env" -sed -i -E "s|^[#[:space:]]*DB_HOST=.*|DB_HOST=127.0.0.1|g" "${APP_DIR}/.env" -sed -i -E "s|^[#[:space:]]*DB_PORT=.*|DB_PORT=3306|g" "${APP_DIR}/.env" -sed -i -E "s|^[#[:space:]]*DB_DATABASE=.*|DB_DATABASE=${DB_NAME}|g" "${APP_DIR}/.env" -sed -i -E "s|^[#[:space:]]*DB_USERNAME=.*|DB_USERNAME=${DB_USER}|g" "${APP_DIR}/.env" -sed -i -E "s|^[#[:space:]]*DB_PASSWORD=.*|DB_PASSWORD=${DB_PASS}|g" "${APP_DIR}/.env" +sed -i -E "s|^[#[:space:]]*DB_HOST=.*|DB_HOST=127.0.0.1|g" "${APP_DIR}/.env" +sed -i -E "s|^[#[:space:]]*DB_PORT=.*|DB_PORT=3306|g" "${APP_DIR}/.env" +sed -i -E "s|^[#[:space:]]*DB_DATABASE=.*|DB_DATABASE=${DB_NAME}|g" "${APP_DIR}/.env" +sed -i -E "s|^[#[:space:]]*DB_USERNAME=.*|DB_USERNAME=${DB_USER}|g" "${APP_DIR}/.env" +sed -i -E "s|^[#[:space:]]*DB_PASSWORD=.*|DB_PASSWORD=${DB_PASS}|g" "${APP_DIR}/.env" sed -i "s|^CACHE_DRIVER=.*|CACHE_DRIVER=redis|g" "${APP_DIR}/.env" -sed -i -E "s|^[#[:space:]]*CACHE_PREFIX=.*|CACHE_PREFIX=${APP_USER}|g" "${APP_DIR}/.env" +sed -i -E "s|^[#[:space:]]*CACHE_PREFIX=.*|CACHE_PREFIX=${APP_USER}|g" "${APP_DIR}/.env" sed -i "s|^SESSION_DRIVER=.*|SESSION_DRIVER=redis|g" "${APP_DIR}/.env" sed -i "s|^REDIS_HOST=.*|REDIS_HOST=127.0.0.1|g" "${APP_DIR}/.env" sed -i "s|^REDIS_PASSWORD=.*|REDIS_PASSWORD=null|g" "${APP_DIR}/.env" sed -i "s|^REDIS_PORT=.*|REDIS_PORT=6379|g" "${APP_DIR}/.env" - -# === Bootstrap-Admin für den ersten Login (nur .env, kein DB-User) === +# Bootstrap-Admin für den ersten Login BOOTSTRAP_USER="${APP_USER}" BOOTSTRAP_EMAIL="${APP_USER}@localhost" BOOTSTRAP_PASS="$(openssl rand -base64 18 | LC_ALL=C tr -dc 'A-Za-z0-9' | head -c 12)" BOOTSTRAP_HASH="$(php -r 'echo password_hash($argv[1], PASSWORD_BCRYPT);' "$BOOTSTRAP_PASS")" -grep -q '^SETUP_PHASE=' "${APP_DIR}/.env" || echo "SETUP_PHASE=bootstrap" >> "${APP_DIR}/.env" +grep -q '^SETUP_PHASE=' "${APP_DIR}/.env" \ + || echo "SETUP_PHASE=bootstrap" >> "${APP_DIR}/.env" sed -i "s|^SETUP_PHASE=.*|SETUP_PHASE=bootstrap|g" "${APP_DIR}/.env" -grep -q '^BOOTSTRAP_ADMIN_USER=' "${APP_DIR}/.env" || echo "BOOTSTRAP_ADMIN_USER=${BOOTSTRAP_USER}" >> "${APP_DIR}/.env" +grep -q '^BOOTSTRAP_ADMIN_USER=' "${APP_DIR}/.env" \ + || echo "BOOTSTRAP_ADMIN_USER=${BOOTSTRAP_USER}" >> "${APP_DIR}/.env" sed -i "s|^BOOTSTRAP_ADMIN_USER=.*|BOOTSTRAP_ADMIN_USER=${BOOTSTRAP_USER}|g" "${APP_DIR}/.env" -grep -q '^BOOTSTRAP_ADMIN_EMAIL=' "${APP_DIR}/.env" || echo "BOOTSTRAP_ADMIN_EMAIL=${BOOTSTRAP_EMAIL}" >> "${APP_DIR}/.env" +grep -q '^BOOTSTRAP_ADMIN_EMAIL=' "${APP_DIR}/.env" \ + || echo "BOOTSTRAP_ADMIN_EMAIL=${BOOTSTRAP_EMAIL}" >> "${APP_DIR}/.env" sed -i "s|^BOOTSTRAP_ADMIN_EMAIL=.*|BOOTSTRAP_ADMIN_EMAIL=${BOOTSTRAP_EMAIL}|g" "${APP_DIR}/.env" -grep -q '^BOOTSTRAP_ADMIN_PASSWORD_HASH=' "${APP_DIR}/.env" || echo "BOOTSTRAP_ADMIN_PASSWORD_HASH=${BOOTSTRAP_HASH}" >> "${APP_DIR}/.env" +grep -q '^BOOTSTRAP_ADMIN_PASSWORD_HASH=' "${APP_DIR}/.env" \ + || echo "BOOTSTRAP_ADMIN_PASSWORD_HASH=${BOOTSTRAP_HASH}" >> "${APP_DIR}/.env" sed -i "s|^BOOTSTRAP_ADMIN_PASSWORD_HASH=.*|BOOTSTRAP_ADMIN_PASSWORD_HASH=${BOOTSTRAP_HASH}|g" "${APP_DIR}/.env" -# ===== Node/NPM installieren (für Vite/Tailwind Build) ===== -if [ "$NODE_SETUP" = "nodesource" ]; then - # LTS via NodeSource (empfohlen für aktuelle LTS) - curl -fsSL https://deb.nodesource.com/setup_22.x | bash - - apt-get install -y nodejs -else - # Debian-Repo (ok für Basics, aber u.U. älter) - apt-get install -y nodejs npm -fi +# ===== Composer Dependencies ===== +log "Composer install…" +sudo -u "$APP_USER" -H bash -lc "cd ${APP_DIR} && COMPOSER_ALLOW_SUPERUSER=1 composer install --no-dev --optimize-autoloader --no-interaction" -# ===== Projekt aus Git holen (PLATZHALTER) ===== -# Falls dein Repo später bereitsteht, überschreibt dieser Block das leere/Standard-Laravel. -if [ "${GIT_REPO}" != "https://example.com/your-repo-placeholder.git" ]; then - if [ ! -d "${APP_DIR}/.git" ]; then - rm -rf "${APP_DIR}" - sudo -u "$APP_USER" -H bash -lc "git clone --depth=1 -b ${GIT_BRANCH} ${GIT_REPO} ${APP_DIR}" - else - sudo -u "$APP_USER" -H bash -lc "cd ${APP_DIR} && git fetch --depth=1 origin ${GIT_BRANCH} && git checkout ${GIT_BRANCH} && git pull --ff-only" - fi -fi +# ===== App-Key & Migrations ===== +log "App-Key generieren und Datenbank migrieren…" +sudo -u "$APP_USER" -H bash -lc "cd ${APP_DIR} && php artisan key:generate --force" +sudo -u "$APP_USER" -H bash -lc "cd ${APP_DIR} && php artisan migrate --force" +sudo -u "$APP_USER" -H bash -lc "cd ${APP_DIR} && php artisan storage:link --force || true" -# ===== Frontend Build (nur wenn package.json existiert) ===== +# ===== Frontend Build ===== if [ -f "${APP_DIR}/package.json" ]; then + log "Frontend bauen…" sudo -u "$APP_USER" -H bash -lc "cd ${APP_DIR} && npm ci --no-audit --no-fund || npm install" - # Prod-Build (Vite/Tailwind) - sudo -u "$APP_USER" -H bash -lc "cd ${APP_DIR} && npm run build || npm run build:prod || true" + sudo -u "$APP_USER" -H bash -lc "cd ${APP_DIR} && npm run build" fi