Web アプリケーションの複数のインストールを効率的に管理するにはどうすればよいですか?
-
20-08-2019 - |
質問
私の経験から言えば、Web 開発プロセス中に遭遇する大きな問題の 1 つは、さまざまなサーバー間でさまざまなセットアップを最新の状態に保ち、安全に保つことです。
私の会社には独自の CMS があり、現在 100 以上のサーバーにインストールされています。現時点では、ハッキング風の FTP ベースのアプローチを使用し、特定の場所にあるアップグレード スクリプトと組み合わせて、すべての CMS セットアップをアップグレードしています。複数のカスタム モジュールが関係する場合、これらのセットアップを効率的に管理することはますます困難になり、リスクが高くなります。
- Web アプリケーションの複数のセットアップを安全かつ最新の状態に保つための最善の方法は何ですか?
- どうやって あなた やれ?
- クライアントに対する柔軟性を維持しながら、アプリケーションの複数の「ブランチ」を効率的に管理できるようにするための、アプリケーションのモジュール性に関する具体的なヒントはありますか?
いくつかのコンテキスト情報:私たちは主に LAMP スタック上で開発を行っています。CMS の販売に役立つ主な要因の 1 つは、クライアントが望むほぼすべてのものをプラグインできることです。これには、10 ~ 10,000 行のカスタム コードが含まれる可能性があります。
カスタム作業の多くは非常に小さなコードで構成されています。これらすべての小さなコードを Subversion で管理するのは、私にとって非常に面倒で非効率に思えます (私たちは毎週約 2 つの Web サイトを配信しているため、これにより 多く 枝の)。
何か見落としている点がございましたら、ぜひご連絡いただければ幸いです。
前もって感謝します。
切り上げする: まず最初に、ご回答いただきありがとうございます。これらはすべて本当に役に立ちます。
私はおそらく SVN ベースのアプローチを使用するでしょう。 ベンラムリー私が使用するものに最も近いソリューション。この質問に対する答えは他のユースケースでは異なる可能性があるため、実行の最後に最も多くの票を集めた答えを採用します。
回答を検討し、最も付加価値があると思われる回答に投票してください。
解決
私は、バージョン管理システムを使用して、あなたは堅牢性と効率性の面で最良の方法であることが判明でき、変更する必要がコードの一部を「分岐」だと思います。
それはあなたが必要であれば地元のいくつかの変更を維持しながら、あなたの「コア」は異なる「枝」にシームレスに備えて更新できるようになるので、分散バージョンシステムは、あなたのニーズに最も適している可能性があります。
の編集の私はよあなたが期待するように見えるものよりもはるかに少ない退屈だろう分散型バージョンシステムとの日付にすべてのことを追いついていることをかなり確信して:あなたはあなたの確信している変更を保持することができます「再他の場所で地元の必要があるとしていない、と分散型の側面は、あなたのデプロイされたアプリケーションのそれぞれが他から実際に独立しており、あなたが伝播することを意味するだけで修正が伝播することを意味しません。
他のヒント
、これは、アプリケーションの設計は、欠陥がある徴候である可能性があります。あなたのアプリケーションは、安定したコアコード、にプラグインするカスタムライブラリの拡張ポイント、テンプレートを使用して外観を変更する機能、および動作を変更し、設定ファイルを使用してプラグインをインストールする機能のセットを持っている必要があります。このように、あなたはすべてのクライアントに別々のSVNブランチを必要としません。そうではなく、通常のように、ソースコントロールにコアコードと拡張プラグイン・ライブラリーを保ちます。別のリポジトリでは、各クライアント用のフォルダを作成し、そこにすべてのテンプレートと設定ファイルを保持します。
ここでは、SVNの枝を作成することは、あなたの正気を保つことができます唯一の溶液であってもよいです。あなたの現在の状態では、それはあなたが間違いとめちゃくちゃにクライアントのサイトを作ってあげることはほぼ避けられないのです。少なくとも支店では、各クライアントのための安定したコードベースを持つことが保証されています。 SVNの枝を持つ唯一の落とし穴は、あなたが移動したり、枝にファイルの名前を変更する場合、それは(あなたが手動で行う必要があるだろう)トランクに戻ってダウンし、その変更をマージすることは不可能ですです。
グッドラック!
編集:私は上記に概説すべての原理を用いて適切に設計されたアプリケーションの例については、 MagentoのEコマースを参照に。 Magentoのは、私がこれまでに働いてきた最も強力な拡張性とカスタマイズが容易Webアプリケーションです。
私は間違っているかもしれませんが、アロンが後にのないのバージョン管理されているものを私には思えます。バージョン管理は素晴らしいです、と私は、彼らはすでにそれを使用していると確信しているが、カスタマイズされたインストールの何百もの上でアップデートを管理するために、あなたは何か他のものを必要とします。
私はのを目的に構築されたパッケージシステムの線に沿って何かを考えています。あなたは、その個々の依存関係と「保証の互換性」を追跡し、自動的にのみ「安全な」モジュールを更新するには、この情報を使用するモジュールのすべてのバージョンをお勧めします。
例えば。あなたはあなたの「ウィキ」モジュールの新しいバージョン3を構築したとしましょう。あなたは、あなたのアプリケーションを実行しているすべてのサーバーに新しいバージョンを伝播したいのですが、あなたは今、バージョン2は、すべてのデフォルトのインストールのために、それは問題ありませんので、Wikiのモジュール内のインターフェイスのいずれかに変更を加えたが、それは破ります古いインターフェースの上にカスタム拡張とインストール。十分に計画パッケージシステムは、このの世話をするでしょう。
セキュリティの質問に対処するために、あなたはあなたのパッチにデジタル署名を使用してになります。公開鍵ベースの署名のために利用できる優れたライブラリの多くは、これだけあなたの選択したプラットフォームの標準のようです何で行く、があります。
未誰かのは、このことを言ったかどうかを確認してください、そこに長い回答の多くはここにある、と私はそれらをすべて読んでいませんでした。
私はあなたのバージョン管理へのより良いアプローチは、あなたのCMSは、独自のリポジトリと、独自の各プロジェクトで独自に座って持っていることだと思います。
(または、これらのすべては、1つのレポ私は推測内のサブフォルダすることができます) それを必要とする各事業における外部:あなたは、そのトランク(またはあなたが好む場合は、特定のブランチ/タグ)SVNなどを使用することができます。
:この方法では、あなたがCMSに対して行った更新は、戻ってそのリポジトリにコミットすることができ、そしてそれらが更新svnをしていると、いつ他のプロジェクトに引き込まれます(スイッチのEDまたは外部のSVNです)。このやすくするの一環として、あなたは、SVN見た目が正常に動作するようにCMSおよびカスタム機能は、異なるフォルダに座ることを確認する必要があります。
IEます:
project
project/cms <-- cms here, via svn external
project/lib <-- custom bits here
project/www <-- folder to point apache/iis at
(必要な場合は、WWWのフォルダの下に、CMSとlibを持つことができます)。
あなたが望むようにこのは、各プロジェクトあなたのブランチ/タグをできるようになります。ブランチあたり/タグごとに外部の場所
:あなたはまた、SVNを切り替えることができます。の変化が住んで取得に関しては、私はあなたがすぐにFTPを取り除くことを示唆しているとのrsyncやsvnチェックアウト/エクスポートを使用すると思います。両方がうまく機能し、選択はあなた次第です。
私は、サーバーへのsvn輸出をrsyncing、rsyncのルートで最も経験を持っています。あなたはこのルートを下る場合は、いくつかのシェルスクリプトを書き、あなたはあなたにそれが-nフラグを使用して、同様にそれらをアップロードすることなく、アップロードするファイルを表示するには、テストシェルスクリプトを作成することができます。一つの試験を、一つは実際にそれを行うには、
- 私は一般的に、各環境用のスクリプトのペアを使用しています。あなたがアップロードを送信するためにパスワードを必要としないので、共有キー認証は、アクセスを与えられるようにサーバがどのようにセキュリティで保護さに応じて、有用である可能性がある。
あなたは、単にアップグレードする各プロジェクトに関連するシェルスクリプトを呼び出して一括アップグレードを、実行するために別のシェルスクリプトを維持することができます。
あなたはDrupalのでは見たことがありますか?いいえ、展開と交換してください、あなたが持っているものが、彼らはカスタマイズやサイト固有のモジュールを扱う方法を確認するためにしない?
基本的に、あなたがホスティングしているすべてのサイトのディレクトリがあり、「サイト」フォルダがあります。各フォルダ内には別のデータベースを指定することができ、別のsettings.phpです。最後に、あなたは(オプション)サイト内の「テーマ」と「モジュール」フォルダーを持つことができます。
これは、あなたが特定のモジュールのサイト固有のカスタマイズを行うと、これらのサイトに特定のモジュールを制限することができます。その結果、あなたはすべての大部分が完全に同一であり、唯一の違いは、重複して取得することをサイトで終わります。それはアップグレードや更新を処理し、実行可能なモデルを持っている可能性がある方法でそれを組み合わせています。
自己更新プロセスをコードに組み込みます。
更新をチェックし、クライアント用に構成したとき、どこで、どのように実行します。
ロールアウト前に新しいビルドでテストする必要があるモジュール (カスタムかどうかにかかわらず) のリストのようなものを作成する必要があります。アップデートを展開するときは、これらが正しくテストされ、統合されていることを確認する必要があります。あなたのデザインがこれに対応できることを願っています。
更新は、理想的にはいくつかの重要なステップで行われます。
a) 後戻りできるようにバックアップします。 いつでもアップデート全体をバックアウトできるはずです。そのため、最初にアプリケーションとデータベースのローカルアーカイブを作成することを意味します。
b) 更新監視プロセス - CMS システムに電話をかけ、新しいビルドを探してもらいます。
c) 空き状況に関する更新をスケジュールする - アップデートが利用可能になった瞬間にアップデートを実行したくない可能性があります。つまり、夜中にシステムアップデートを自動的に実行するには、何らかの cron/エージェントを作成する必要があります。週末または特定の日に更新するというクライアントの要件を考慮することもできます。また、1 日に 1000 台のクライアントを更新して技術サポートを受けることのないように、更新を段階的に展開することもできます。何らかの種類の段階的ロールアウトが有益になる可能性があります。
d) サイトを更新するためにメンテナンス モードを追加する -- サイトをメンテナンス モードにします。
e) SVN チェックアウトまたはダウンロード可能なパッケージ -- 理想的には、svn チェックアウト経由でデプロイできます。そうでない場合は、svn で生成されたパッケージをクライアント サイトにデプロイできるアーカイブに配信するようにサーバーをセットアップします。
f) DBスクリプトのデプロイ - データベースのバックアップ、更新、データの入力
g) サイトコードを更新する - これらはすべて 1 つのステップで実行されます。
h) それに対していくつかのテストを実行します。 コードにセルフテストが組み込まれている場合は、それが理想的です。
これが私がやることです...
クライアント固有のインクルード パス
- 共有された共通のコードが含まれています 共有/現在のバージョン/lib/
- サイト固有のコードが含まれています クライアント/foo.com/lib
- インクルード パスは、 クライアント/foo.com/lib, 、 その後 共有/ライブラリ
- すべてはバージョン管理システム内にあります
これにより、コードでは可能な限り共有ファイルが使用されるようになりますが、何らかの理由で特定のクラスまたはファイルをオーバーライドする必要がある場合は、クライアント固有のバージョンをそのフォルダーに書き込むことができます。
エイリアス共通ファイル
私の仮想ホスト構成には次のような行が含まれます
Alias /common <path>/shared/current_version/public_html/common
これにより、共通の UI 要素、アイコンなどをプロジェクト間で共有できるようになります。
各サイトのリリースに共通コードをタグ付けする
サイトをリリースするたびに、ブランチを作成して共通コードにタグを付け、その時点を効果的に凍結します。これにより、/shared/version_xyz/ をライブ サーバーにデプロイできるようになります。次に、仮想ホストに共通ファイルの特定のバージョンを使用させるか、最新の更新を取得させたい場合は current_version を指定したままにすることができます。
次のような人形のか(システム管理税込。アプリの展開のための)<ツールを見てきましたhref = "http://www.capify.org/" のrel = "nofollowをnoreferrer">カピストラーノの(これらに限定されるものではRubyOnRailsでのアプリケーションの展開ではなく)?
1つのオプションは、読み取り専用バージョン管理システム(Subversionの)を設定することです。ユーザーがアップデート(重要である可能性)についての選択肢を持ってしたくない場合は、自動的にあなたのCMSにリポジトリへのアクセスを統合し、メニューからアップデートを起動する、または可能性があります。バージョン管理システムを使用しても、簡単に別の枝を維持することができます。
の人々はすでにバージョン管理(私は機能のためにSubversionを好む)と分岐を使用することが最良の選択肢であろうと述べてきたように。 SourceForgeで利用できる他のオープンソースソフトウェアは、CruiseControlのと呼ばれます。その驚くべきは、あなたがサックスで転覆して任意のコード変更またはserversionに追加された新しいコードは、クルーズコントロールが自動的に知っているだろうし、あなたのために構築すればよいだろうという方法をCruiseControlのを設定します。それは時間のあなたの地獄を保存します。
私は、私の会社で同じように行っています。我々は4つのプロジェクトを持っており、異なるサーバーにそのプロジェクトを展開する必要があります。私は、コードベースのいずれかの変更が自動ビルドをトリガーするように設定cruiseconrolを持っています。そして別のスクリプトはサーバー上でそのビルドを展開します。あなたの行ってもいいです。
私は間違いなくあなたのディストリビューションのパッケージにソリューションファイルをオンにして伝播変更のためにそれを使用します。ため、私はRPMでそのことについてのRedhat / Fedoraのをお勧めしますし、それは私が上の経験を持っているものです。とにかくあなたもどんなのDebianベースのディストリビューションを使用することができます。
いつか前、私はサーバをホスティングしているISPを管理するためのLAMPソリューションを作りました。彼らはウェブホスティングの世話をするために複数のサーバを持っていたし、すべてのマシンは、自己完結したとオンラインマネージャを持っていたので、私は、私のマネージャーの変更を展開する方法を必要としていました。私は、ソリューションファイル(主にPHP)とRPMでrunnedいくつかの展開スクリプトを含むRPMパッケージを作りました。
、自動更新するために、我々は我々自身のRPMリポジトリはyum.conf内のすべてのサーバーに設定されていました。私は、信頼できるリポジトリから最新のRPMを毎日サーバーを更新するcrontabの仕事を設定します。
あなたの公開鍵ファイルとそれらを署名し、署名のみのパッケージを受け入れるように、RPMパッケージの信頼設定を使用することができますので、Trustinessも達成することができます。
フム、コンフィギュレーション・ファイルを追加するという考えだろうか?あなたは小さなスクリプトの多くは、何かをしていることを書きました。今、あなたはソースにそれらを構築し、それはそれを「緩和」べきではない、設定ファイルでそれらを操縦したい場合は?
すべての顧客のために支店を持つ一方では、私には指数関数的な成長のように見えます。そして、どのようにあなたが何かをやったし、また、他のすべての支店の変化「を作る」ことを忘れないでくださいどのエリア「知っている」でしょう。それは私には非常に醜います。
リビジョンコントロール、設定オプションおよび/または展開領収書の組み合わせが「良い」という考えのようだと思われる.....
あなたのコアソフトウェア上でその多くのバリエーションで、私はあなたが本当に個々のクライアントサイトへのトランクからアップデートをプッシュの上に滞在するバージョン管理システムが必要だと思う。
あなたはSubversionが面倒だと思うのであれば、、あなたはそれが本当に管理&追跡では良いことではありませんので、痛みのポイントは...個人的に、私は、このためにSubversionをお勧めしませんされます何のために良い感覚を持っています枝。あなたのコアソフトウェアのための外観を使用するbenlumleyの提案は良いものですが、あなたのクライアントのサイトのためのコアコードを微調整する必要がある場合、これは故障しています。
バージョン管理のためのGitリポジトリに見て、それが分岐するために構築され、それが高速ですいます。
あなたの展開を管理するためのカピストラーノをチェックアウト。それは多くの場合、レールに使用Rubyスクリプト、ですが、それは、リモートサーバー上のファイル管理のすべての種類、でも非ルビーのサイトのために使用することができます。それは自動的にあなたのリポジトリから最新バージョンをチェックアウトするだけでなく、FTP、SCP、rsyncを含む様々なstragegies介してリモートエンドにコンテンツを取得することができます。それは(あなたがバージョン管理でないかもしれませんあなたのサイト固有の設定ファイルをコピーすることができますので、例えば)展開プロセスの各ステップのためのコールバックフックが含ま提供の素晴らしい機能、およびリリースログシステム - シンボリックリンクを介して行わ - だからすぐにトラブルの場合には、以前のリリースにロールバックすることができます。
私は順番に各ブランチをチェックアウトし、最新の変更をアップロードするスクリプトとその通過した後、枝のリストとそのホストされている場所に設定ファイルをお勧めします。これは自動的に毎晩更新を行うためにcron'dすることができます。