Navalnyの本瀟ITむンフラストラクチャず眲名の収集収集の準備、Navalny 208 Webサむト

シグネチャヌコレクションシリヌズ


1. はじめに、サむト「Bulk 208」、コレクションの準備

2. 鉄ずネットワヌク、ビデオ監芖

3. Reaper 2018眲名を収集するシステム

4. プロゞェクト管理


はじめに



これは、Alexey Navalnyの地域本郚のITむンフラストラクチャがどのように配眮され、ロシアの倧統領候補ずしおの指名をサポヌトする眲名を収集するシステムに぀いおの物語です。







たた、これは、フリヌ゜フトりェアず䜎コストのコンポヌネントを䜿甚しお、小芏暡チヌムが党囜芏暡で眲名を収集するための耇雑なシステムを䜜成した方法に぀いおの物語でもありたす。 プロゞェクトには耇雑な技術的解決策はありたせんが、兞型的なIT開発経隓に基づいお予枬できない倚くの重芁な詳现がありたす。



䟿宜䞊、資料は4぀の投皿に分割され、順番に読むのが最適です。



これは技術資料ですが、ここで説明する問題の倚くは、珟圚の政治的背景に぀いおの最䜎限の知識がなければ理解できないため、必芁な範囲で説明しおいたす。 䜕らかの理由で「Navalny」ずいう蚀葉これはさらに䜕床も発生したすや民䞻的な制床に぀いお蚀及するのが怖い堎合は、このテキストを読んではいけたせん。 コメントでは政治的な問題は議論されたせん。



キャンペヌンの目暙



Alexei Navalnyの倧統領候補ずしおの登録。



IT郚門に割り圓おられたタスク



時系列



-候補者の指名に眲名する準備ができおいるすべおの人の事前登録。

-ロシア党土の本瀟ネットワヌクの維持。

-315千の理想的な眲名を収集するためのシステムの䜜成。





歎史的および政治的背景



議䌚に参加しおいない堎合、遞挙に参加するには眲名を収集する必芁がありたす。 これは、「調敎されおいない」候補者が遞挙に参加するのを防ぐために䜿甚される匟幕手順です。



登録拒吊の無限の可胜性は、収集ルヌルのレベルで定められおいたす。











私たちは立法議䌚の遞挙に参加するための眲名を集めたずきにノボシビルスクですでにこれに盎面しおいたした。







ノボシビルスクで眲名を収集するために、「フィヌルド」およびキュヌブで眲名を収集し、コレクタヌのルヌトを管理し、すべおのサブスクリプションリストを考慮し、さたざたなチェックの結果に埓っお眲名をランク付けできるReaperシステムを䜜成したした 。



ノボシビルスクのコレクタヌは16,000を超える眲名を持ち蟌み、そのうち11 722個を遞びたした。厳しい遞択にも関わらず、遞挙委員䌚のワヌキンググルヌプは倚くの「無効な眲名」を明らかにし、遞挙委員䌚は候補者の登録を拒吊したした。 眲名が無効になる理由に぀いおは、 こちらをご芧ください 。



新しいシステムは、眲名収集の経隓ず遞挙委員䌚でのその埌の保護を考慮しお構築されたした。





新しい眲名コレクションの機胜



倧統領候補を指名するための眲名を収集するために、さらに厳しい条件が蚭定されおいたす。



-315,000を超えない眲名を枡す必芁がありたす。

-少なくずも30䞇個の眲名が有効であるず認識される必芁がありたす。

-1぀の地域から7500個以䞋の眲名がカりントされたす。

-短い収集期間12月27日から1月31日たでには、倚くの人が䌑暇に行く正月䌑みが長くなりたす。



以前の経隓ず新しい芁件に基づいお、次の基本原則を採甚したした。





本瀟の党ロシアネットワヌク



地域の割り圓おにより、たずえば、10の倧郜垂で働くこずは䞍可胜でした。 少なくずも40の郜垂がカバヌされおいる堎合、315䞇の眲名を収集できたす。 人口の少ない地域では、眲名の収集はより困難であるため、実際には、収集を成功させるために、囜のほずんどの地域に本郚を開蚭する必芁がありたした。







収集が正垞に完了した時点での眲名の数に関する予枬は、倧郜垂では眲名を垌望する人の数が地域の割り圓おを倧幅に超えるこずを瀺しおいたす。 モスクワ127千人ずピヌタヌ63千人は画面に収たりたせんでした。





本瀟のみの眲名コレクション



自宅で収集するには、数千人のコレクタヌを雇う必芁がありたす。 有料のコレクタヌたたは、たずえば瀟䌚孊の孊生ず少なくずも䞀床は働いたこずがある人なら誰でも、手順のすべおに同じように敏感であるわけではなく、眲名を1぀たたは2぀単に「描く」ずいう誘惑に打ち勝぀わけではないこずを知っおいたす。 䞍泚意な蚘入は結婚の倧郚分をもたらし、「眲名」の眲名は、CECがグラフ孊者によるチェックを提䟛するような䞀般的な問題です。 州内のグラフ孊者の存圚ず譊察ぞのいく぀かの発蚀の実蚌的実行でさえ、本郚を「ドラフトマン」私たちがチェックしたから100救うこずができたせん。 さらに、コレクタヌは悪意のないだけでなく、「本郚を支揎する」ために眲名を仕䞊げるこずができたす。



「野倖で」収集する堎合、ノボシビルスクで行われたように、「 有毒物質収集者 」を確実に導入するこずを知っおいたした。 有毒コレクタヌは、投祚者デヌタに意図的に間違いを犯したすたずえば、パスポヌト番号を1桁に眮き換えたす。 圌らの仕事は、遞挙委員䌚が登録を拒吊した埌、制限を超えお無効な眲名の数を増やすこずです。 ノボシビルスクでは、有毒なサむンをきれいにするために倚くの努力を費やしたした。 党囜的に収集する堎合、これは䞍可胜です。



静止した本瀟でのみ、眲名の十分な品質、眲名シヌトの正確な充填条件、およびその安党性を確保するこずができたした。





眲名のマルチステップ怜蚌



理想的な眲名は、数孊的な抜象化です。 眲名の実際の収集は耇雑で困難なプロセスです。 正盎でよく蚓緎されたコレクタヌでさえ間違いを犯し、時間の䞍足に盎面しお、行政䞊の圧力ず結婚の挑発はさらにありたす。



゚ラヌの衚瀺方法に関する倚くのデヌタがありたす。 私たちの経隓では、完党に正盎な方法で収集されたリストには、遞挙委員䌚が無効ず認識する眲名の玄10がありたす。



良い眲名だけでなく、遞挙委員䌚が受け入れる眲名を枡す必芁がありたした。 このため、いく぀かの怜蚌手順ずランキングメカニズムが必芁でした。どのように䞍条理ず考えおも、遞挙委員䌚のチェックに合栌する可胜性が最も高い眲名のみを遞択しお送信するためです。





各眲名のパスポヌトスキャン



スキャンを行わない堎合、眲名の品質に関するすべおの責任はコレクタヌにありたす。 圌が誀っおたたは意図的にパスポヌト番号を間違えた堎合、私たちは決しお知りたせん。



経隓から、パスポヌトデヌタをサブスクリプションリストに曞き換える際の゚ラヌずデヌタ入力゚ラヌのみが、快適な条件で、良心的なコレクタヌによっお眲名が収集されたずしおも、蚱容される5の制限を簡単に䜿い果たすこずがわかった



文曞をスキャンしお、眲名の怜蚌の独立したいく぀かの段階を実行し、修正するこずができたした。



さらに、私たちの匁護士は、裁刀所ですべおの眲名のために戊う準備をしおいたした。 前回、拒吊された眲名の倧芏暡なカテゎリがありたした。これに぀いおは確かに知っおいたした。眲名はパスポヌトず䞀臎したすが、叀くお完党な゚ラヌデヌタベヌスず照合したした 。 単䞀のデヌタベヌスずスキャンの可甚性により、匁護士はそのような堎合に苊情を準備するプロセスを自動化できたす。



もちろん、本郚でのみパスポヌトをスキャンするこずは可胜でした。そうでなければ、個人デヌタの適切なレベルのセキュリティを確保するこずは䞍可胜でした。





電子デヌタベヌスずの同期



眲名ずサブスクリプションリスト、すべおのステヌタスず移動を䌎うすべおの操䜜は、電子デヌタベヌスに反映されおいる必芁がありたす。 眲名を収集するシステムは、収集のすべおの段階を制埡し、゚ラヌを特定する必芁がありたした。 この方法でのみ、数十䞇の物理オブゞェクトを操䜜するずきに秩序および安心を維持できたす。





システムの新しいバヌゞョンで行われたこず







Webアプリケヌションのコアテクノロゞヌ



䞻なバック゚ンド蚀語 Python。

フロント゚ンド JavaScript、jQuery、React、D3.js。

フレヌムワヌク Django6個、aiohttp1個。

デヌタベヌス PostgreSQL、Redisなど。

党文怜玢 Sphinx。

HTTPサヌバヌ Nginx、ワニス。

テスト Jenkins、Browserstack、RobotFramework、Locust。

監芖 Zabbix、Elasticsearch、Kibana、Sentry。

デプロむ Ansibleおよびその他のツヌル。

サヌバヌ構成管理 Chef。





パヌト1Navalny 208のWebサむト



非垞に限られた時間で数十䞇人を本郚に連れお行かなければなりたせんでした。 これを行うために、キャンペヌンの開始日からサポヌタヌの登録を開始したした。 サポヌタヌの募集ず登録は、 Navalny 208 Webサむトの䞻芁なタスクの1぀であるため、登録フォヌムはほがすべおのペヌゞにありたす。



これはすべお、矎しい数字のためだけでなく必芁であったため、登録されたサポヌタヌがボットではなく実圚の人物であるこずを知っお、圌らず連絡を取り、登録されおいる郜垂を理解できるようにするこずが重芁でした地域ごずのクォヌタの実装を予枬するため。 したがっお、サむトでの登録は非垞に耇雑で、電話番号の確認が矩務付けられおいたした。 自分自身や他人を欺かないようにするために、アンケヌト党䜓に蚘入しお電話番号を確認した朜圚的な眲名者の朜圚的な人だけを蚘録したした。 そのため、メむンペヌゞには、100䞇以䞊登録の総数ではなく、706 513個の「将来の眲名」しかありたせん。



サむト構築の芳点から、これはかなり普通の補品です。 このサむトはPython + Django + PostgreSQLで䜜成されおおり、暙準ORMず暙準管理者が䜿甚されおいたす。 1幎半の間、サむトはいく぀かの曎新を経隓したした。セクションが远加され、登録フォヌムの䜜業が倉曎され、ペヌゞ䞊のテキストず画像が倉曎されたした。 暙準ブロックで補うために蚭蚈を耇雑にしないようにしたため、䞀郚のセクションは3日でアむデアから立ち䞊げられたした。



蚪問者の玄半数は、モバむルデバむスから最新のWebサむトにアクセスしたす。 私たちはサむトをすべおの人にずっお䟿利なものにしようずしたため、レむアりトは描画され、320pxから始たる任意の画面幅で正しく衚瀺されるようにレむアりトされたした。









本瀟マップ



蚪問者が芋る唯䞀の耇雑なむンタラクティブ芁玠は、本郚がマヌクされたロシアの地図です。 本瀟の数が50を超えるず、ペヌロッパの䞀郚にマヌカヌが近接しおいたため、マップのナビゲヌトが困難になりたした。 圓初、このマップは玔粋に装食的な芁玠ずしお考えられおいたしたが、突然機胜がいっぱいになったため、キャンペヌンの連邊の性質をすでに理解しおいお、自分の郜垂を芋぀けたいだけの人のために、リストモヌドを䜜成したした。







マップは、矎しく倚面的なd3.jsを䜿甚しお䜜成されたす。 地図投圱のため、暙準のGoogleマップやYandex.Mapsを䜿甚するのではなく、独自のスクリプトを䜜成するこずにしたした。 地球の楕円䜓を飛行機でスキャンする倚くの方法がありたす 。 メルカトル図法では、オブゞェクトは北緯で非垞に䌞びおおり、䞻芁な倧郜垂が集䞭しおいる地域ではより倚くのスペヌスが必芁です。 さらに、メルカトル図法では、ロシアはかなり奇劙に芋えたす。 地理孊の教科曞でよく知られおいるアルバヌスアルバヌスシベリアの円錐投圱法を遞択したした。





健康な人のロシアアルバヌスの円錐投圱ず喫煙者のロシアメルカトルの投圱





コンテンツ管理



このサむトの線集セクションにはほずんど関心がありたせん。 最小限のカスタマむズで通垞のDjango管理パネルを䜿甚したす。 開発リ゜ヌスが限られおいるため、本圓に䟿利なツヌルを䜜成するのに時間を費やすよりも、暙準ツヌルを䜿甚するように耇数の管理ナヌザヌに教える方が有益です。



線集者の生掻を簡玠化するいく぀かの決定は、他のプロゞェクトから取られたした。 たずえば、クラむアント偎でテキストを入力するためのツヌル。 私たちのタむポグラファヌは、任意のテキストたたは文字列入力フィヌルドに簡単に接続できるずいう点で䟿利です。 オヌトタむポグラフィの状態に関する情報オン/オフは、行末に印刷䞍胜文字ずしお保存され、バック゚ンドに䟝存したせん。



投皿やニュヌスの耇雑なコンテンツを凊理するために、他の倚くのプロゞェクトでも䜿甚されおいるブロック゚ディタヌを䜿甚したす。







ブロックにはさたざたなタむプがあり、各プロゞェクトには独自のセットがありたす。 各ブロックにはコンテンツが含たれ、蚭定が含たれる堎合がありたす。 ブロックデヌタはjsonずしおデヌタベヌスに保存され、テキストブロック内のマヌクアップはマヌクダりン圢匏で保存されたす。



衚瀺のために、ブロックは目的の圢匏に倉換されたす投皿のHTML、むンデックス䜜成のテキスト、Yandex.ZenのRSSたたはXML、モバむルアプリケヌションのJSONなど。 したがっお、コンテンツのフォヌマットがかなり耇雑なデバむスであれば、予枬可胜な結果が埗られたす。



最初のバヌゞョンはトレバヌTreのコヌドに基づいおいたした。 その埌、トレバヌirのスパゲッティcodeの維持が困難になったずき、゚ディタヌはReactに曞き換えられたした。





分析



技術的な芳点から最も興味深いのは、サむトの管理パネルです。 そこから登録の流れを芋たした。



最初は、分析はかなり原始的でした。぀たり、さたざたなタむプの登録数ず時間のグラフです。 しかし、地域ごずのダむナミクスを確認し、登録数に察するさたざたなむベントの圱響を远跡したいず考えたした。 そこで、埅望の分析が登堎したした。



この画面には、サむトの党ラむフの抂芁、特定の期間のスケゞュヌル、およびこの期間のむベントのリストがありたす。 グラフ䞊のピヌクを匷調衚瀺しお、どのむベントがそれを匕き起こしたのかを理解するこずができたす。 ほずんどの堎合、これはNavalnyのYouTubeチャンネルでの別の調査ビデオの公開です。 眲名の最倧の増加は、地域の圹人の詐欺に関するビデオによっおもたらされたした。







グラフはd3.jsで䜜成され、時間ず本瀟によるむベントのフィルタリングは、 Crossfilterラむブラリを䜿甚しお実装されたす。 この゜リュヌションにより、クラむアント偎は、1時間単䜍で1幎以䞊の間隔で登録デヌタに登録ブレヌキをかけるこずなく動䜜できたす。 珟時点では、これは12メガバむトのデヌタgzipで1.3 MBです。



登録デヌタベヌスの重芁な指暙ず前日の成功を含む小さなテキストレポヌトが、すべおのプロゞェクト参加者に毎日自動的に送信されたした。





郜垂ず地域



たた、ロシアの各地域の眲名収集の準備の䞻な指暙が登録されおいる巚倧なテヌブルがありたす。







この衚の数倀は、最初は収束したくありたせんでした。 郜垂別の金額は、登録数よりも倧幅に少なかった。 サむトでアンケヌトに蚘入する際に、人々は予想倖に自分の郜垂の名前を間違えたり、非暙準の名前を䜿甚したりするこずが刀明したした。



-モスクワ-2.5の゚ラヌず579のスペルバリ゚ヌション。

-サンクトペテルブルク-゚ラヌの12.6ず767のスペルバリ゚ヌション。

-コム゜モリスク・オン・アムヌル-゚ラヌず略語の20以䞊、75のオプション。



サポヌタヌの数の誀った芋積もりは、本郚のネットワヌクおよびキャンペヌンむベントの誀った蚈画に぀ながる可胜性がありたす。 郜垂名のナヌザヌ入力を地域の暙準名に倉換する方法に぀いお考えなければなりたせんでした。 このような単玔なフォヌムで、KLADRたたはFIASに基づいた自動補完メカニズムを䜿甚したくありたせんでした。 そのため、ロシアの700の倧郜垂のリストを取埗し、兞型的なスペル「サンクトペテルブルク」、「n-sk」のリストを远加し、レヌベンシュタむン距離これは2぀の文字セットの違いの尺床でランク付けしお非厳密な怜玢を行いたした。



リストから各郜垂を、最寄りの本瀟たでの距離に応じお3぀のカテゎリのいずれかに割り圓おたした。本瀟は垂内にあり、本瀟は近くにあり郜垂集積、本瀟は遠くにありたす。 本瀟からの距離は、適切なタむミングで到着しお眲名をする人数を評䟡する際に考慮されたした。 分析では、すべおの眲名者を個別に考慮し、「利甚可胜」確認枈みのメヌル、本郚たたはその近くの郜垂に䜏んでいるを考慮したした。





このグラフは、時間の経過ずずもにキャンペヌンがどのように地域的になるかを瀺しおいたす。 モスクワずサンクトペテルブルクからの新芏登録の割合は35から15に枛少したした。





SMSずメヌル



もう1぀の技術的な問題は、SMSず手玙を送信するこずでした。 ゲヌトりェむは、特に倖囜の番号ぞのメッセヌゞをあたりうたく配信したせん。 しかし、最もクリヌンで信頌性の高いサポヌタヌのデヌタベヌスを取埗したかったため、登録フォヌムの2番目の郚分では、SMSを介しお電話番号を確認する必芁がありたした。 信頌性のある送信のために、3぀のゲヌトりェむをロヌテヌションしたした。メッセヌゞが配信されなかった堎合、再送信はすでに別のゲヌトりェむを経由しおいたした。 さらに、偎で障害が発生した堎合、個々のゲヌトりェむをオフにするこずができたす。 SMSコヌドの配信可胜性むンゞケヌタは、監芖されたパラメヌタヌの1぀です。







グラフは、ゲヌトりェむが2回誀動䜜したこずを瀺しおいたす。 配信されたSMSのシェアは、メッセヌゞ送信キュヌの障害のため、2月21日ず4月17〜18日に急激に枛少したした。 たた、7月15日に登録フォヌムのレむアりトを倉曎したした。これもチャヌト䞊で顕著です。



70䞇を超えるメヌルアドレスに基づいお倚数の手玙を送信したす。 誰かがニュヌスを賌読したした。誰かがむベントに関する通知を受け取る必芁がありたす。 さらに、各アドレスは2オプトむンルヌルに埓っお確認する必芁がありたすこれは、リンクが最初の文字になったずきです。リンクをクリックしおニュヌスレタヌの賌読を確認する必芁がありたす。 キャンペヌンの開始時には、ActiveCampaignサヌビスを䜿甚したしたが、費甚が高く、非垞に遅いです。 基地が30䞇人を超えるず、仕事ができなくなりたした。 そのため、独自のCRM /メヌリングサヌビスを䜜成したした。これにより、必芁なサンプルに埓っおメヌリングず䌚話を䜜成できたす。 Mailgunは珟圚、手玙の配達に䜿甚されおいたす。





保留䞭のタスクキュヌ



サヌドパヌティのサヌビスのAPIを介しおメヌルたたはSMSを送信するこずは、時間のかかる操䜜です。 このような操䜜は、ナヌザヌむンタヌフェむスの速床を䜎䞋させたり、アプリケヌション党䜓に負荷をかけたりしないように、非同期で実行する必芁がありたす。 圓初、非同期タスクはすべお、Redisをブロヌカヌずしお䜿甚しおCeleryを介しお機胜しおいたした。 各レタヌたたはSMSはCeleryキュヌにタスクを䜜成し、その埌、無料のワヌカヌがこのタスクを凊理したした。 しかし、このアプロヌチは信頌性が䜎く、リ゜ヌス集玄型であるこずが刀明したした。







か぀お、1時間あたり1䞇件以䞊の登録が私たちにやっお来たしたいいえ、圌らはテレビで私たちを芋せなかった、それは「+1」キャンペヌンでした。 10セロリの劎働者はこれに察凊できず、ナヌザヌはSMSずメヌルの受信が倧幅に遅れるこずに気付き始めたした。



この事件の埌、私たちは単玔なPostgreSQLベヌスのキュヌを支持しおCeleryを攟棄したした。 キュヌのタスクは、各メッセヌゞ配信チャネルに1぀ず぀、Pythonの「デヌモン」によっお分類されたした。 10秒に1回、デヌモンはキュヌからタスクのパケットを取埗し、1぀のパケットでデヌタをメヌルAPIに送信したした。 タスクをグルヌプ化するずサヌバヌの負荷が倧幅に削枛され、仮蚭キュヌを䜿甚するずデバッグず監芖が倧幅に簡玠化されたした。



セロリは私たちの仕事には耇雑すぎるツヌルでした。 圌は、Flowerのような倖郚ナヌティリティを介した思慮深い調敎ず監芖が必芁であり、それ自䜓が倚くのリ゜ヌスを消費したす。 他のプロゞェクトでは、よりシンプルな゜リュヌション-RQ + Redisを䜿甚しようずしたす。





非同期タスクの操䜜に関する蚘事のRQずCeleryの耇雑さの比范。





開発プロセス



開発者の芳点からサむト「Bulk 208」を䜜成するプロセスはどうですか 1぀の方法論に固執するのではなく、異なるシステムのアプロヌチを䜿甚したす。 たずえば、マネヌゞャヌはかんばんに䌌た構造でTrelloにタスクを蚭定し、開発者は極端なプログラミングの個別のプラクティスを䜿甚したす。



チヌムの玄半分はモスクワのオフィスにいたすが、残りはリモヌトで働いおいたす。 モスクワの埓業員はキャンペヌンのチラシに参加しお、党䜓像をよりよく理解するために働かないようにするこずができたすが、IT郚門のタスクに぀いおは別途説明したす。 定期的な呌び出しにより、誰もがい぀でもメむンの䜜業ラむンを同期しお理解できたす。







ほずんどのプロゞェクト参加者はフルタむムでそれに取り組んでいたすが、䞀郚のタスクは䞀時的に他のプロゞェクトやボランティアから匕き付けられた開発者によっお行われたした。 たずえば、ボランティアのむリダは、ほが完党にメむンペヌゞの本郚マップを䜜成したした。



゜ヌスコヌドは、Bitbucketプラットフォヌムのgitリポゞトリに保存されたす。 重倧な新しいタスクごずに、個別のブランチが䜜成されたす。 staging- , develop . , , - . , , . , .





. , - Bitbucket ( ), , . Makefile.



«make update» , , , , uwsgi-. , , .



18 2016 . 1228 , 200 -, 600 , 67 ( ).







(- ), . .



IT- :



1) «» ( , , );



2) , ( ) ( , , ).



*, , , , .







IT-c — , , , -, ( Sketch).



, , . draw.io, . . «» .







marvelapp.com , , . .



. , , ( , ) , .



, , , , . ( , ) .



. , .



, 6 — «» .



IT- — , MVP . , (-, ), . -, .



. - .









テスト䞭



RobotFramework. , . CI- Jenkins.



— , SMS-. GSM- SIM- Asterisk. SMS- , .







Trello .







« 20!8» , , . : , edge-. chef, .



, ip. , master-slave .



- Varnish, url- . , -, .



Edge- ssl- ( VPN-). — . -. DNS-. Edge- . , edge-, — 5 / .



, , javascript, json- , (, style.28fa1c7b1761.css), . edge-. , 25 .



edge- CloudFlare, , . . CloudFlare . , , ip ( ).





おわりに



( IT-, , ) — : , , , .



, , . , , .






, .



, .



, , .



All Articles