Files
archivmail/update.sh
T
sysops 9cc540a880 fix(deploy): update.sh an tatsächliche Server-Struktur anpassen
- FRONTEND_DIR: /opt/archivmail/frontend → /opt/archivmail/web
- Go Build: CGO_ENABLED=1 -tags xapian -buildvcs=false (Xapian-Support)
- Frontend: standalone-Output deployen statt .next/ direkt
- Services: archivmail-frontend → archivmail-web

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-17 02:01:07 +01:00

131 lines
5.8 KiB
Bash
Executable File

#!/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/web"
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"
CGO_ENABLED=1 go build -tags xapian -buildvcs=false -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-web 2>/dev/null || warn "archivmail-web 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"
ln -sf "$BIN_DIR/archivmail" /usr/local/bin/archivmail
log "Backend eingespielt"
info "Spiele Frontend ein (standalone)..."
mkdir -p "$FRONTEND_DIR"
rsync -a --delete "$BUILD_DIR/.next/standalone/" "$FRONTEND_DIR/"
mkdir -p "$FRONTEND_DIR/.next/static"
rsync -a --delete "$BUILD_DIR/.next/static/" "$FRONTEND_DIR/.next/static/"
if [[ -d "$BUILD_DIR/public" ]]; then
rsync -a --delete "$BUILD_DIR/public/" "$FRONTEND_DIR/public/"
fi
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-web
log "Dienste gestartet"
# ── Status prüfen ─────────────────────────────────────────────────────────
sleep 2
BACKEND_OK=0
FRONTEND_OK=0
systemctl is-active --quiet archivmail && BACKEND_OK=1 || true
systemctl is-active --quiet archivmail-web && FRONTEND_OK=1 || true
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-web"