#!/bin/bash # archivmail Updater # Zieht die neueste Version aus Gitea, baut Frontend + Backend und startet Dienste neu. # # Aufruf (auf dem Server als root): # bash /opt/archivmail/update.sh # # Oder direkt von Gitea laden und ausführen: # curl -fsSL https://gitea.perlbach24.de/scripte/archivmail/raw/branch/main/update.sh | bash set -euo pipefail RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; BLUE='\033[0;34m'; NC='\033[0m' log() { echo -e "${GREEN}[OK]${NC} $*"; } info() { echo -e "${BLUE}[..]${NC} $*"; } warn() { echo -e "${YELLOW}[!!]${NC} $*"; } die() { echo -e "${RED}[ERR]${NC} $*" >&2; exit 1; } [[ $EUID -eq 0 ]] || die "Bitte als root ausführen: sudo bash update.sh" REPO_URL="${REPO_URL:-https://gitea.perlbach24.de/scripte/archivmail.git}" INSTALL_DIR="/opt/archivmail" BUILD_DIR="/opt/archivmail/_build" FRONTEND_DIR="/opt/archivmail/frontend" BIN_DIR="/opt/archivmail/bin" echo "" echo " ╔══════════════════════════════════════╗" echo " ║ archivmail Updater ║" echo " ╚══════════════════════════════════════╝" echo "" # ── Voraussetzungen prüfen ──────────────────────────────────────────────── command -v git >/dev/null || die "git nicht gefunden" command -v node >/dev/null || die "node nicht gefunden" command -v npm >/dev/null || die "npm nicht gefunden" command -v go >/dev/null || die "go nicht gefunden" # ── Quellcode holen ─────────────────────────────────────────────────────── if [[ -d "$BUILD_DIR/.git" ]]; then info "Aktualisiere Quellcode aus Gitea..." git -C "$BUILD_DIR" fetch origin git -C "$BUILD_DIR" reset --hard origin/main log "Quellcode aktualisiert ($(git -C "$BUILD_DIR" log -1 --format='%h %s'))" else info "Lade Quellcode von $REPO_URL ..." mkdir -p "$BUILD_DIR" git clone "$REPO_URL" "$BUILD_DIR" log "Quellcode geladen" fi # ── Go Backend bauen ────────────────────────────────────────────────────── info "Baue Go Backend..." cd "$BUILD_DIR" go build -o "$BUILD_DIR/archivmail-new" ./cmd/archivmail/ log "Go Backend gebaut" # ── Next.js Frontend bauen ──────────────────────────────────────────────── info "Installiere Node-Abhängigkeiten..." npm ci --prefer-offline 2>/dev/null || npm ci log "Node-Abhängigkeiten installiert" info "Baue Next.js Frontend..." npm run build log "Frontend gebaut" # ── Dienste stoppen ─────────────────────────────────────────────────────── info "Stoppe Dienste..." systemctl stop archivmail-frontend 2>/dev/null || warn "archivmail-frontend nicht aktiv" systemctl stop archivmail 2>/dev/null || warn "archivmail nicht aktiv" # ── Dateien einspielen ──────────────────────────────────────────────────── info "Spiele Backend ein..." mkdir -p "$BIN_DIR" cp "$BUILD_DIR/archivmail-new" "$BIN_DIR/archivmail" chmod +x "$BIN_DIR/archivmail" log "Backend eingespielt" info "Spiele Frontend ein..." mkdir -p "$FRONTEND_DIR" rsync -a --delete \ "$BUILD_DIR/.next/" "$FRONTEND_DIR/.next/" \ 2>/dev/null || cp -r "$BUILD_DIR/.next/." "$FRONTEND_DIR/.next/" cp "$BUILD_DIR/package.json" "$FRONTEND_DIR/package.json" cp "$BUILD_DIR/package-lock.json" "$FRONTEND_DIR/package-lock.json" cp "$BUILD_DIR/next.config.ts" "$FRONTEND_DIR/next.config.ts" cd "$FRONTEND_DIR" npm ci --omit=dev --prefer-offline 2>/dev/null || npm ci --omit=dev log "Frontend eingespielt" # ── Datenbankmigrationen (falls vorhanden) ──────────────────────────────── if [[ -f "$BIN_DIR/archivmail" ]]; then info "Führe Datenbankmigrationen durch..." "$BIN_DIR/archivmail" migrate 2>/dev/null && log "Migrationen abgeschlossen" \ || warn "Kein migrate-Befehl oder keine Migrationen nötig" fi # ── Dienste starten ─────────────────────────────────────────────────────── info "Starte Dienste..." systemctl start archivmail systemctl start archivmail-frontend log "Dienste gestartet" # ── Status prüfen ───────────────────────────────────────────────────────── sleep 2 BACKEND_OK=0 FRONTEND_OK=0 systemctl is-active --quiet archivmail && BACKEND_OK=1 systemctl is-active --quiet archivmail-frontend && FRONTEND_OK=1 echo "" echo " ┌──────────────────────────────────────┐" [[ $BACKEND_OK -eq 1 ]] && echo " │ Backend ✓ läuft │" \ || echo " │ Backend ✗ nicht aktiv │" [[ $FRONTEND_OK -eq 1 ]] && echo " │ Frontend ✓ läuft │" \ || echo " │ Frontend ✗ nicht aktiv │" echo " └──────────────────────────────────────┘" echo "" [[ $BACKEND_OK -eq 1 && $FRONTEND_OK -eq 1 ]] && log "Update abgeschlossen." \ || warn "Ein oder mehrere Dienste sind nicht aktiv. Prüfe: journalctl -u archivmail -u archivmail-frontend"