genten anpassungen

This commit is contained in:
Christoph K.
2026-03-24 08:05:24 +01:00
parent ee7b4cc74f
commit aa2a2d99ba
10 changed files with 122 additions and 86 deletions

View File

@@ -1,5 +1,5 @@
#!/usr/bin/env bash
# deploy.sh Baut den Bot und deployt ihn per SSH auf den Server
# deploy.sh Baut Binary lokal (cross-compile) und deployt es per scp auf den Server
set -euo pipefail
# Credentials aus deploy.env laden
@@ -14,8 +14,6 @@ source "$ENV_FILE"
: "${DEPLOY_USER:?DEPLOY_USER fehlt in deploy.env}"
: "${DEPLOY_PASS:?DEPLOY_PASS fehlt in deploy.env}"
: "${DEPLOY_DIR:=/home/${DEPLOY_USER}/brain-bot}"
: "${SERVICE_NAME:=brain-bot}"
: "${DEPLOY_CONFIG:=true}"
# Sudo-Passwort: standardmäßig gleich wie SSH-Passwort
SUDO_PASS="${SUDO_PASS:-$DEPLOY_PASS}"
@@ -35,73 +33,51 @@ scp_cmd() {
sshpass -p "$DEPLOY_PASS" scp $SSH_OPTS "$@"
}
# sudo ohne TTY: Passwort per stdin (-S), -p '' unterdrückt den Prompt auf stderr
sudo_cmd() {
ssh_cmd "echo '${SUDO_PASS}' | sudo -S -p '' $*"
}
# ── Build ────────────────────────────────────────────────────────────────────
echo "🔨 Baue Linux-Binary (amd64)..."
GOOS=linux GOARCH=amd64 go build -o bin/discord-linux ./cmd/discord/
echo "✅ Binary gebaut"
# ── Lokaler Cross-Compile-Build ─────────────────────────────────────────────
echo "🔨 Baue Linux/amd64-Binary lokal..."
mkdir -p bin
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o bin/discord-bot ./cmd/discord/
echo "✅ Binary gebaut: bin/discord-bot"
# ── Systemd-Service deaktivieren (einmalige Migration) ──────────────────────
if ssh_cmd "systemctl is-enabled --quiet brain-bot 2>/dev/null"; then
echo "🔄 Migriere von systemd zu Docker..."
sudo_cmd "systemctl stop brain-bot" 2>/dev/null || true
sudo_cmd "systemctl disable brain-bot" 2>/dev/null || true
echo "✅ Systemd-Service deaktiviert"
fi
# ── Alten Container stoppen ─────────────────────────────────────────────────
echo "⏹️ Stoppe laufenden Container..."
ssh_cmd "cd '${DEPLOY_DIR}' && docker compose down 2>/dev/null" || true
echo "✅ Container gestoppt"
# ── Zielverzeichnis anlegen ─────────────────────────────────────────────────
echo "📁 Stelle Zielverzeichnis sicher: ${DEPLOY_DIR}..."
ssh_cmd "mkdir -p '${DEPLOY_DIR}'"
# ── Dateien übertragen ───────────────────────────────────────────────────────
echo "📁 Zielverzeichnis ${DEPLOY_DIR} auf ${DEPLOY_HOST}..."
if ! ssh_cmd "mkdir -p ${DEPLOY_DIR}"; then
echo "❌ Verzeichnis konnte nicht erstellt werden prüfe Rechte auf ${DEPLOY_HOST}"
exit 1
fi
echo "📦 Übertrage Binary..."
scp_cmd bin/discord-bot "${DEPLOY_USER}@${DEPLOY_HOST}:${DEPLOY_DIR}/discord-bot"
echo "🚀 Übertrage Binary..."
# Als temporäre Datei hochladen, dann atomar ersetzen (laufendes Binary kann nicht überschrieben werden)
if ! scp_cmd bin/discord-linux "${DEPLOY_USER}@${DEPLOY_HOST}:${DEPLOY_DIR}/discord.new"; then
echo "❌ SCP fehlgeschlagen"
exit 1
fi
ssh_cmd "chmod +x '${DEPLOY_DIR}/discord.new' && mv '${DEPLOY_DIR}/discord.new' '${DEPLOY_DIR}/discord'"
echo "📋 Übertrage Dockerfile + docker-compose.yml..."
scp_cmd Dockerfile docker-compose.yml "${DEPLOY_USER}@${DEPLOY_HOST}:${DEPLOY_DIR}/"
if [[ "$DEPLOY_CONFIG" == "true" ]]; then
echo "📋 Übertrage config.yml..."
scp_cmd config.yml "${DEPLOY_USER}@${DEPLOY_HOST}:${DEPLOY_DIR}/config.yml"
fi
echo "📋 Übertrage config.yml..."
scp_cmd config.yml "${DEPLOY_USER}@${DEPLOY_HOST}:${DEPLOY_DIR}/config.yml"
# ── Systemd-Service ──────────────────────────────────────────────────────────
SERVICE_FILE="/etc/systemd/system/${SERVICE_NAME}.service"
# tasks.json anlegen falls nicht vorhanden (Volume-Mount braucht existierende Datei)
ssh_cmd "test -f '${DEPLOY_DIR}/tasks.json' || echo '[]' > '${DEPLOY_DIR}/tasks.json'"
if ! ssh_cmd "test -f '${SERVICE_FILE}'" 2>/dev/null; then
echo "📝 Installiere systemd-Service..."
# Service-Datei zuerst in /tmp schreiben (kein sudo nötig), dann verschieben
TMP_SERVICE="/tmp/${SERVICE_NAME}.service"
ssh_cmd "cat > '${TMP_SERVICE}'" <<EOF
[Unit]
Description=my-brain-importer Discord Bot
After=network.target
[Service]
ExecStart=${DEPLOY_DIR}/discord
WorkingDirectory=${DEPLOY_DIR}
Restart=on-failure
RestartSec=5s
User=${DEPLOY_USER}
[Install]
WantedBy=multi-user.target
EOF
sudo_cmd "mv '${TMP_SERVICE}' '${SERVICE_FILE}'"
sudo_cmd "systemctl daemon-reload"
sudo_cmd "systemctl enable '${SERVICE_NAME}'"
echo "✅ Service installiert und aktiviert"
fi
# ── Neustart ─────────────────────────────────────────────────────────────────
echo "🔄 Starte Service neu..."
# unmask falls der Service als masked markiert ist
sudo_cmd "systemctl unmask '${SERVICE_NAME}'" 2>/dev/null || true
sudo_cmd "systemctl restart '${SERVICE_NAME}'"
# ── Docker-Image auf Server bauen und starten ────────────────────────────────
echo "🚀 Baue Image und starte Container..."
ssh_cmd "cd '${DEPLOY_DIR}' && docker compose up -d --build"
echo ""
echo "✅ Deployment abgeschlossen!"
echo " Status: ssh ${DEPLOY_USER}@${DEPLOY_HOST} 'systemctl status ${SERVICE_NAME}'"
echo " Logs: ssh ${DEPLOY_USER}@${DEPLOY_HOST} 'journalctl -u ${SERVICE_NAME} -f'"
echo " Status: ssh ${DEPLOY_USER}@${DEPLOY_HOST} 'cd ${DEPLOY_DIR} && docker compose ps'"
echo " Logs: ssh ${DEPLOY_USER}@${DEPLOY_HOST} 'cd ${DEPLOY_DIR} && docker compose logs -f'"