feat(maria): ops/setup-drive.sh — configurare Drive dintr-un token, intr-un pas

Pasii 2-4 din README (creare remote, verificare acces, scriere DRIVE_REMOTE,
prima sincronizare) erau de facut de mana, cu ID-ul dosarului copiat corect de
fiecare data. Scriptul ii face pe toti dintr-un token `rclone authorize`:
valideaza ca tokenul e JSON, refuza devreme daca rclone sau env-ul lipsesc,
face backup la env inainte de a-l rescrie, si e idempotent.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q4uzvgm7AyJch5WH8QHRhY
This commit is contained in:
Claude Agent
2026-08-31 18:16:07 +00:00
parent 1c7899753a
commit f3f5eedb79
2 changed files with 71 additions and 15 deletions

View File

@@ -115,23 +115,19 @@ Pasi (o singura data):
```
Se deschide browserul; autentifica-te cu `mmarius28@gmail.com` si accepta.
In consola apare un token JSON intre `--->` si `<---`. Copiaza-l intreg.
2. **Pe container**, creeaza remote-ul cu tokenul copiat:
2. **Pe container**, da tokenul scriptului de configurare:
```
rclone config create gdrive drive scope=drive.readonly token='<TOKEN_JSON>'
ops/setup-drive.sh '<TOKEN_JSON>'
```
3. Testeaza ca vede dosarul:
```
rclone lsf gdrive: --drive-root-folder-id=1C4e75zgH1_7ZK-_oBP5ZZBvUPh3iEo1O
```
4. Pune tinta in `~/.maria-bridge/env`:
```
DRIVE_REMOTE=gdrive,root_folder_id=1C4e75zgH1_7ZK-_oBP5ZZBvUPh3iEo1O:
```
(sintaxa „connection string" a rclone — fixeaza dosarul fara sa depinda de
structura de nume din My Drive.)
5. Testeaza: butonul „sincronizeaza din Drive acum" din dashboard, sau
`systemctl --user start maria-sync.service` apoi
`journalctl --user -u maria-sync -n 50`.
Face restul singur: creeaza remote-ul `gdrive`, verifica accesul la dosar,
scrie `DRIVE_REMOTE` in `~/.maria-bridge/env` (cu backup) si ruleaza prima
sincronizare cu reindexare. E idempotent — se poate rula din nou oricand.
Tinta scrisa in env e `gdrive,root_folder_id=<ID>:` — sintaxa „connection
string" a rclone, care fixeaza dosarul dupa ID, fara sa depinda de structura
de nume din My Drive.
3. Verifica in dashboard: sectiunea Maria trebuie sa arate „Drive: …" in loc de
„Sincronizare Drive dezactivata".
Tokenul se reimprospateaza singur (refresh token) cat timp aplicatia ramane
autorizata in contul Google. Daca expira, dashboard-ul arata sincronizarea ca

View File

@@ -0,0 +1,60 @@
#!/usr/bin/env bash
# Configureaza sincronizarea depozitului Mariei cu Google Drive, dintr-un token
# obtinut cu `rclone authorize` pe o masina cu browser (containerul e headless).
#
# Pe Windows, in dosarul unde ai dezarhivat rclone.exe:
# rclone.exe authorize "drive" --drive-scope=drive.readonly
# Copiaza tokenul JSON dintre ---> si <--- si ruleaza aici:
# ops/setup-drive.sh '<TOKEN_JSON>'
#
# Idempotent: rulat din nou, rescrie remote-ul si linia DRIVE_REMOTE.
set -euo pipefail
REMOTE_NAME="gdrive"
FOLDER_ID="1C4e75zgH1_7ZK-_oBP5ZZBvUPh3iEo1O" # document_store, cont mmarius28@gmail.com
ENV_FILE="${MARIA_BRIDGE_DIR:-$HOME/.maria-bridge}/env"
DRIVE_REMOTE="${REMOTE_NAME},root_folder_id=${FOLDER_ID}:"
token="${1:-}"
if [ -z "$token" ]; then
echo "Uz: $0 '<TOKEN_JSON de la rclone authorize>'" >&2
exit 2
fi
if ! printf '%s' "$token" | python3 -c 'import json,sys; json.load(sys.stdin)' 2>/dev/null; then
echo "Tokenul nu e JSON valid. Copiaza tot, inclusiv acoladele." >&2
exit 2
fi
command -v rclone >/dev/null || { echo "rclone nu e instalat" >&2; exit 1; }
[ -f "$ENV_FILE" ] || { echo "nu gasesc $ENV_FILE" >&2; exit 1; }
echo "1/4 creez remote-ul rclone '$REMOTE_NAME'…"
rclone config delete "$REMOTE_NAME" 2>/dev/null || true
rclone config create "$REMOTE_NAME" drive scope=drive.readonly token="$token" --non-interactive >/dev/null
echo "2/4 verific accesul la dosar…"
if ! rclone lsf "$DRIVE_REMOTE" >/tmp/.maria-drive-check 2>/tmp/.maria-drive-err; then
echo "nu pot citi dosarul:" >&2; cat /tmp/.maria-drive-err >&2; exit 1
fi
echo " vad $(wc -l </tmp/.maria-drive-check) fisiere in document_store"
echo "3/4 scriu DRIVE_REMOTE in $ENV_FILE…"
cp -p "$ENV_FILE" "$ENV_FILE.bak.$(date +%F)"
if grep -q '^DRIVE_REMOTE=' "$ENV_FILE"; then
python3 - "$ENV_FILE" "$DRIVE_REMOTE" <<'PY'
import sys, pathlib
p, val = pathlib.Path(sys.argv[1]), sys.argv[2]
lines = [(f"DRIVE_REMOTE={val}" if l.startswith("DRIVE_REMOTE=") else l)
for l in p.read_text().splitlines()]
p.write_text("\n".join(lines) + "\n")
PY
else
printf 'DRIVE_REMOTE=%s\n' "$DRIVE_REMOTE" >> "$ENV_FILE"
fi
echo "4/4 sincronizez si reindexez…"
cd "$(dirname "$0")/../rag"
"${MARIA_BRIDGE_DIR:-$HOME/.maria-bridge}/venv/bin/python" sync.py --force
echo
echo "Gata. Timer-ul maria-sync trage la 10 minute de acum inainte."