diff --git a/scripts/apache-einkauf-debian-setup.sh b/scripts/apache-einkauf-debian-setup.sh new file mode 100644 index 0000000..367b731 --- /dev/null +++ b/scripts/apache-einkauf-debian-setup.sh @@ -0,0 +1,107 @@ +#!/usr/bin/env bash +# +# Einmaliges Setup auf Debian mit Apache: DocumentRoot /web/einkauf/html, Host einkauf.pauker.at +# +# Voraussetzungen: +# - Root oder sudo +# - Laravel-Projekt liegt unter APP_ROOT (Standard: /web/einkauf), mit Unterordner "public" +# - DNS: einkauf.pauker.at zeigt auf diese Maschine +# +# Nutzung: +# sudo bash scripts/apache-einkauf-debian-setup.sh +# sudo APP_ROOT=/pfad/zur/app bash scripts/apache-einkauf-debian-setup.sh +# +# Danach (TLS): +# sudo certbot --apache -d einkauf.pauker.at +# +# App-Deploy (Composer, npm, migrate) siehe deploy.sh im Projektroot. +# +set -euo pipefail + +APP_ROOT="${APP_ROOT:-/web/einkauf}" +DOMAIN="${DOMAIN:-einkauf.pauker.at}" +DOCROOT="${DOCROOT:-${APP_ROOT}/html}" +PUBLIC_DIR="${APP_ROOT}/public" +SITE_CONF="/etc/apache2/sites-available/${DOMAIN}.conf" + +if [[ "${EUID:-0}" -ne 0 ]]; then + echo "Bitte mit sudo oder als root ausfuehren." >&2 + exit 1 +fi + +if ! command -v apache2ctl >/dev/null 2>&1; then + echo "Apache (apache2) ist nicht installiert. Zuerst: apt install apache2" >&2 + exit 1 +fi + +echo "==> Apache-Module: rewrite, ssl" +a2enmod rewrite +a2enmod ssl + +echo "==> App-Verzeichnis pruefen: ${APP_ROOT}" +if [[ ! -d "${APP_ROOT}" ]]; then + mkdir -p "${APP_ROOT}" + echo " Hinweis: ${APP_ROOT} war neu angelegt. Laravel-Code hierher legen (git clone / rsync)." +fi + +if [[ ! -f "${APP_ROOT}/artisan" ]]; then + echo "WARNUNG: ${APP_ROOT}/artisan nicht gefunden – ist das Laravel-Root? Fortfahren trotzdem (Symlink/Apache)." >&2 +fi + +if [[ ! -d "${PUBLIC_DIR}" ]]; then + echo "FEHLER: ${PUBLIC_DIR} fehlt. Laravel braucht den Ordner 'public'." >&2 + exit 1 +fi + +echo "==> DocumentRoot: ${DOCROOT} -> Symlink auf ${PUBLIC_DIR}" +if [[ -e "${DOCROOT}" && ! -L "${DOCROOT}" ]]; then + if [[ -d "${DOCROOT}" ]] && [[ -z "$(ls -A "${DOCROOT}" 2>/dev/null)" ]]; then + rmdir "${DOCROOT}" + else + echo "FEHLER: ${DOCROOT} existiert und ist kein Symlink (und nicht leer). Bitte umbenennen/entfernen." >&2 + exit 1 + fi +fi +ln -sfn "${PUBLIC_DIR}" "${DOCROOT}" +echo " OK: $(ls -la "${DOCROOT}")" + +echo "==> VirtualHost schreiben: ${SITE_CONF}" +cat >"${SITE_CONF}" < + ServerName ${DOMAIN} + DocumentRoot ${DOCROOT} + + + Options -Indexes +FollowSymLinks + AllowOverride All + Require all granted + + + ErrorLog \${APACHE_LOG_DIR}/${DOMAIN}-error.log + CustomLog \${APACHE_LOG_DIR}/${DOMAIN}-access.log combined + +EOF + +echo "==> Site aktivieren" +a2ensite "$(basename "${SITE_CONF}")" + +echo "==> Konfiguration testen" +apachectl configtest + +echo "==> Apache neu laden" +systemctl reload apache2 + +echo "" +echo "Fertig (HTTP)." +echo "" +echo "Naechste Schritte:" +echo " 1) TLS: sudo certbot --apache -d ${DOMAIN}" +echo " (passt SSL-Zertifikat und leitet HTTP->HTTPS an; Pfade in sites-available werden ergaenzt)" +echo " 2) App: cd ${APP_ROOT} && cp .env.example .env && php artisan key:generate" +echo " Dann .env (APP_URL=https://${DOMAIN}, DB, MAIL) und:" +echo " composer install --no-dev && npm ci && npm run build && php artisan migrate --force && php artisan storage:link" +echo " 3) Rechte: chown -R www-data:www-data ${APP_ROOT}/storage ${APP_ROOT}/bootstrap/cache" +echo ""