Как лучше выкатывать обновления для php+mysql сайта?
Какие есть лучшие способы выкатываний обновлений для сайта c FTP и SSH доступом, на обычном хостинге, использующего только php и mysql?
А если точнее, то хочу найти идеальный способ, при котором можно скопировать сайт с базой, вносить изменения как в файлы, так и в структуру БД (но не в данные - данные должны использоваться только актуальные) - добавлять таблицы и поля в имеющихся таблицах. А затем обновленную версию выкатывать на боевой сервер.
Так, чтобы при внесении обновлений в любой момент времени, даже когда сайтом пользуются, это не вызвало проблем для пользователей и вообще протекало незаметно. Просто при обновлении страницы появились бы новые функции.
Очень важно не потерять данные при обновлении и не помешать внесению новых данных во время выкатывания обновления.
Я пользуюсь PhpStorm на маке, если решение для него - было бы отлично.
Разработчик всего один (я), но желательно, чтобы была поддержка BitBucket (например).
1) Заводите локальный и удаленный репозитории
2) Делаете локальные изменения в коде + в отдельный файл(ы) скидываете миграции для БД
3) Заливаете произведенные изменения на удаленный сервер
4) Любой утилитой для деплоя или самописным велосипедом разворачиваете новую версию кода и производите миграции
5) Этими же утилитой/велосипедом переключаете проект с предыдущей версии на актуальную
Весь деплой сводится к тому, что утилита заходит на сервер(а) и выполняет на ней какие-то действия. Вам подойдет любая утилита, позволяющая через ssh выполнять команды. Например это может быть Капистрано (требует Руби) capistranorb.com
Советовать никакую не могу, т.к. пользовался только ей и то очень недолго - стало проще написать свой скрипт под свои нужды.
Допустим у вас есть папка на сервере /www/site/ В ней находится папка releases и символическая ссылка current, которая указывает на последнюю версию развернутого кода. Web-сервер настроен так, что корнем проекта получается папка /www/site/current/
Также на сервере есть git-репозиторий /git/site.git куда вы закидываете свои коммиты.
Утилите нужно
1) зайти на сервер
2) развернуть (клонировать) репозиторий в папку (например) /www/site/releases/YYYYMMDDHHMMSS/
3) если есть новые sql-миграции, то выполнить их
4) закинуть в репозиторий факт выполненных миграций, например, удалив файлы миграций из папки /www/site/releases/YYYYMMDDHHIISS/migrations/ и внеся это изменение в репозиторий
5) удалить предыдущую ссылку /www/site/current и создать новую на папку /www/site/releases/YYYYMMDDHHMMSS/
GIT. Идеальная система контроля версий, можно разворачивать и тестировать как угодно, а главное простая и очень мощная. Почитайте habrahabr.ru/post/123111 и пользуйтесь