Конфигурация файлового синка
Pre-flight чеклист и ignore-паттерны для file-sync (Syncthing/rclone/rsync/Dropbox/iCloud) — защита git working trees, venv и build-артефактов.
Обзор
Скилл фиксирует pre-flight правила, которые нужны любому двустороннему файловому синку до его первого включения. Загружается перед настройкой Syncthing, rclone bisync, общих папок Dropbox/iCloud/Google Drive, периодического rsync, Disk Arcana sync или любого custom sync-слоя. Не загружается для односторонних бэкапов и CI artifact transfer — там другая модель рисков.
Зачем это нужно (founding incident)
INFRA-0026 (2026-04-25): первая версия .stignore для Syncthing содержала 28 паттернов и не покрывала .venv, __pycache__, target/, *.db, плюс не исключала вложенные git-репо целиком. Итог: 1 материализованный sync-conflict в продакшене, 60+ .sync-conflict файлов за неделю, 14 git-репо с расходящимися рабочими копиями между хостами, реальный риск cross-platform breakage (macOS Mach-O vs Linux ELF). Расширение паттернов 28 → 66 уронило счёт файлов 40,361 → 2,206 (−95%).
Pre-Flight Inventory (обязательно)
Перед включением sync нужно прогнать find по source root для каждого класса проблемных файлов — всё, что найдётся, обязано попасть в ignore-список до первого синка:
- Vendored / build-артефакты —
node_modules,.venv/venv,__pycache__,target,.next/.turbo/.nuxt,.cache/.parcel-cache,coverage/.nyc_output,dist/build/.build,DerivedData,.pytest_cache/.mypy_cache/.ruff_cache - Вложенные .git директории (критично) — каждый
.git/внутри sync root - Локальные БД / state-файлы —
*.db,*.sqlite/*.sqlite3,*.duckdb,*.db-journal - Скомпилированные бинарники (cross-platform unsafe) —
*.so,*.dylib,*.dll,*.exe - IDE / OS мусор —
.idea,.vscode,.DS_Store,Thumbs.db
Decision Tree: синкать working tree или git pull
Для каждой найденной .git/ папки задайте вопрос: есть ли на второй ноде live-правки, агенты или production runtime в этом репо?
- Да → не синкайте working tree. Исключите
/path/to/repoцеликом. Обновляйте через crongit pullна второй ноде (паттернarcanada-pull.sh). - Нет → working tree можно синкать как read-only зеркало, но
.git/всё равно исключите — у каждой ноды своя commit history.
По умолчанию выбирайте "да" — почти любая вторая нода рано или поздно становится активной (новый агент, deploy-скрипт, ручная правка). Overprotection лучше восстановления.
Reusable .stignore шаблон (Syncthing, INFRA-0026 v2)
Закалённый шаблон закрывает восемь корзин:
- Исходный код проектов (отдельные git-репо) —
/Projects/*/code,/Projects/Datarim/sources,/Projects/Rules of Robotics/Code - AI-агенты с собственными git/venv —
/AI_agents/Email Agent,Screen reader,Remove-Watermark,Agent Dreamer - Workflow / runtime state —
.git,.dreamer,.meta,.claude,.githooks - Build / зависимости —
node_modules,dist,build,.next,.turbo,.nuxt,.cache,.parcel-cache,coverage,.nyc_output,target - Python environments / кэши —
.venv,venv,__pycache__,*.pyc,.pytest_cache,.mypy_cache,.ruff_cache - Swift build artifacts —
.build,DerivedData,*.xcuserstate - Скомпилированные бинарники —
*.so,*.dylib,*.dll,*.exe,*.o,*.a - БД / state-файлы —
*.db,*.sqlite,*.sqlite3,*.duckdb,*.db-journal,*.db-shm,*.db-wal
Плюс secrets/temp/OS-мусор: *.tmp, *.log, .env*, .DS_Store, Thumbs.db, .Spotlight-V100, .Trashes, .fseventsd.
Pattern Syntax Cheat-Sheet
Syncthing (.stignore): node_modules матчится на любом уровне, /Projects/*/code — path-anchored, (?d)pattern удаляет уже синкнутое, (?i) case-insensitive, !important.log — negation.
rclone: trailing / — только папки, ** рекурсирует через папки, /path/to/exclude/** — path-anchored.
rsync: не различает файл/папку, /relative/path — от start dir, **/*.tmp — recursive glob.
Workflow для git-managed репо (когда file-sync исключён)
- Cron
git pullскрипт — рекомендуемый паттернarcanada-pull.sh: fetch upstream, skip если local==remote, skip если ветка ≠ main/master, stash локальных правок, ff-only pull с fallback на merge, далее CLI Claude conflict-resolver, алерт через Ops Bot при unresolved, pop stash. - CI/CD self-hosted runner — GitHub Actions runner на второй ноде делает pull при push в main (event-driven вместо polling).
- Ручной — оператор делает
git pullсам по необходимости. Подходит для редко обновляемых репо.
Compliance Check
- Pre-flight inventory выполнен для каждого класса проблемных файлов
- Каждый обнаруженный класс присутствует в ignore-паттернах
- Каждая вложенная
.git/либо исключена целиком, либо задокументирована как read-only mirror - Cross-platform binary классы (
.venv,target,*.so/*.dylib/*.dll) исключены при синке между разными ОС - DB-файлы (
*.db,*.sqlite) исключены как host-local state - Lockdown применён (
globalAnnounce=false, нет публичного discovery, transport ограничен приватной сетью — например, Tailscale) - Бэкап pre-change конфига сохранён (
config.xml.pre-{TASK-ID}) - Runbook задокументирован (топология, ops, rollback)
- Двусторонний smoke-тест прогнан