Резервная копия в своё хранилище
Резервное копирование в собственное хранилище — функция, которую владелец проекта включает сам. Если её настроить, Hivelore по выбранному вами расписанию выгружает копию вашего проекта — страниц, вложений и задач — в S3-хранилище, которое вы указали. Копия читается без Hivelore и разворачивается обратно в проект.
Пока функция не настроена, в ваше хранилище ничего не уходит. И уходит только копия этого проекта: ни данные других проектов, ни служебные копии сервиса туда не попадают.
Зачем это нужно
Копия в вашем хранилище лежит под вашим контролем: в вашем облаке, под вашими ключами и по вашему расписанию. Её можно открыть в любой момент и развернуть в проект. Так советует правило «3-2-1», которое рекомендуют облачные провайдеры: хотя бы одна копия данных — на независимой площадке.
Ручной архив (Импорт и экспорт, «Экспорт базы знаний») закрывает вопрос «забрать всё один раз». Копия по расписанию закрывает другой: свежая копия есть всегда, а не та, что скачали полгода назад.
Что понадобится
- S3-хранилище в России — Yandex Object Storage, S3 Selectel, VK Cloud (регион Москва) или Cloud.ru. Копия уходит в него с наших серверов, а персональные данные из базы знаний не должны покидать Россию, поэтому форма принимает адреса только этих хранилищ. Нужно другое хранилище в России, в том числе MinIO на своём сервере, — напишите на support@hivelore.ru, добавим его адрес. Яндекс Диск, Google Drive и WebDAV не поддерживаются.
- Бакет — приватный, под эти копии.
- Ключ доступа (access key ID и secret access key) с правом записи в этот бакет.
- Роль владельца проекта: раздел видит и настраивает только он.
Ключ — только на запись
Мы только кладём файлы: не читаем, не листаем и не удаляем. Поэтому просим ключ с единственным правом — s3:PutObject на этот бакет. Тогда, даже если ключ утечёт от нас, им нельзя ни прочитать ваши копии, ни стереть их — только положить лишний файл.
Образец политики бакета (у провайдеров расходятся мелочи — как называется пользователь в Principal):
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": { "AWS": ["<идентификатор ключа или сервисного аккаунта>"] },
"Action": ["s3:PutObject"],
"Resource": ["arn:aws:s3:::<бакет>/<папка>/*"]
}
]
}
Ещё строже — только новые объекты: условие "Condition": { "StringEquals": { "s3:if-none-match": "*" } } в том же правиле. Таким ключом нельзя затереть уже лежащую копию; Hivelore с ним работает.
Та же политика с подставленными бакетом и папкой есть в форме настройки — под строкой «Как сделать ключ только на запись», с кнопкой копирования.
Tip
Срок хранения задаёт правило жизненного цикла бакета Старые копии мы не удаляем — для этого ключу понадобилось бы право удалять, а его мы как раз просим не давать. Настройте в бакете правило «удалять объекты старше N дней». Оно же уберёт части загрузки, которая сорвалась посередине.
Настройка
Настройки → Проект → «Общее» → «Резервное копирование» → «Настроить».
| Поле | Что вписать |
|---|---|
| Адрес хранилища | адрес S3 вашего провайдера, только https://: https://storage.yandexcloud.net, https://s3.ru-1.storage.selcloud.ru, https://hb.ru-msk.vkcloud-storage.ru, https://s3.cloud.ru |
| Бакет | имя бакета |
| Папка в бакете | необязательно; копии лягут в эту папку |
| Регион | многие провайдеры его не проверяют — оставьте пустым, если не знаете |
| Access key ID и Secret access key | ключ из раздела выше |
| Расписание | «Ежедневно» или «Еженедельно» с днём недели, и час |
Час считается по часовому поясу проекта (он рядом, в том же разделе «Общее»). Минуту выбирает сервер — чтобы копии разных проектов «в 3 ночи» не сходились в одну минуту, — поэтому расписание показано как «в 03:xx».
Кнопка «Проверить» кладёт в бакет маленький файл hivelore-check.txt — «это проверка, можно удалить». Удачно: «Подключение работает: файл hivelore-check.txt лёг в бакет». Сохранить настройку без удачной проверки нельзя: сломанная копия, которая молча падает по ночам, хуже никакой. Если ключ умеет больше, чем нужно (например, листать бакет), форма предупредит, но сохранить даст.
Ключ хранится у нас зашифрованным и обратно не показывается: в форме видны только последние четыре знака access key ID. Чтобы поменять ключ, его вводят заново целиком.
Адреса во внутренних сетях (частные, петлевые, адреса облачных метаданных) не принимаются: запрос к хранилищу уходит с наших серверов, и через эту форму нельзя достучаться до чужой внутренней сети.
Что лежит в копии
Один запуск — один zip-архив, полный снимок проекта:
hivelore-<проект>-20261015-0300Z.zip
├── manifest.json — структура: дерево, порядок, значки, цвета, теги, вложения
├── pages/ — страницы в markdown, раскладка как у ручного экспорта
│ ├── Релизы/
│ │ ├── index.md — сама страница «Релизы»
│ │ └── Версия 3.md
│ └── Глоссарий.md
├── files/ — вложения байтами
└── tasks.json — задачи: название, описание, состояние, срок, исполнитель, страница-источник
- Ссылки на картинки в тексте переписаны на файлы в архиве — распакованная папка читается в любом markdown-редакторе: Obsidian, Typora, VS Code.
Вики-ссылкиостаются как есть — Obsidian их понимает.- Подключённые Google-доки и доски Miro лежат в
manifest.jsonсписком ссылок: их содержимое живёт у владельца документа.
Чего в копии нет: удалённых в корзину страниц, истории версий, комментариев, предложений правок, участников и прав, чатов. Копия — это текущее состояние знаний, а не всей работы над ними.
Important
Защищайте бакет так же, как саму базу знаний Архив — обычный zip: его содержимое читается без пароля. Держите бакет приватным, выдавайте доступ к нему только тем, кому положено видеть проект, и, если провайдер это умеет, включите шифрование на стороне хранилища.
Статус и история
В разделе видно:
- расписание и время следующей копии — или «Выключено — копия по расписанию не снимается»;
- последнюю удачную копию: когда, сколько весит, сколько страниц;
- «История копий» — последние запуски, у идущего — этап («Читаем проект», «Упаковываем страницы и вложения», «Отправляем в хранилище») и полоса.
Кнопки: «Сделать копию сейчас» (вне расписания, не чаще раза в 10 минут), «Изменить», «Выключить» и «Удалить». Удаление настройки стирает у нас ключ и останавливает копии; уже снятые копии остаются в вашем хранилище — это ваши данные.
Если копия не снялась
В разделе появляется красная плашка «Копия не снялась» или «Копия не снимается: сбоев подряд — N» с причиной человеческими словами: «ключ не принят», «нет прав на запись в бакет», «хранилище не в России» и так далее.
Всем владельцам проекта приходит письмо — при первом сбое серии, а пока сбой длится, напоминание раз в неделю, а не на каждый запуск. Когда копии снова пошли — короткое письмо «копии снова идут».
Автоматически копия не выключается никогда: тихо выключенная копия — худший исход, вы бы думали, что она идёт.
Восстановление
Ключ только на запись читать не умеет, поэтому архив вы скачиваете из своего хранилища сами, а дальше:
Настройки → Проект → «Общее» → «Восстановление из копии» → «Восстановить из копии…» и выберите zip.
- В пустой проект страницы ложатся в корень.
- В непустой — под новую страницу «Копия «…» от …». Существующие страницы не трогаются: слияния поверх живого дерева нет.
- Восстанавливаются дерево с порядком, значки, цвета, теги, вложения и задачи. Исполнитель задачи, которого нет в этом проекте, снимается — сама задача остаётся.
- Восстановление идёт фоном: после загрузки архива вкладку можно закрыть. Итог — сколько легло, и поимённо, что не легло и почему, — появится в разделе и провисит сутки.
Одну и ту же копию можно восстановить и не раз — например, в новый проект, чтобы проверить, что копия рабочая. Это стоит сделать хотя бы однажды: копия, которую ни разу не разворачивали, — только надежда на копию.
Архив, распакованный и запакованный руками или собранный из другой вики, восстановлением не откроется — его забирает обычный импорт как дерево markdown.
Что пишется в журнал
Включение, правка, выключение и удаление настройки, ручной запуск и восстановление — от имени того, кто это сделал. Плановые запуски в журнал не идут: их ведёт «История копий».