243 lines
4.9 KiB
Markdown
243 lines
4.9 KiB
Markdown
# Верстак — синхронизация, backup и активность
|
||
|
||
## 1. Синхронизация
|
||
|
||
Цель:
|
||
|
||
- рабочая машина и домашняя машина имеют один vault;
|
||
- обе работают offline;
|
||
- сервер используется для обмена и восстановления;
|
||
- при потере локальных файлов можно восстановиться с сервера.
|
||
|
||
## 2. Sync server
|
||
|
||
`verstak-server` — простой Go HTTP server.
|
||
|
||
Функции:
|
||
|
||
- API key auth;
|
||
- device registry;
|
||
- operation log;
|
||
- blob storage by sha256;
|
||
- snapshots;
|
||
- restore manifest;
|
||
- deleted item retention.
|
||
|
||
Пример server storage:
|
||
|
||
```text
|
||
server-data/
|
||
db.sqlite
|
||
blobs/
|
||
ab/
|
||
cd/
|
||
abcdef...blob
|
||
snapshots/
|
||
```
|
||
|
||
## 3. API MVP
|
||
|
||
```http
|
||
GET /api/v1/health
|
||
POST /api/v1/device/register
|
||
POST /api/v1/sync/push
|
||
POST /api/v1/sync/pull
|
||
POST /api/v1/blobs/upload
|
||
GET /api/v1/blobs/{sha256}
|
||
GET /api/v1/restore/manifest
|
||
```
|
||
|
||
Auth:
|
||
|
||
```http
|
||
Authorization: Bearer <api_key>
|
||
```
|
||
|
||
## 4. Push/pull
|
||
|
||
Client push:
|
||
|
||
```json
|
||
{
|
||
"device_id": "device-uuid",
|
||
"ops": [],
|
||
"blobs": ["sha256..."]
|
||
}
|
||
```
|
||
|
||
Server response:
|
||
|
||
```json
|
||
{
|
||
"accepted": true,
|
||
"missing_blobs": ["sha256..."]
|
||
}
|
||
```
|
||
|
||
Client pull:
|
||
|
||
```json
|
||
{
|
||
"device_id": "device-uuid",
|
||
"since_revision": 42
|
||
}
|
||
```
|
||
|
||
Response:
|
||
|
||
```json
|
||
{
|
||
"server_revision": 50,
|
||
"ops": []
|
||
}
|
||
```
|
||
|
||
## 5. Восстановление
|
||
|
||
Сценарий:
|
||
|
||
1. Установить Верстак.
|
||
2. Ввести server URL.
|
||
3. Ввести API key/recovery key.
|
||
4. Нажать Restore.
|
||
5. Скачать manifest.
|
||
6. Скачать blobs.
|
||
7. Применить ops.
|
||
8. Пересобрать SQLite/FTS.
|
||
9. Проверить целостность.
|
||
|
||
## 6. Конфликты
|
||
|
||
Не пытаться магически мержить всё.
|
||
|
||
Если заметка изменилась на двух устройствах:
|
||
|
||
```text
|
||
nginx.md
|
||
nginx.conflict-home-2026-05-30.md
|
||
```
|
||
|
||
Если docx изменился на двух устройствах:
|
||
|
||
```text
|
||
dogovor.docx
|
||
dogovor.conflict-work-2026-05-30.docx
|
||
```
|
||
|
||
UI:
|
||
|
||
```text
|
||
Конфликт: nginx.md
|
||
[Открыть обе версии] [Оставить локальную] [Оставить серверную] [Склеить вручную]
|
||
```
|
||
|
||
## 7. Sync не равен backup
|
||
|
||
Если удалить файл на одной машине, sync может удалить везде.
|
||
|
||
Поэтому сервер должен иметь:
|
||
|
||
- tombstones;
|
||
- trash retention;
|
||
- note versions;
|
||
- daily snapshots;
|
||
- integrity check;
|
||
- manual export.
|
||
|
||
Retention example:
|
||
|
||
```yaml
|
||
retention:
|
||
deleted_items_days: 90
|
||
note_versions_days: 180
|
||
daily_snapshots_days: 30
|
||
```
|
||
|
||
## 8. Activity tracking
|
||
|
||
Верстак не должен быть шпионской программой. Activity tracking должен быть явным и настраиваемым.
|
||
|
||
### Источники MVP
|
||
|
||
- opened node;
|
||
- edited note;
|
||
- added file;
|
||
- changed file through app;
|
||
- launched action.
|
||
|
||
### Источники later
|
||
|
||
- file watcher/scanner;
|
||
- active window title;
|
||
- browser URL extension;
|
||
- sshkeeper integration;
|
||
- idle detection.
|
||
|
||
## 9. Как понять, что пользователь работал 3 часа
|
||
|
||
Верстак не “знает точно”. Он предлагает версию.
|
||
|
||
Пример:
|
||
|
||
```text
|
||
Похоже, ты работал по делу “ООО Ромашка / Сайт”:
|
||
14:05–17:12, примерно 3ч.
|
||
|
||
Основания:
|
||
- открывалась админка сайта;
|
||
- изменялся catalog.xlsx;
|
||
- запускался sshkeeper profile romashka-vps;
|
||
- создавался screenshot-result.png;
|
||
- открывалась заметка “Витрина”.
|
||
|
||
[Записать 3ч] [Исправить] [Игнорировать]
|
||
```
|
||
|
||
## 10. Группировка активности
|
||
|
||
Правило MVP:
|
||
|
||
- события одного дела;
|
||
- разрыв меньше 20 минут — один интервал;
|
||
- разрыв больше 20 минут — новый интервал;
|
||
- итог округлить до 5/10/15 минут;
|
||
- показать evidence.
|
||
|
||
## 11. Privacy modes
|
||
|
||
### Minimal
|
||
|
||
- only inside Verstak;
|
||
- actions;
|
||
- manual worklog.
|
||
|
||
### Work
|
||
|
||
- + file scanner/watcher;
|
||
- + files opened from Verstak;
|
||
- + sshkeeper events.
|
||
|
||
### Full
|
||
|
||
- + active windows;
|
||
- + browser URLs;
|
||
- + idle detection.
|
||
|
||
По умолчанию не включать Full.
|
||
|
||
## 12. Client report
|
||
|
||
Из журнала работ можно собрать отчёт:
|
||
|
||
```text
|
||
По сайту ООО “Ромашка” было сделано:
|
||
- обновлена витрина сайта;
|
||
- внесены изменения в каталог товаров;
|
||
- обновлены баннеры;
|
||
- проверено отображение результата.
|
||
|
||
Ориентировочное время: 3 часа.
|
||
```
|
||
|
||
MVP — шаблонный отчёт без ИИ.
|