auto deployment und tests
This commit is contained in:
100
deploy.sh
Executable file
100
deploy.sh
Executable 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'"
|
||||
Reference in New Issue
Block a user