Рекомендации по развертыванию веб-приложений: как управлять локальными и живыми файлами? - PullRequest
9 голосов
/ 15 февраля 2009

Я пишу php веб-приложения и просто развертываю их через FTP. Чтобы это работало, у меня часто есть кое-какие настройки / отладки, учитывая, что у меня мало контроля над (бесплатным) веб-сервером, на котором меня размещают, поэтому то, что работает в моей локальной среде, может не сработать.

Например, я держу отдельный php-файл, содержащий class_db_myapp.php, который расширяет class_db.php конкретными параметрами БД: имя БД, имя пользователя, пароль, которые не будут одинаковыми локальными и живыми. (Для информации: в последнее время я начал использовать git для контроля версий)

По мере развития моего приложения некоторые файлы переименовываются / удаляются / создаются. Когда приходит время загружать новую версию, я должен либо положиться на свою память, чтобы знать, что мне нужно загрузить / удалить, либо просто удалить все / загрузить все. Но во втором случае мне нужно избегать удаления файла class_db_myapp.php ...

Я не нашел правильного решения для этого.

Каковы лучшие практики в этой области?

Возможно, я пропустил существующую дискуссию на эту тему, если да, пожалуйста, укажите мне на это.

Спасибо.

Ответы [ 7 ]

6 голосов
/ 15 февраля 2009

Если ftp-сервер поддерживает символические ссылки, вы можете использовать следующую технику:

  1. Сделать папку public_html символической ссылкой на папку, содержащую текущую версию. (например, "version1")
  2. Загрузите новую версию в новую папку.
  3. Когда загрузка будет завершена, измените символическую ссылку, чтобы новая версия стала активной.

Если что-то пошло не так, вы можете легко вернуться к предыдущей версии, снова изменив символическую ссылку.

Для базы данных и других настроек, которые отличаются в реальной среде, есть несколько опций:

  • Создайте файл, содержащий среду: «live» или «local», и вставьте «if if» в код, основываясь на настройке среды.
  • Если вы можете дешифровать среду в php, используйте это вместо файла.
  • Поместить все настройки в файл вне папок "versionX".
2 голосов
/ 16 февраля 2009

Перемещение файлов

Вы ищете rsync или что-то вроде rsync. Rsync - это программа / система, которая позволит вам синхронизировать один набор файлов с другим. Говоря упрощенно, он может просматривать ваш исходный код и производственный код и загружать только другие файлы.

rsync -av --cvs-exclude /soure/dir user@example.com:./source/dir    

Флаг --cvs-exclude назван немного обманчиво. Это заставит rsync игнорировать файлы, которые игнорирует программа rcs cvs, а не просто .cvs каталоги. Вы можете получить больше информации о флагах, набрав

rsync --help

На сервере, на котором размещается ваше приложение, должен быть запущен демон rsync, но в наши дни это нормально.

Если вы хотите стать действительно умным, вы можете настроить rsync с помощью ключей SSH, и вам даже не нужно будет вводить пароль. Однако это ни в коем случае не является необходимым.

Другая информация о конфигурации

Разделите любую информацию о конфигурации, которая будет варьироваться между вашими локальными и действующими серверами, в один файл или один набор файлов. Вы можете передать эти файлы на сервер в режиме реального времени через FTP и использовать опцию --exclude, чтобы rsync проигнорировал эти файлы.

2 голосов
/ 15 февраля 2009

1) Чтобы решить проблему «другой конфигурации на dev и live серверах», я использую это:

// Change 'localhost' to your dev server's address
define('IS_LIVE', 'localhost' != $_SERVER['HTTP_HOST']);

// Database configuration
$db_cfg = IS_LIVE?
  array(...): // Live server config
  array(...); // Dev server config

2) Чтобы обеспечить синхронизацию файлов dev и live, я использую Beyond Compare , инструмент визуального сравнения, который позволяет мне сравнивать целые каталоги, в том числе удаленные, через (S) FTP.

Я настроил профиль так, чтобы в левом окне отображались файлы на сервере dev, а в правом - на живом сервере. Таким образом, я вижу, какие различия существуют между серверами (измененные, отсутствующие или добавленные файлы), и позволяет мне легко копировать между ними целые каталоги, файлы или определенные строки в файлах. Очень полезно.

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

1 голос
/ 24 декабря 2009

Инструмент сборки, такой как phing или ant , должен иметь возможность делать то, что вы хотите сделать. С помощью небольшого количества сценариев вы сможете автоматизировать шаги, которые вы в настоящее время предпринимаете, чтобы получить конфигурацию приложения и загрузить приложение с помощью одной команды.

1 голос
/ 15 февраля 2009

, поскольку у вас нет доступа по ssh, протестируйте и зафиксируйте все на локальном компьютере. тогда вы можете использовать функцию сравнения каталогов ftp-клиента filezilla , которая позволяет увидеть, какие файлы были изменены. Вам не нужно ничего запоминать.

Рекомендуется использовать на сервере git push. но так как ваши возможности ограничены, вышеупомянутое решение подойдет просто отлично.

1 голос
/ 15 февраля 2009

Не уверен, что это идеально, но, например, в моей конфигурации входа в БД я могу определить, на каком хосте выполняется код (только частичный фрагмент ниже):

$active_group = "default";
if($_SERVER['SERVER_NAME'] == 'argent.local' || 
   $_SERVER['SERVER_NAME'] == 'beta.website.com') 
   $active_group = "development";

$db['default']['hostname'] = "localhost";
$db['default']['username'] = "username";
$db['default']['password'] = "password";
$db['default']['database'] = "dbname";
$db['default']['dbdriver'] = "mysql";

$db['development']['hostname'] = "localhost";
$db['development']['username'] = "username_dev";
$db['development']['password'] = "password_dev";
$db['development']['database'] = "dbname_dev";
$db['development']['dbdriver'] = "mysql";

(здесь argent.local - мой локальный dev-блок). Я делаю это и в нескольких других местах, например, в основном классе я включаю / отключаю вывод ошибок PHP в зависимости от того, является ли сервер рабочим или локальным dev (поскольку вывод ошибок очень полезно во время разработки, но я не хочу, чтобы это выводилось в производстве):

if($_SERVER['SERVER_NAME'] == 'argent.local' || 
   $_SERVER['SERVER_NAME'] == 'beta.website.com') 
    error_reporting(E_ALL);
    else error_reporting(0);

Таким образом, код, который я проверяю в SVN, будет работать как на live, так и на блоках dev без необходимости отслеживать, где и где развернуть. Таким образом, я могу стереть все существующие файлы и просто заново развернуть их, не беспокоясь о перемещении любых файлов.

0 голосов
/ 18 февраля 2009

Я бы порекомендовал Capistrano, который представляет собой обобщенный инструмент развертывания из мира Rails. Он в основном разработан с нуля для управления развертыванием. Вот домашняя страница Capistrano:

http://capify.org/

и вот несколько сайтов, показывающих, как другие используют Capistrano для развертывания PHP:

http://www.simplisticcomplexity.com/2006/08/16/automated-php-deployment-with-capistrano/

http://donc.wordpress.com/2006/10/29/deploying-php-with-capistrano/

Примечание: вам придется написать / настроить скрипт развертывания, но Capistrano должен позволить вам делать то, что вам нужно.

...