#!/bin/bash # SSH Deploy Key Setup for explore # # Automatisiert: # 1. Erzeugt ein SSH-Schlüsselpaar (nur für Deployment) # 2. Hinterlegt den Public Key auf dem Server # 3. Speichert den Private Key als Gitea Secret via API # # Voraussetzungen: # - ssh-keygen, jq, curl # - SSH-Zugang zum Server (z.B. ~/.ssh/gitea_deploy) # - Gitea API-Token (mit repo-Rechten) # - Repo michaelkole/explore muss bereits existieren # # Usage: ./setup-ssh-deploy.sh set -euo pipefail PROJECT_NAME="explore" SERVER_IP="82.165.92.92" SERVER_USER="root" GITEA_HOST="git.coded.law" GITEA_OWNER="michaelkole" GITEA_REPO="explore" KEY_FILE="$HOME/.ssh/deploy_${PROJECT_NAME}" SECRET_NAME="SSH_PRIVATE_KEY" echo "" echo "SSH Deploy Key Setup für $PROJECT_NAME" echo "========================================" echo "" if [ -z "${GITEA_TOKEN:-}" ]; then echo "Gitea API-Token wird benötigt (mit repo-Rechten)." echo "Erstellen unter: https://$GITEA_HOST/user/settings/applications" echo "" read -rsp "Gitea API-Token: " GITEA_TOKEN echo "" fi if [ -z "$GITEA_TOKEN" ]; then echo "Fehler: Kein Token angegeben." exit 1 fi echo "Prüfe Gitea-Zugang..." HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" \ -H "Authorization: token $GITEA_TOKEN" \ "https://$GITEA_HOST/api/v1/repos/$GITEA_OWNER/$GITEA_REPO") if [ "$HTTP_CODE" != "200" ]; then echo "Fehler: Gitea API antwortet mit HTTP $HTTP_CODE." echo "Prüfe Token und Repo-Pfad: $GITEA_OWNER/$GITEA_REPO" echo "Repo ggf. zuerst anlegen unter https://$GITEA_HOST/repo/create" exit 1 fi echo " Gitea OK" if [ -f "$KEY_FILE" ]; then echo "" echo "SSH Key existiert bereits: $KEY_FILE" read -rp "Überschreiben? (j/N) " OVERWRITE if [[ ! "$OVERWRITE" =~ ^[jJyY]$ ]]; then echo "Verwende bestehenden Key." else rm -f "$KEY_FILE" "$KEY_FILE.pub" fi fi if [ ! -f "$KEY_FILE" ]; then echo "Erzeuge SSH-Schlüsselpaar..." ssh-keygen -t ed25519 -C "deploy@$PROJECT_NAME" -f "$KEY_FILE" -N "" chmod 600 "$KEY_FILE" echo " Key erzeugt: $KEY_FILE" fi echo "" echo "Hinterlege Public Key auf $SERVER_USER@$SERVER_IP..." SSH_OPTS="-o StrictHostKeyChecking=accept-new -o ConnectTimeout=5" EXISTING_KEY="" if ! ssh $SSH_OPTS -o BatchMode=yes "$SERVER_USER@$SERVER_IP" "true" 2>/dev/null; then echo " Direkter SSH-Zugang nicht möglich (nur Key-Auth?)." echo " Suche bestehenden SSH-Key..." for candidate in ~/.ssh/id_ed25519 ~/.ssh/id_rsa ~/.ssh/gitea_deploy; do if [ -f "$candidate" ] && ssh -i "$candidate" $SSH_OPTS -o BatchMode=yes "$SERVER_USER@$SERVER_IP" "true" 2>/dev/null; then EXISTING_KEY="$candidate" echo " Gefunden: $candidate" break fi done if [ -z "$EXISTING_KEY" ]; then echo "" echo " Kein funktionierender SSH-Key gefunden." echo " Bitte manuell:" echo " cat $KEY_FILE.pub | ssh -i ~/.ssh/gitea_deploy $SERVER_USER@$SERVER_IP 'cat >> ~/.ssh/authorized_keys'" exit 1 fi fi if [ -n "$EXISTING_KEY" ]; then ssh -i "$EXISTING_KEY" "$SERVER_USER@$SERVER_IP" "mkdir -p ~/.ssh && chmod 700 ~/.ssh" cat "$KEY_FILE.pub" | ssh -i "$EXISTING_KEY" "$SERVER_USER@$SERVER_IP" "cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys" else ssh "$SERVER_USER@$SERVER_IP" "mkdir -p ~/.ssh && chmod 700 ~/.ssh" cat "$KEY_FILE.pub" | ssh "$SERVER_USER@$SERVER_IP" "cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys" fi echo " Public Key auf Server hinterlegt" echo "Teste SSH-Verbindung mit Deploy Key..." if ssh -i "$KEY_FILE" $SSH_OPTS -o BatchMode=yes "$SERVER_USER@$SERVER_IP" "echo 'SSH OK'" 2>/dev/null; then echo " SSH-Verbindung OK" else echo " WARNUNG: SSH-Test fehlgeschlagen. Prüfe authorized_keys auf dem Server." fi if ! command -v jq &>/dev/null; then echo "Fehler: jq fehlt (brew install jq)." exit 1 fi echo "" echo "Speichere Private Key als Gitea Secret '$SECRET_NAME'..." PRIVATE_KEY_CONTENT=$(cat "$KEY_FILE") HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" \ -X PUT \ -H "Authorization: token $GITEA_TOKEN" \ -H "Content-Type: application/json" \ -d "{\"data\": $(echo "$PRIVATE_KEY_CONTENT" | jq -Rs .)}" \ "https://$GITEA_HOST/api/v1/repos/$GITEA_OWNER/$GITEA_REPO/actions/secrets/$SECRET_NAME") if [ "$HTTP_CODE" = "201" ] || [ "$HTTP_CODE" = "204" ]; then echo " Secret '$SECRET_NAME' gespeichert" else echo " Fehler: Gitea API antwortet mit HTTP $HTTP_CODE" echo " Manuell: https://$GITEA_HOST/$GITEA_OWNER/$GITEA_REPO/settings/actions/secrets" exit 1 fi echo "" echo "========================================" echo "SSH Deploy Key Setup abgeschlossen!" echo "========================================" echo "" echo " Private Key: $KEY_FILE" echo " Public Key: $KEY_FILE.pub" echo " Server: $SERVER_USER@$SERVER_IP" echo " Gitea Secret: $SECRET_NAME ($GITEA_OWNER/$GITEA_REPO)" echo ""