Перенос проекта

Обзор

Перенос проекта позволяет переместить уже развёрнутый Laravel-проект onFriday со старого сервера на новый: код, реальный файл .env с новыми параметрами базы данных, директорию storage и саму базу данных MySQL. Перенос выполняется отдельным безопасным процессом и не затрагивает обычный deploy.

Старый и новый серверы существуют одновременно до завершения переноса. Активный сервер проекта переключается на новый только после полного успеха переноса. При любой ошибке активный сервер остаётся прежним.

Предварительные требования

  • Проект развёрнут и является Laravel-приложением.
  • MySQL запущен в Docker-контейнерах на старом и новом серверах.
  • У вас есть данные SSH-подключения к новому серверу.
  • На старом и новом серверах доступны команды docker, rsync, а внутри контейнеров — mysqldump и mysql.

Настройка SSH-ключа

При запуске переноса onFriday создаёт новый сервер проекта и генерирует для него отдельный SSH-ключ. Публичный ключ нужно добавить на новый сервер в файл ~/.ssh/authorized_keys пользователя, под которым onFriday подключается к серверу:
echo "ваш_public_key" >> ~/.ssh/authorized_keys

Имена Docker-контейнеров MySQL

Имена контейнеров не угадываются автоматически. В форме переноса необходимо указать:

  • MySQL контейнер (старый сервер) — из него снимается дамп базы.
  • MySQL контейнер (новый сервер) — в него импортируется база.

Замена параметров базы данных

Реальный .env читается напрямую со старого сервера (из shared/.env). В копию подставляются новые значения ключей DB_HOST, DB_PORT, DB_DATABASE, DB_USERNAME, DB_PASSWORD, которые вы вводите в форме переноса. Остальные значения .env сохраняются без изменений.

Перенос storage

Директория current/storage переносится со старого сервера на новый при помощи rsync.

Что происходит при успехе и при ошибке

  • Успех: после переноса .env, storage, импорта базы и проверочных команд активный сервер проекта переключается на новый сервер.
  • Ошибка: перенос помечается как неуспешный, текст ошибки сохраняется (с замаскированными паролями), активный сервер остаётся прежним.

DNS

DNS не переключается автоматически. После успешного переноса обновите DNS-записи на новый сервер вручную.

Безопасность и логирование

Пароли базы данных, содержимое .env, материал SSH-ключей и содержимое дампов никогда не попадают в логи. Команды с паролями маскируются перед записью в журнал.

Заметки для разработчиков

  • Модель активного сервера: projects.active_server_id, отношения Project::servers() и Project::activeServer().
  • Ключи и deploy-yaml хранятся по пути, привязанному к серверу: /keys/servers/{server_id} и /deploys/servers/{server_id}.yaml.
  • Перенос реализован в App\Jobs\ProjectTransferJob и действиях из App\Actions\ProjectTransferActions; удалённые операции — в App\Services\ProjectTransfer.