ヘイクスレット教育プロジェクトの裏側

こんにちは、Habr!







前の記事で、 Hexlet教育プロジェクトの新しいバージョンについて説明しました。 投票で、次の記事はプラットフォームの技術的な実装に関するものになると決めました。



Huxletは、実際の開発環境で実践的なプログラミングレッスンを作成するためのプラットフォームであることを思い出させてください。 真の開発環境とは、ネットワークに接続された完全なマシンを意味します。 この重要な詳細により、Hakesletは他の教育プロジェクト(CodecademyやCodeSchoolなど)と区別されます。シミュレーターはありません。 これにより、プログラミングだけでなく、データベース、サーバー、ネットワーク、フレームワークなどの操作も学習できます。 一般に、Unixマシンで実行する場合、Hexletでトレーニングできます。 同時に、それを実現するかどうかにかかわらず、ユーザーはテスト駆動開発(TDD)を使用します。これは、ユーザーの決定が単体テストによってチェックされるためです。



この投稿では、Hexletプラットフォームのアーキテクチャと使用するツールについて説明します。 このプラットフォームで実際にレッスンを作成する方法について-次の記事で。









バックエンドのほぼ全体がRailsで記述されています。 すべてがAmazon Web Services(AWS)で実行されます。 最初は、AWSインフラストラクチャにあまり接続しないようにしようとしていましたが、徐々により多くのサービスを使用し始めました。 RDS(リレーショナルデータベースサービス)では、PostgreSQL(メインベース)とRedisが回転しています。 そのおかげで、バックアップ、複製、更新について心配することはできません-すべてが自動的に動作します。 また、RDSでは、自動フェールオーバー-multiAZを使用します。 メインマシンが落ちた場合、同期レプリカは別のアベイラビリティゾーンで自動的に立ち上がり、数分以内にDNSレコードが新しいIPアドレスにマッピングされます。



キューイング用のSQS(シンプルキューサービス)。 すべてのメールはSESを介して送信され、ドメインはRoute53に存在します。 Amazon Simple Notification Service(SNS)は、メッセージ配信ステータスメッセージをSQSキューに送信します。 画像とファイルはS3に保存されます。 最近、AmazonのCDNであるCloudfrontを使用しています。



プラットフォーム全体の基礎はDockerです。



各サービスはコンテナで機能します。 1つのコンテナ= 1つのサービス。 ほとんどのコンテナイメージはtutum.coの事前作成イメージです 。 アプリケーションのリポジトリをDocker Registryに保存します。 ステージングの場合、イメージはDockerfileにコミットするときに自動的に収集されます。 コード自体はGithubに保存されます。 本番環境では、別のサーバーでAnsibleを介して画像を収集します。 ビルドは、条件に応じて20〜60分というかなりの時間を要するため、「Quick Fix Production」オプションは使用できません。 しかし、これは問題ではなく、逆に規律です。 実稼働環境にデプロイするときに何か問題が発生した場合、1つのコンテナと前のコンテナを強制終了します。 データベースは水平方向にのみ成長し(khm-khm、優れたアーキテクチャを備えたプロジェクトに典型的です)、異なるバージョンのコードでベースを使用でき、競合は発生しません。 そのため、ロールバックはほとんどの場合、コードのバージョンの単純な置き換えです。



最初は、展開のためにCapistranoを使用しましたが、最終的にはAnsibleを支持して放棄しました。 少し変わっていますが、Ansibleは設定をリモートサーバーに配信し、upstartを実行するだけで、既にイメージが更新されています。 このスキームでは、サーバーに特別なものをインストールする必要はありません; Ansibleでは、sshアクセスのみが必要です。 タグはバージョン管理(v64、v65など)に使用され、ステージングへの展開では常に最新バージョンのコードが使用されます。



ところで、私たちはAnsibleが大好きなので、 実用的なコースを作成しました-「Ansible:Introduction」







大きなプラス-開発では、制作に関してはほぼ同一のAnsibleプレイブックを使用します。 そのため、インフラストラクチャは可能な限りローカルで実行されるため、「LAN上では機能しました」などのエラーが最小限に抑えられます。 その結果、展開プロセスは次のようになります:githubのDockerfileでの新しいコミット-> dockerレジストリでの新しいビルドの起動-> Ansible Playbookの起動->サーバー上の更新された構成-> upstartの起動->新しいイメージの取得



Amazonianバランサーも使用します。habraeffectの場合は、10〜20分で追加の車を上げることができます。 このようなスキームの重要な条件は、最終的なWebサーバーがステートレス状態を保存せず、データを保存しないことです。 これにより、迅速にスケーリングできます。



Route53(ドメイン管理/ DNS)とバランサーについても、Amazonが大好きです。 「分散システム」サイクルの教訓があります





人気のあるレッスンのページ。



このプロジェクトの本質は、人々が実際の環境で学習できるようにすることです。このため、各コンテナをユーザーが実際の演習を行うまで上げます。 これらのコンテナは、特別な「評価」サーバーで発生します。 Dockerのみがあり、 昇龍拳からのみ非同期でアクセスできます。



最初のHexletプロトタイプでは、システムはユーザーがコンピューターで実際のタスクを実行する必要がありましたが、現在はすべての作業がブラウザーで行われているため、ダウンロードやインストールは必要ありません。 これを行うには、ユーザーがファイルを編集してプログラムを実行できるブラウザー開発環境が必要でした。 多くのクラウドベースのIDEがあり、自尊心のあるスタートアップと同様に、既成のソリューションを最大限に活用したいと考えました。 たくさんの機能を備えたクールなIDEを見つけました(Gitとの統合でも)が、他の人のコード(発明された自転車でいっぱい)を維持するコストを見積もり、独自のシンプルなIDEを書くことにしました。 ここで、別の新しいテクノロジー-ReactJSとFluxコンセプトが私たちを救いました。 数週間前 Hexlet IDEの新しいバージョンがリリースされ多くの機能と視覚の改善が行われました。





動作中の新しいバージョンのHexlet IDE。



最初の数週間で、すべてのメトリック(マシンの負荷などのシステムメトリックと、登録や支払いなどのビジネスメトリックの両方)をInfluxDBデータベースに送信し、グラフをGrafanaでレンダリングしました。 しかし、今ではサードパーティのサービス、たとえばDatadogに切り替えています。 彼はAWSと統合し、インシデントが発生したときにアラートを設定できます。



Huxletチーム全体がSlackに座っており、特別な#operationsチャットで、プロジェクトで発生するすべてのこと(展開、エラー、ビルドなど)を確認します。







私たちのチームは独自にレッスンを作成し、プロの開発者の中から著者を招待します。 開発部門内でのトレーニングやワークショップの実施などのために、個人または企業は誰でも、また社内で使用するためにレッスンの作成者になることができます。



興味がある場合は、info @ hexlet.ioに書き込み、Facebookの著者グループに参加してください。



よろしくお願いします!



All Articles