Перенос проекта
Обзор
Перенос проекта позволяет переместить уже развёрнутый 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.