diff --git a/setup.sh b/setup.sh new file mode 100644 index 0000000..b230a1d --- /dev/null +++ b/setup.sh @@ -0,0 +1,128 @@ +#!/bin/bash +# setup.sh — онбординг: настройка SSH для работы с git.lokeo.ru через Vault +# Запуск: curl -sL https://git.lokeo.ru/infra/git-ssh-setup/raw/branch/main/setup.sh | bash + +set -euo pipefail + +echo "=== Настройка SSH для git.lokeo.ru ===" +echo "" + +# --- 1. Проверка зависимостей --- + +for cmd in vault jq ssh-keygen; do + if ! command -v "$cmd" &>/dev/null; then + echo "❌ Не найден: $cmd" + case "$cmd" in + vault) echo " Установи: https://developer.hashicorp.com/vault/install" ;; + jq) echo " Установи: sudo apt install jq / brew install jq" ;; + esac + exit 1 + fi +done +echo "✅ Зависимости: vault, jq, ssh-keygen" + +# --- 2. SSH-ключ --- + +KEY="$HOME/.ssh/id_ed25519" +if [[ ! -f "$KEY" ]]; then + echo "🔑 SSH-ключ не найден, генерирую..." + ssh-keygen -t ed25519 -f "$KEY" -N "" -C "$(whoami)@$(hostname)" +fi +echo "✅ SSH-ключ: $KEY" + +# --- 3. Скрипт обновления сертификата --- + +SCRIPT_DIR="$HOME/.local/bin" +SCRIPT="$SCRIPT_DIR/vault-ssh-renew.sh" +mkdir -p "$SCRIPT_DIR" + +SCRIPT_URL="https://git.lokeo.ru/infra/git-ssh-setup/raw/branch/main/vault-ssh-renew.sh" +if curl -sfL "$SCRIPT_URL" -o "$SCRIPT" 2>/dev/null; then + chmod +x "$SCRIPT" + echo "✅ Скрипт: $SCRIPT (скачан с git.lokeo.ru)" +else + echo "⚠️ Не удалось скачать скрипт, копирую встроенную версию..." + # Fallback — скрипт уже должен быть рядом + if [[ -f "$(dirname "$0")/vault-ssh-renew.sh" ]]; then + cp "$(dirname "$0")/vault-ssh-renew.sh" "$SCRIPT" + chmod +x "$SCRIPT" + echo "✅ Скрипт: $SCRIPT (из локальной копии)" + else + echo "❌ vault-ssh-renew.sh не найден" + exit 1 + fi +fi + +# --- 4. SSH config --- + +SSH_CONFIG="$HOME/.ssh/config" +MARKER="# --- git.lokeo.ru (auto-managed) ---" + +if grep -qF "$MARKER" "$SSH_CONFIG" 2>/dev/null; then + echo "✅ SSH config: уже настроен" +else + mkdir -p "$HOME/.ssh" + cat >> "$SSH_CONFIG" </dev/null; then + echo '' >> "$SHELL_RC" + echo 'export VAULT_ADDR=https://vault.lokeo.ru' >> "$SHELL_RC" + echo "✅ VAULT_ADDR добавлен в $SHELL_RC" +else + echo "✅ VAULT_ADDR: уже настроен" +fi + +export VAULT_ADDR=https://vault.lokeo.ru + +# --- 6. Первый логин --- + +echo "" +echo "=== Первый вход ===" +echo "Сейчас откроется браузер для авторизации через Authentik." +echo "" +read -p "Нажми Enter для продолжения..." _ + +vault login -method=oidc role=reader -no-print || { + echo "❌ Логин не удался" + exit 1 +} + +# --- 7. Первый сертификат --- + +USERNAME=$(vault token lookup -format=json | jq -r '.data.display_name') +vault write -field=signed_key \ + ssh-client-signer/sign/git-user \ + public_key=@"$KEY.pub" \ + valid_principals="$USERNAME" \ + > "$KEY-cert.pub" + +echo "" +echo "✅ SSH-сертификат получен для $USERNAME" +ssh-keygen -Lf "$KEY-cert.pub" 2>/dev/null | grep -E "Type|Valid|Principals" + +echo "" +echo "=== Готово! ===" +echo "" +echo "Теперь можно работать с git:" +echo " git clone ssh://git@git.lokeo.ru:222/org/repo.git" +echo " git push origin main" +echo "" +echo "Сертификат обновляется автоматически при каждом подключении." +echo "Vault token живёт 8 часов — после истечения откроется браузер."