genten anpassungen
This commit is contained in:
96
deploy.sh
96
deploy.sh
@@ -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'"
|
||||
|
||||
Reference in New Issue
Block a user