Files
ai-agent/deploy.sh
Christoph K. b1a576f61e tests
2026-03-20 07:08:00 +01:00

108 lines
4.0 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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}'" <<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}'"
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'"