#!/usr/bin/env bash # deploy.sh – Baut den Bot und deployt ihn per SSH auf den Server set -euo pipefail # Credentials aus deploy.env laden ENV_FILE="$(dirname "$0")/deploy.env" if [[ ! -f "$ENV_FILE" ]]; then echo "❌ deploy.env nicht gefunden. Kopiere deploy.env.example nach deploy.env und passe sie an." exit 1 fi source "$ENV_FILE" : "${DEPLOY_HOST:?DEPLOY_HOST fehlt in deploy.env}" : "${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}" SSH_OPTS="-o StrictHostKeyChecking=no -o BatchMode=no" if ! command -v sshpass &>/dev/null; then echo "❌ sshpass nicht installiert: sudo apt install sshpass" exit 1 fi ssh_cmd() { sshpass -p "$DEPLOY_PASS" ssh $SSH_OPTS "${DEPLOY_USER}@${DEPLOY_HOST}" "$@" } 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" # ── 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..." # 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'" if [[ "$DEPLOY_CONFIG" == "true" ]]; then echo "📋 Übertrage config.yml..." scp_cmd config.yml "${DEPLOY_USER}@${DEPLOY_HOST}:${DEPLOY_DIR}/config.yml" fi # ── Systemd-Service ────────────────────────────────────────────────────────── SERVICE_FILE="/etc/systemd/system/${SERVICE_NAME}.service" 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}'" </dev/null || true sudo_cmd "systemctl restart '${SERVICE_NAME}'" 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'"