auto deployment und tests

This commit is contained in:
Christoph K.
2026-03-20 07:07:38 +01:00
parent 0e7aa3e7f2
commit 8163f906cc
12 changed files with 500 additions and 66 deletions

100
deploy.sh Executable file
View File

@@ -0,0 +1,100 @@
#!/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 mit -S
sudo_cmd() {
ssh_cmd "echo '${SUDO_PASS}' | sudo -S $*"
}
# ── 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}..."
ssh_cmd "mkdir -p '${DEPLOY_DIR}'"
echo "🚀 Übertrage Binary..."
scp_cmd bin/discord-linux "${DEPLOY_USER}@${DEPLOY_HOST}:${DEPLOY_DIR}/discord"
ssh_cmd "chmod +x '${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'"