#!/usr/bin/env bash # scripts/deploy.sh — деплой кода на удалённый сервер через rsync + ssh. # # Использование: # ./scripts/deploy.sh user@server /opt/transcription # SERVER=user@server REMOTE_DIR=/opt/transcription ./scripts/deploy.sh # # Что делает: # 1) rsync кода (исключая models, processed, uploads, data, tmp, .git, migrate) # 2) Копирует .env (на текущем этапе — целиком с ключами; позже — Vault) # 3) По SSH запускает на сервере: make pull-models && make up # # Переменные окружения: # SERVER — user@host (обязательно) # REMOTE_DIR — путь на сервере (по умолчанию /opt/transcription) # WITH_ENV — если "1", копирует локальный .env на сервер (по умолчанию 1) # MODELS_SOURCE — путь к моделям (если пусто — на сервере попробует fallback) set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" SERVER="${1:-${SERVER:-}}" REMOTE_DIR="${2:-${REMOTE_DIR:-/opt/transcription}}" WITH_ENV="${WITH_ENV:-1}" if [ -z "$SERVER" ]; then echo "Usage: $0 user@server [/opt/transcription]" >&2 echo "Or: SERVER=user@server REMOTE_DIR=/path $0" >&2 exit 1 fi echo "[deploy] Target: $SERVER:$REMOTE_DIR" # 1. rsync кода echo "[deploy] Syncing code..." rsync -avz --progress \ --exclude='.git' \ --exclude='models/' \ --exclude='processed/' \ --exclude='uploads/' \ --exclude='tmp/' \ --exclude='data/' \ --exclude='migrate/' \ --exclude='__pycache__/' \ --exclude='.pytest_cache/' \ --exclude='.env' \ --exclude='*.log' \ "$PROJECT_ROOT/" "$SERVER:$REMOTE_DIR/" # 2. .env (если включено) if [ "$WITH_ENV" = "1" ] && [ -f "$PROJECT_ROOT/.env" ]; then echo "[deploy] Copying .env (with secrets)..." scp "$PROJECT_ROOT/.env" "$SERVER:$REMOTE_DIR/.env" else echo "[deploy] .env not copied (WITH_ENV=$WITH_ENV). Run 'make init' on server." fi # 3. Remote deploy echo "[deploy] Triggering remote deploy..." ssh "$SERVER" "cd $REMOTE_DIR && \ export MODELS_SOURCE='${MODELS_SOURCE:-}' && \ make pull-models && \ make up" echo "[deploy] Done. Check logs: ssh $SERVER 'cd $REMOTE_DIR && make logs'"