Как эффективно управлять несколькими установками веб-приложения?

StackOverflow https://stackoverflow.com/questions/502774

Вопрос

По моему опыту, одна из самых больших проблем, с которыми мы сталкиваемся в процессе веб-разработки, заключается в обновлении различных настроек и обеспечении безопасности на разных серверах.

У моей компании есть собственная CMS, которая в настоящее время установлена более чем на 100 серверах.На данный момент мы используем хакерский подход, основанный на FTP, в сочетании со сценариями обновления в определенных местах для обновления всех наших настроек CMS.Эффективное управление этими настройками становится все более сложным и рискованным, когда задействовано несколько пользовательских модулей.

  • Каков наилучший способ обеспечить безопасность и актуальность нескольких настроек веб-приложения?
  • Как сделать ты сделать это?
  • Есть ли какие-либо конкретные советы относительно модульности приложений, чтобы сохранить гибкость по отношению к нашим клиентам, но при этом иметь возможность эффективно управлять несколькими "ветвями" приложения?

Некоторая контекстуальная информация:мы в основном разрабатываем на базе LAMP-стека.Одним из главных факторов, который помогает нам продавать нашу CMS, является то, что мы можем подключать практически все, что захочет наш клиент.Это может занять от 10 до 10000 строк пользовательского кода.

Большая часть пользовательской работы состоит из очень маленьких фрагментов кода;управление всеми этими небольшими фрагментами кода в Subversion кажется мне довольно утомительным и неэффективным (поскольку мы доставляем около 2 веб-сайтов каждую неделю, это привело бы к много из филиалов).

Если есть что-то, что я упускаю из виду, я хотел бы услышать это от вас.

Заранее благодарю.


Обзор: прежде всего, спасибо за все ваши ответы.Все это действительно полезно.

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

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

Это было полезно?

Решение

Я думаю, что использование системы контроля версий и "разветвление" части кодов, которые вы должны изменить, может оказаться наилучшим подходом с точки зрения надежности и эффективности.

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

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

Другие советы

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

На данный момент создание ветвей SVN может быть единственным решением, которое поможет вам сохранить здравомыслие.В вашем текущем состоянии почти неизбежно, что вы совершите ошибку и испортите сайт клиента.По крайней мере, с филиалами вы гарантированно будете иметь стабильную кодовую базу для каждого клиента.Единственная проблема с ветвями SVN заключается в том, что если вы перемещаете или переименовываете файл в ветке, невозможно объединить это изменение обратно в магистраль (вам придется делать это вручную).

Удачи!

Редактировать:Пример хорошо разработанного приложения, использующего все принципы, которые я изложил выше, см. Электронная коммерция Magento.Magento - это самое мощное, расширяемое и простое в настройке веб-приложение, с которым я работал до сих пор.

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

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

Например.допустим, вы создали новую версию 3 вашего модуля "Wiki".Вы хотите распространить новую версию на все серверы, на которых запущено ваше приложение, но вы внесли изменения в один из интерфейсов в рамках модуля Wiki начиная с версии 2.Теперь, для всех установок по умолчанию, это не проблема, но это нарушило бы установку пользовательских расширений поверх старого интерфейса.Хорошо спланированная система упаковки позаботилась бы об этом.

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

Не уверен, говорил ли кто-то это, здесь много длинных ответов, и я не прочитал их все.

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

Затем вы можете использовать его магистраль (или определенную ветвь / тег, если предпочитаете) в качестве svn:external в каждом проекте, которому это требуется.Таким образом, любые обновления, которые вы вносите в CMS, могут быть зафиксированы обратно в ее репозиторий и будут перенесены в другие проекты по мере их обновления svn (или внешним является svn: switch 'ed).

Чтобы упростить это, вам нужно будет убедиться, что CMS и пользовательские функциональные возможности находятся в разных папках, чтобы svn externals работал должным образом.

IE:

project
 project/cms <-- cms here, via svn external
 project/lib <-- custom bits here
 project/www <-- folder to point apache/iis at

(при необходимости у вас могут быть cms и библиотека в папке www)

Это позволит вам разветвлять / помечать каждый проект по своему усмотрению.Вы также можете переключать svn: внешнее расположение для каждой ветви / тега.

Что касается получения изменений в режиме реального времени, я бы посоветовал вам немедленно избавиться от ftp и использовать rsync или svn checkout / exports.И то, и другое работает хорошо, выбор за вами.

У меня больше всего опыта работы с маршрутом rsync, повторной синхронизации экспорта svn на сервер.Если вы пойдете по этому пути, напишите несколько сценариев оболочки, и вы можете создать тестовый сценарий оболочки, который покажет вам файлы, которые он будет загружать, не загружая их также, используя флаг -n.Обычно я использую пару скриптов для каждой среды - один для тестирования, а другой для того, чтобы действительно это сделать.

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

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

Вы смотрели на Drupal?Нет, не для того, чтобы развернуть и заменить то, что у вас есть, а для того, чтобы посмотреть, как они обрабатывают настройки и специфичные для сайта модули?

По сути, есть папка "сайты", в которой есть каталог для каждого сайта, который вы размещаете.Внутри каждой папки находится отдельная settings.php, которая позволяет вам указать другую базу данных.Наконец, вы можете (необязательно) иметь папки "темы" и "модули" внутри сайтов.

Это позволяет вам настраивать определенные модули для конкретного сайта и ограничивать определенные модули этими сайтами.В результате вы получаете сайт, на котором подавляющее большинство всего абсолютно идентично, и дублируются только различия.Объедините это с тем, как он обрабатывает обновления, и у вас может получиться жизнеспособная модель.

Встроите в код процесс самообновления.
Он проверит наличие обновлений и запустит их, когда / где / как вы настроили его для клиента.

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

Обновления в идеале состоят из нескольких ключевых шагов.

  1. а) Сделайте резервную копию, чтобы вы могли отступить. Вы должны иметь возможность отказаться от выполнения всего обновления в любое время.Итак, это означает создание локального архива приложения и базы данных во-первых.

    б) Процесс мониторинга обновлений - Попросите систему CMS позвонить домой, чтобы поискать новую сборку.

    в) Обновляйте расписание по доступности - Скорее всего, вы не хотите, чтобы обновление запускалось сразу же, как только оно станет доступно.Это означает, что вам нужно будет создать какой-либо cron / agent для автоматического обновления системы посреди ночи.Вы также можете рассмотреть требования клиента для обновления по выходным или в определенные дни.Вы также можете замедлить развертывание своих обновлений, чтобы не обновлять 1000 клиентов за 1 день и не получать адскую техническую поддержку.Поэтапное развертывание какого-либо вида может быть полезным для вас.

    d) Добавьте режим обслуживания для обновления сайта -- Переведите сайт в режим обслуживания.

    e) Оформление заказа SVN или загружаемые пакеты -- в идеале вы можете выполнить развертывание через svn checkout, а если нет, настройте свой сервер для доставки пакетов, сгенерированных svn, в архив, который можно развернуть на клиентских сайтах.

    f) Развертывание скриптов базы данных - Создавайте резервные копии баз данных, обновляйте их, заполняйте

    g) Обновить код сайта - Вся эта работа за один шаг.

    h) Проведите с ним несколько тестов. Если в ваш код встроены самопроверки, это было бы идеально.

Вот что я делаю...

Путь включения, зависящий от конкретного клиента

  • Общий, распространенный код находится в общий/current_version/библиотека/
  • Специфичный для сайта код находится в клиенты/foo.com/библиотека
  • Путь включения настроен на включение из клиенты/foo.com/библиотека, а затем общий ресурс / библиотека
  • Все дело в системе контроля версий

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

Псевдоним общих файлов

Конфигурация моего виртуального хоста будет содержать строку типа

Alias /common <path>/shared/current_version/public_html/common

Который позволяет совместно использовать общие элементы пользовательского интерфейса, иконки и т.д. В разных проектах

Помечайте общий код тегом к каждому выпуску сайта

После каждого выпуска сайта я помечаю общий код, создавая ветку, чтобы эффективно заморозить этот момент времени.Это позволяет мне развернуть / shared/version_xyz/ на работающем сервере.Затем я могу заставить виртуальный хост использовать определенную версию общих файлов или оставить его указывающим на current_version, если я хочу, чтобы он получал последние обновления.

Смотрели ли вы на такие инструменты, как Марионетка (для системного администрирования вкл.развертывание приложения) или Капистрано (развертывание приложений в RubyOnRails, но не ограничиваясь этим)?

Одним из вариантов было бы настроить систему контроля версий, доступную только для чтения (Subversion).Вы могли бы интегрировать доступ к репозиторию в свою CMS и вызывать обновления через меню или автоматически, если вы не хотите, чтобы у пользователя был выбор в отношении обновления (это может быть критично).Использование системы контроля версий также позволило бы вам легко сохранять разные ветви

Как люди уже упоминали, лучшим вариантом было бы использование контроля версий (я предпочитаю Subversion из-за функциональности) и ветвления.Другое программное обеспечение с открытым исходным кодом, доступное на sourceforge, называется cruisecontrol.Это удивительно, вы настраиваете cruisecontrol с subversion таким образом, что о любой модификации кода или новом коде, добавленном в serversion, Cruise control узнает автоматически и выполнит сборку за вас.Это сэкономит вам кучу времени.

Я поступил точно так же в своей компании.у нас есть четыре проекта, и мы должны развернуть этот проект на разных серверах.Я настроил cruiseconrol таким образом, что любое изменение в базе кода запускает автоматическую сборку.и другой скрипт развернет эту сборку на сервере.вы готовы к отъезду.

Если вы используете стек LAMP, я бы определенно превратил файлы решений в пакет вашего дистрибутива и использовал его для распространения изменений.Я рекомендую в этом отношении Redhat / Fedora из-за RPM, и это то, в чем у меня есть опыт.В любом случае, вы также можете использовать любой дистрибутив на базе Debian.

Некоторое время назад я создал решение LAMP для управления серверами хостинга интернет-провайдера.У них было несколько серверов для веб-хостинга, и мне нужен был способ развернуть изменения моего менеджера, потому что каждая машина была автономной и имела онлайн-менеджер.Я создал RPM-пакет, содержащий файлы решений (в основном php) и некоторые сценарии развертывания, которые запускались с RPM.

Для автоматического обновления у нас был собственный репозиторий RPM, установленный на каждом сервере в yum.conf.Я настроил задание crontab на ежедневное обновление серверов последними RPM из этого доверенного репозитория.

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

Хм, может быть, стоит добавить файлы конфигурации?Вы написали, что множество маленьких скриптов что-то делают.Теперь, если бы вы встроили их в исходные тексты и управляли ими с помощью файлов конфигурации, разве это не должно было бы "облегчить" это?

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

Похоже, что комбинация элементов управления версиями, параметров конфигурации и / или квитанций о развертывании кажется "хорошей" идеей.....

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

Так что, если вы считаете, что Subversion будет утомительной, у вас есть хорошее представление о том, какими будут болевые точки...Лично я бы не рекомендовал Subversion для этого, поскольку на самом деле она не так хороша в управлении и отслеживании ветвей.Хотя предложение benlumley использовать внешние компоненты для вашего основного программного обеспечения является хорошим, это не работает, если вам нужно настроить основной код для ваших клиентских сайтов.

Загляните в Git для контроля версий, он создан для ветвления, и это быстро.

Ознакомьтесь с Capistrano для управления вашими развертываниями.Это скрипт на ruby, часто используемый с Rails, но его можно использовать для всех видов управления файлами на удаленных серверах, даже на сайтах, не связанных с ruby.Он может передавать содержимое на удаленный сервер с помощью различных методов, включая ftp, scp, rsync, а также автоматически извлекать последнюю версию из вашего репозитория.Приятные функции, которые он предоставляет, включают перехватчики обратного вызова для каждого шага процесса развертывания (напримертаким образом, вы можете скопировать файлы конфигурации для вашего сайта, которые могут отсутствовать в системе управления версиями), и систему журнала выпуска - выполняемую с помощью символических ссылок - чтобы вы могли быстро вернуться к предыдущей версии в случае возникновения проблем.

Я бы порекомендовал создать конфигурационный файл со списком филиалов и их размещенным местоположением, а затем запустить его с помощью скрипта, который проверяет каждую ветвь по очереди и загружает последние изменения.Это может быть cron'd для автоматического обновления по ночам.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top