- New: src/rag/engine/ — in-process hybrid search (FTS5 BM25 + sqlite-vec + LLM rerank) - New: src/rag/qmd/ — compatibility layer (qmd_query, qmd_chat, qmd_chat_stream, qmd_index_*) - New: src/ingest/stub_writer.py — .md stubs for binary files (videos, archives) - New: scripts/deploy.sh + scripts/pull_models.sh + Makefile + .env.example - Removed: LightRAG, sentence-transformers embedding via separate package, rag_standalone/ - Removed: @nousresearch/qmd npm dep (package not published); Node.js from Dockerfile - Updated: tests/ (46 passed), docker-compose, .dockerignore, config.yaml, README Engine: in-process Python (no daemon, no npm), sentence-transformers 384-dim, RRF fusion (k=60), BM25 + vector with numpy fallback. WebSocket API unchanged. Deploy: 'git clone' + 'make init' + 'make pull-models MODELS_SOURCE=...' + 'make up'. Models (5.83 GB) live outside git; pulled via rsync from dev host.
68 lines
2.4 KiB
Bash
68 lines
2.4 KiB
Bash
#!/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'"
|