Экспорт, импорт и копии вне компьютера
Все 40 резервных копий лежали на том же диске, что и оригинал, а фотографии не дублировались нигде: смерть диска уносила и 59 записей, и 69 снимков. Что появилось: - «📦 Скачать архив» — zip с базой и всеми фотографиями (13 МБ на текущих данных). Работает и с телефона, годится для переноса на другой компьютер. - «📥 Загрузить архив» — восстановление. Сначала показывает, что внутри (сколько вещей в архиве против текущих), и только после подтверждения заменяет данные. Прежнее состояние откладывается в data/backups — и база, и папка со старыми фотографиями. - HLAMINGO_BACKUP_DIR — путь, куда сама уходит копия базы и новых фотографий. Не чаще раза в час и только если путь доступен: сетевой диск отваливается регулярно, а терять запись о вещи из-за этого недопустимо. Состояние и кнопка «Скопировать сейчас» — на вкладке настроек. Имена файлов из архива как пути не используются: только базовое имя и расширение из белого списка. Иначе архив со строкой «../../» писал бы куда угодно — тест это проверяет отдельно. Попутно исправлены два дефекта: - предел загрузки был 8 МБ, и архив в 13 МБ не прошёл бы. Разделён на общий предел запроса и отдельный предел для одного снимка; - настройки нельзя было менять по одной: непереданные поля приходили как null и валились на проверке. Теперь null означает «не трогать», а пустая строка — осознанное «очистить». Про защиту копий на сервере. Задумывался .htaccess, но сайты обслуживает nginx, который его игнорирует, — файл создавал бы ложное чувство защиты. Настоящая защита в расположении: папка лежит рядом с корнем сайта, а не внутри, и nginx за пределы своего root не выпускает. Проверено запросами извне: и сама папка, и db.json, и фотографии дают 404, включая попытку выйти через «/../». .htaccess положен рядом как подстраховка на случай переезда на Apache, о чём честно написано внутри самого файла. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -119,10 +119,12 @@ start.cmd запускает сервер и печатает адреса
|
||||
| `HLAMINGO_CHAT_MODEL` | `qwen3:8b` | разбор фраз и теги |
|
||||
| `HLAMINGO_EMBED_MODEL` | `bge-m3` | поиск по смыслу |
|
||||
| `HLAMINGO_VISION_MODEL` | `gemma3:4b` | подсказка по фото; пусто — выключено |
|
||||
| `HLAMINGO_BACKUP_DIR` | — | папка для копий вне компьютера; пусто — выключено |
|
||||
| `HLAMINGO_PORT` | `5000` | порт веб-интерфейса |
|
||||
| `HLAMINGO_DATA_DIR` | — | другая папка для данных и `.env`; используется тестами |
|
||||
|
||||
Из браузера правятся только `OLLAMA_HOST` и две модели — по белому списку.
|
||||
Из браузера правятся `OLLAMA_HOST`, две модели и путь для копий — по белому
|
||||
списку.
|
||||
Произвольные ключи в `.env` через веб записать нельзя: этот файл читает
|
||||
приложение при запуске. Адрес проверяется на формат, имена моделей — на
|
||||
недопустимые символы, и если хоть одно значение неверно, не применяется
|
||||
@@ -329,9 +331,10 @@ static\photos\ фотографии (в .gitignore)
|
||||
и та же коробка.
|
||||
- **Резервные копии.** Перед каждой перезаписью прошлое состояние базы уходит
|
||||
в `data\backups\db-ГГГГММДД-ЧЧММ.json`, хранятся последние 40. Откат — просто
|
||||
скопировать нужный файл обратно в `data\db.json`. Полноценный бэкап папки они
|
||||
не заменяют, но спасают от затёртой или испорченной базы: однажды она уже
|
||||
потерялась целиком, и откатываться было некуда.
|
||||
скопировать нужный файл обратно в `data\db.json`. Спасают от затёртой или
|
||||
испорченной базы: однажды она уже потерялась целиком, и откатываться было
|
||||
некуда. **Но лежат они на том же диске**, поэтому есть ещё два способа
|
||||
ниже — архив и внешняя папка.
|
||||
- **Запись базы атомарная** (временный файл + подмена): обрыв на середине
|
||||
не уничтожит всё, что записано про вещи.
|
||||
- **Битая база не роняет приложение** — запускается с пустой, файл не трогает.
|
||||
@@ -375,6 +378,45 @@ venv\Scripts\python.exe tools\make_icons.py
|
||||
из `static/` он ушёл бы как обычный файл, и браузер мог не признать его
|
||||
манифестом.
|
||||
|
||||
## Резервные копии и перенос
|
||||
|
||||
Копии внутри программы лежат на том же диске, что и оригинал. Диск умрёт —
|
||||
пропадут и записи, и фотографии. Поэтому есть два способа держать данные ещё
|
||||
где-то, оба на вкладке **⚙**.
|
||||
|
||||
### Архив
|
||||
|
||||
**«📦 Скачать архив»** — zip с базой и всеми фотографиями (у 59 вещей это
|
||||
около 13 МБ). Работает и с телефона: файл уходит в загрузки. Годится и для
|
||||
переноса на другой компьютер.
|
||||
|
||||
**«📥 Загрузить архив»** — восстановление. Сначала показывает, что внутри
|
||||
(сколько вещей в архиве против текущих), и только после подтверждения заменяет
|
||||
данные. Прежнее состояние при этом откладывается в `data\backups`:
|
||||
`db-before-import-*.json` и папка с прежними фотографиями — вернуться можно
|
||||
всегда.
|
||||
|
||||
Имена файлов из архива как пути не используются: берётся только базовое имя
|
||||
и расширение из белого списка. Иначе архив со строкой `../../` внутри писал бы
|
||||
куда угодно на диске.
|
||||
|
||||
### Внешняя папка
|
||||
|
||||
`HLAMINGO_BACKUP_DIR` — путь, куда само уходит копия базы и новых фотографий:
|
||||
сетевой диск, шара, что угодно. Пусто — выключено.
|
||||
|
||||
Копирование идёт не чаще раза в час и **не мешает работе, если путь
|
||||
недоступен**: сетевой диск отваливается регулярно, а терять запись о вещи
|
||||
из-за этого недопустимо. Состояние (путь, доступен ли, когда была последняя
|
||||
копия) видно на вкладке ⚙, там же кнопка «Скопировать сейчас».
|
||||
|
||||
**Если папка лежит на веб-сервере — проверьте, не отдаётся ли она наружу.**
|
||||
В нашем случае копии кладутся в `sambadata\hlamingo-backup`, рядом с корнем
|
||||
сайта, но не внутри него, поэтому nginx до них не дотягивается — проверено
|
||||
запросами извне, все дают 404. Файл `.htaccess` там тоже лежит, но nginx его
|
||||
игнорирует: это подстраховка на случай переезда на Apache, а не текущая защита.
|
||||
Полагаться на `.htaccess` при nginx нельзя.
|
||||
|
||||
## Тесты
|
||||
|
||||
```
|
||||
|
||||
Reference in New Issue
Block a user