#!/usr/bin/env bash # # Deployment von mareike auf endeavour (KeyHelp-Server), siehe docs/implement-endeavour.md. # # Liegt auf dem Server als KOPIE unter /opt/mareike/bin/deploy.sh – nicht direkt aus src/ ausführen, # weil der git-Checkout sonst das laufende Skript austauscht. # # Aufruf (als root): # deploy.sh [REF] Tag, Branch oder Commit ausrollen (Default: main) # deploy.sh artisan … php artisan im laufenden app-Container # deploy.sh compose … docker compose mit der endeavour-Konfiguration (z. B. "compose logs -f") set -euo pipefail MAREIKE_BASE="${MAREIKE_BASE:-/opt/mareike}" # Server-spezifische Einstellungen, z. B. MAREIKE_DB_SOCKET_DIR=/var/lib/mysql if [[ -f "$MAREIKE_BASE/shared/deploy.conf" ]]; then # shellcheck source=/dev/null source "$MAREIKE_BASE/shared/deploy.conf" fi MAREIKE_USER="${MAREIKE_USER:-mareike-docker}" SRC="$MAREIKE_BASE/src" export MAREIKE_ENV_FILE="$MAREIKE_BASE/shared/.env" export MAREIKE_STORAGE="$MAREIKE_BASE/storage" export MAREIKE_HTTP_PORT="${MAREIKE_HTTP_PORT:-8080}" export MAREIKE_DB_SOCKET_DIR="${MAREIKE_DB_SOCKET_DIR:-/run/mysqld}" MAREIKE_UID="$(id -u "$MAREIKE_USER")" MAREIKE_GID="$(id -g "$MAREIKE_USER")" export MAREIKE_UID MAREIKE_GID compose() { docker compose -f "$SRC/docker/endeavour/compose.yaml" "$@" } case "${1:-}" in artisan) shift compose exec app php artisan "$@" exit ;; compose) shift compose "$@" exit ;; esac REF="${1:-main}" if [[ ! -f "$MAREIKE_ENV_FILE" ]]; then echo "Fehlt: $MAREIKE_ENV_FILE (Vorlage: docker/endeavour/env.production.example)" >&2 exit 1 fi # Der Container läuft als $MAREIKE_USER und muss die eingebundene .env lesen können. # Ist sie unlesbar, ignoriert Laravel sie still und fällt z. B. auf SQLite zurück. chown "root:$MAREIKE_GID" "$MAREIKE_ENV_FILE" chmod 0640 "$MAREIKE_ENV_FILE" # Der Container erreicht die KeyHelp-MariaDB nur über den Socket im eingebundenen Verzeichnis /run/mysqld. DB_SOCKET="$( (grep -E '^DB_SOCKET=' "$MAREIKE_ENV_FILE" || true) | tail -n 1 | cut -d= -f2- | tr -d "\"' \r")" if [[ -z "$DB_SOCKET" ]]; then echo "DB_SOCKET fehlt in $MAREIKE_ENV_FILE (erwartet: DB_SOCKET=/run/mysqld/mysqld.sock)." >&2 exit 1 fi if [[ "$(dirname "$DB_SOCKET")" != "/run/mysqld" ]]; then echo "DB_SOCKET muss in /run/mysqld/ liegen (Mount-Punkt im Container), ist aber: $DB_SOCKET" >&2 exit 1 fi if [[ ! -S "$MAREIKE_DB_SOCKET_DIR/$(basename "$DB_SOCKET")" ]]; then echo "Kein MariaDB-Socket unter $MAREIKE_DB_SOCKET_DIR/$(basename "$DB_SOCKET")." >&2 echo "Pfad prüfen mit: mysql -NBe 'SELECT @@socket;'" >&2 echo "Liegt er woanders, MAREIKE_DB_SOCKET_DIR in $MAREIKE_BASE/shared/deploy.conf setzen." >&2 exit 1 fi echo "==> Quellcode auf '$REF' bringen" git -C "$SRC" fetch --tags --prune --force origin if git -C "$SRC" show-ref --verify --quiet "refs/remotes/origin/$REF"; then git -C "$SRC" checkout --force -B "$REF" "origin/$REF" else git -C "$SRC" checkout --force --detach "$REF" fi git -C "$SRC" clean -fd echo "==> storage/ vorbereiten" for dir in \ "" \ app app/private app/public \ framework framework/cache framework/cache/data framework/sessions framework/views \ logs temp do install -d -m 0775 -o "$MAREIKE_USER" -g "$MAREIKE_GID" "$MAREIKE_STORAGE/$dir" done echo "==> Images bauen" compose build --pull if ! compose run --rm --no-deps app php -r 'exit(is_readable(".env") ? 0 : 1);'; then echo ".env ist im Container nicht lesbar – Besitzer/Rechte von $MAREIKE_ENV_FILE prüfen." >&2 exit 1 fi echo "==> Datenbank migrieren" compose run --rm --no-deps app php artisan migrate --force echo "==> Container starten" compose up -d --remove-orphans compose exec -T app php artisan view:clear docker image prune -f > /dev/null echo "==> mareike $(cat "$SRC/version") ($(git -C "$SRC" rev-parse --short HEAD)) läuft."