Гайды

Перенос своего экземпляра на другой диск или машину

Переезд — это процедура с приёмкой, а не копирование папки на удачу. Семь шагов, чек-лист из девяти проверок и разбор трёх ошибок, из-за которых приложение стартует и работает с пустой базой.

Переезд обычно выглядит так: скопировали папку, запустили на новом месте, вроде работает. Проблема этого подхода не в том, что он часто ломается, а в том, что он ломается тихо: приложение стартует, отвечает, интерфейс открывается — и работает с пустой базой, которую только что создало, потому что путь к данным резолвится не туда. Старые данные при этом целы, просто их никто не видит.

Поэтому переезд — процедура с приёмкой. Ниже семь шагов и чек-лист, который отличает «скопировали» от «переехали».

#Что понадобится

  • Доступ к обеим машинам (или к обоим дискам) одновременно.
  • Место под данные плюс место под резервную копию на третьем носителе.
  • Та же версия приложения на новой стороне, что работала на старой. Это условие, а не пожелание — см. шаг 3.
  • Час времени. Половина уйдёт на копирование, половина на проверки.

#Шаг 1. Инвентаризация: что именно переезжает

Переезжает не «база», а четыре разных вещи, и забывают обычно последние две.

Что Где обычно Забывают?
Файл базы и её журналы каталог данных нет
Изображения, вложения, входящие каталог данных иногда
Конфигурация с секретами (.env) рядом с кодом часто
Настройки автозапуска, задачи, unit-файлы вне каталога данных почти всегда

Четвёртая строка — причина, по которой переезд «прошёл», а через день сервис не поднялся после перезагрузки: данные приехали, автозапуск остался на старой машине.

#Шаг 2. Остановить приложение и снять копию

Обязательно в этом порядке. Копирование файла базы на ходу обычными средствами даёт копию, которая открывается и молча содержит несогласованные данные — механика разобрана в гайде про резервное копирование SQLite без порчи данных.

# 1. остановить приложение и все фоновые задачи
systemctl stop persona          # или Stop-ScheduledTask на Windows

# 2. убедиться, что процессов не осталось
ss -ltnp | grep 8000            # должно быть пусто

# 3. снять корректную копию — это ваш путь назад
sqlite3 ~/.persona/persona.db ".backup '/backup/before-move.db'"

Пункт 2 не формальность. Второй экземпляр приложения, оставшийся с прошлого запуска, продолжит писать в базу, пока вы её копируете, — и вы получите ровно ту несогласованную копию, которой пытались избежать.

#Шаг 3. Проверить, что версии совпадают

Перед копированием запишите версию приложения на старой машине. На новой должна подняться она же.

Причина: схема базы связана с версией кода. Приложение более новой версии применит миграции к вашей базе прямо при первом старте, и вернуться назад будет нельзя — обратных миграций не существует, откат возможен только из копии. Порядок безопасного применения схемы — в статье про миграции базы данных без потери данных.

Правильная последовательность: переехать на той же версии, убедиться, что всё работает, и только потом обновляться отдельным действием.

#Шаг 4. Перенести данные

# каталог данных целиком, с сохранением прав и времени
rsync -a --info=progress2 ~/.persona/ /mnt/new/persona-data/
# Windows: /MIR зеркалирует, /COPY:DAT сохраняет атрибуты и время
robocopy "C:\Users\Me\.persona" "D:\persona-data" /MIR /COPY:DAT /R:2 /W:2

Файлы -wal и -shm рядом с базой копировать не нужно, если приложение остановлено корректно: их содержимое уже перенесено в основной файл. Если они всё же приехали — удалите их на новом месте, иначе SQLite попытается применить чужой журнал.

#Шаг 5. Переписать пути

Самое частое место отказа. На новой машине путь к данным задаётся абсолютным значением:

PERSONA_DATA_DIR=D:/persona-data
PERSONA_DB_PATH=D:/persona-data/persona.db

Относительный путь — это гарантированный тихий отказ: приложение, запущенное из другого каталога, создаст рядом с собой новую пустую базу и будет работать с ней.

Отдельная ловушка на Windows: если сервис запускается задачей планировщика с типом входа без интерактивной сессии, у него может не оказаться того окружения, на которое вы рассчитывали, а токен такого типа не несёт сетевых учётных данных — до сетевой шары он не дотянется. Каталог данных на сетевом ресурсе после такого переезда просто не откроется. Настройка автозапуска и его ловушки — в гайде про автозапуск на Windows.

И общее правило, не зависящее от платформы: база не должна лежать на сетевом ресурсе или в папке синхронизации. Механизм блокировок SQLite опирается на корректное поведение файловой системы, и сетевые протоколы эмулируют его по-разному.

#Шаг 6. Первый запуск и проверка

Запускайте вручную, в переднем плане, а не через автозапуск. Так вы увидите вывод.

PERSONA_DATA_DIR=/mnt/new/persona-data .venv/bin/python -m uvicorn app.web.main:app --port 8000

Смотрите первые тридцать секунд: там применение схемы. Ноль применённых миграций — правильный результат при совпадающих версиях.

#Шаг 7. Восстановить автозапуск и погасить старое

Автозапуск настраивается заново на новой машине, с новыми путями. И только после полной приёмки старая установка выключается — но не удаляется ещё как минимум неделю. Удалённые данные, которых не хватило, восстанавливать неоткуда.

#Чек-лист приёмки

Проверяйте всё, а не первые три пункта.

  1. Ручка живости отвечает и отдаёт ту же версию, что была до переезда.
  2. Файл базы находится там, где вы указали, и его размер совпадает с исходным.
  3. Каталог изображений на месте, число файлов совпадает с исходным.
  4. Открывается запись годичной давности, а не только вчерашняя.
  5. Изображение у старой записи отображается — значит пути к файлам совпали.
  6. Поиск находит слово, которое точно есть в старых данных.
  7. Настройки на месте: тема, интервалы, исключения приложений.
  8. Фоновые задачи работают: появилась новая запись после переезда.
  9. Сервис поднимается после перезагрузки машины без ручного вмешательства.

Пункты 4 и 5 — те, что отличают приёмку от беглого взгляда. База может приехать целиком, а изображения остаться по старым путям: интерфейс тогда работает, записи есть, картинки не открываются. Пункт 9 проверяется только настоящей перезагрузкой.

#Что может пойти не так

Приложение работает, но данных нет. Путь к данным резолвится не туда, создана новая пустая база. Данные целы — проверьте, где на самом деле лежит открытый файл.

Записи есть, изображений нет. В базе абсолютные пути к файлам со старой машины. Либо воспроизведите структуру каталогов, либо обновите пути.

Ошибки блокировки базы. Данные легли на сетевой ресурс или в папку синхронизации. Переносите на локальный диск, других способов нет.

После переезда схема обновилась сама. На новой машине оказалась более свежая версия приложения. Вернуться можно только из копии, снятой на шаге 2.

Сервис не поднялся после перезагрузки. Автозапуск остался на старой машине. Настраивается заново, и проверяется настоящей перезагрузкой.

Переезжали контейнер, данные исчезли. Каталог с данными не был примонтирован томом и жил внутри контейнера. Устройство томов и проверка их сохранности — в гайде про запуск Persona в контейнере.

#Частые вопросы

#Можно ли перенести только базу, без изображений?

Технически да, приложение запустится. Но записи останутся без картинок, и восстановить их будет неоткуда. Если места на новой машине не хватает — сначала уменьшите объём политикой устаревания на старой, а потом переезжайте целиком.

#Чем переезд отличается от восстановления из резервной копии?

Копия предназначена для возврата того же приложения в то же место. Переезд меняет пути, окружение и автозапуск, поэтому у него есть шаги, которых нет у восстановления, и своя приёмка. Копия при этом обязательна — как путь назад.

#Что делать, если переезд идёт с Windows на Linux?

Основная работа та же, добавляются два пункта: разделители путей в конфигурации и абсолютные пути к файлам, если они хранятся в базе. Сам файл базы SQLite переносим между платформами без преобразований.

#Нужно ли что-то делать с секретами при переезде?

Файл конфигурации переезжает отдельно и не через общедоступные каналы: там ключи. Помните и про базу — ключи участников хранятся в ней открытым текстом, поэтому файл базы при передаче стоит считать хранилищем паролей. Что и как редактировать, когда данные покидают машину, — в статье про резервные копии и приватность.

#Как перенести только память ассистента, а не весь экземпляр?

Это другая задача: не перенос установки, а экспорт содержимого в переносимом виде. Порядок и форматы — в статье про экспорт и перенос памяти ИИ.

#Когда удалять старую установку?

Не раньше чем через неделю нормальной работы новой, и только после того, как пройдены все девять пунктов приёмки. Неделя нужна, чтобы всплыли редкие сценарии — то, что вы открываете раз в несколько дней. Общая логика эксплуатации, куда встраивается переезд, — в статье о том, как поднять свой ИИ-сервис.

Хотите ИИ, который помнит вас?

Persona держит контекст между чатами и работает на вашем железе — если развернуть её у себя и подключить локальную модель.

Создать аккаунт