フィヌルドにいるのは戊士ではなく、フルスタックバック゚ンドがどのようになりたかったのか

私はさたざたなサむドプロゞェクトを始めるのが倧奜きです。これは、新しくお本圓に䟡倀のあるこずを孊ぶための最良の方法の1぀だず思いたす。そしお、私には1぀の重倧な欠陥がありたす-私はほずんど物事を成し遂げるこずがありたせん。もちろん、これは私が雇甚䞻によっお蚭定された等玚やタスクを䞎えられる研究プロゞェクトに関するものではありたせん。私は、絶え間ない仕事や勉匷の倖で私が照らしおいる自分の考えに぀いお話しおいる。需芁があるず思われるたったく新しいスキルを習埗するたびに、そのようなこずを孊ぶ芋蟌みがないので、プロゞェクトのこずを忘れおしたいたす。しかし今回、私は自分自身を改善するこずに決めたした-プロゞェクトを開始し、それを完了し、私がたどった道に぀いお話したす。



私自身に぀いお少し



私は専門教育、数孊の孊士号、ITの修士号を持っおいたす。驚いたこずに、私が倧孊で習埗した倚くのこず、特に修士号は私にずっお圹に立ちたした。いずれにせよ、私は必芁な情報を生産的に吞収し、この分野で自分自身をうたく瀺し、仕事を芋぀け、そしお私のキャリアを前進させるために、私の脳を正しい方向に調敎するこずができたした。



勉匷しおいる間、私はC ++ファンでゲヌム開発者でした。それから私は自䜜の゚ンゞンを開発し、それにゲヌムを曞いおみたした。私はCで卒業蚌曞を持っおいお、蚈算でのグラフィックプロセッサの䜿甚に関連しおいたした。それから私はJavaずAndroidの開発に興味を持ちたした。圌はこの蚀語でいく぀かの教育プロゞェクトを完了し、その埌、孊生プロゞェクトの䞀環ずしお、囜際䌁業の支揎を受けお、プログラムのパフォヌマンスを分析するためのコン゜ヌルナヌティリティを䜜成したした。これらすべおが、パフォヌマンスの芳点から携垯電話をテストし、他の携垯電話ず比范する機胜を備えたAndroidアプリケヌションに成長したした。



パむ゜ンの䞖界が間近に迫っおいたした。意倖なこずに、芪友の提案でデヌタサむ゚ンスずパむ゜ンに興味を持ち始めたのは4幎以䞊前のこずです。偶然にも、私は転職しなければならず、私のスキルは、内郚分析サヌビスのバック゚ンドでの䜜業を開始するのに適しおいるず評䟡されたした。それで、デヌタ分析を通しお、私はこの蚀語でのりェブ開発に行き着きたした。



矩務ずしお、実際のフロント゚ンド開発者が非垞に忙しいずき、たたはUI品質基準がそもそもなかったずきも、私はフルスタック開発者でなければなりたせんでした。



これは、技術的な詳现に完党に没頭するこずなく、独自の本栌的なWebアプリケヌションを䜜成するために芁したパスの説明です。リポゞトリからのコミットぞのリンクは途䞭で削陀されたす。この旅の段階に぀いお簡単に説明したす。



  • UI
  • , , CI
  • production-
  • production-
  • https

- AWS. , .







アプリケヌションの䞻題の遞択は別の話であり、最終的な遞択は远跡の習慣にありたした。ホヌムペヌゞには、远跡された習慣を持぀ボタンのセットがありたす。私たちは行動を起こしたした-ボタンを抌したした-そしお毎日。デヌタは保存しお別のペヌゞに衚、習慣を行、暊日を列の圢匏で衚瀺する必芁がありたす。塗り぀ぶされたセルは、必芁なアクションがその日に実行されたこずを瀺したす。単玔な玙の習慣トラッカヌのように。





技術的なスタックは私には明癜でしたreact、django、postgres、nginx、uwsgi。



初期UIのレむアりト



ナヌザヌむンタヌフェむスから始めお、nodejs.org / en / download / package- manager、github.com / facebook / create-react-appをむンストヌルし、プロゞェクトを䜜成するこずにしたした。



npx create-react-app easytrack


そしお、レむアりトを始めたした。圓初から、ビゞネスロゞックオブゞェクトのリストをプログラムに盎接ハヌドコヌディングし、それらをulタグのリストずしお衚瀺するこずほど簡単なこずは考えられたせんでした。これらのオブゞェクトは、トピックグルヌプ、远跡察象アむテム、特定の日の特定のアむテムの実際の远跡レコヌドです。



最初のペヌゞにテヌマ別グルヌプがあり、それらのいずれかをクリックするず、远跡可胜なアむテムのリストが開きたした。



たた、過去数日間の統蚈を含む簡単な衚を含む別のペヌゞを䜜成したした。



バック゚ンドを開発する



この段階では、バック゚ンドが必芁でした。オブゞェクトをデヌタベヌスに保存し、ナヌザヌを管理し、暩限を区別する必芁がありたす。私はすでに自分のプロゞェクトにDjangoを䜿甚する必芁がありたしたがもちろん、論理的な結論には至りたせんでした、1぀の問題がありたした。DjangoRestFrameworkを䜿甚する必芁がありたした。Django 2.0Webアプリケヌションの構築に感謝したす[1]。圌らがDRFでAPIを䜜成した最埌の章を陀いお、私はそれをカバヌからカバヌぞず調べたした、私は私の目でそれをざっず芋たした。話の途䞭で、私は䜕床も圌女に目を向けたす。



どこにも行けず、www.django-rest-framework.orgのドキュメントを開いお喫煙を開始し、蚀及された本にも目を向けたした。



仮想環境をむンストヌルしおアクティブ化し、Djangoをむンストヌルしお、プロゞェクトのルヌトにdjangoプロゞェクトを䜜成したした。



virtualenv venv
. ./venv/bin/activate
pip install django
django createproject config


メむンフォルダの名前をdjangoに倉曎したす。これにより、名前によっおその内容に関するすべおがすぐに明確になりたす。その䞭にはconfigず呌ばれるpythonモゞュヌルがありたす。これも非垞に䟿利です。反応フォルダにラップされたフロント゚ンドコヌド。これが䞀般的なフォルダ構造の開発方法であり、今日たで存続しおいたすGithubを参照。



プロゞェクトのルヌトで、メむンアプリケヌションを䜜成したした。



django createapp core


フロント、シリアラむザヌ、ビュヌGithubでコミットするためのリンクでハヌドコヌディングしたのずたったく同じ圢匏でビゞネスロゞックモデルのクラスを䜜成したした。

デヌタベヌスを気にせず、デフォルトのSQLiteを䜿甚したす。管理パネルから、前にハヌドコヌディングしたいく぀かのテストデヌタサンプルをアップロヌドしたした。フロント゚ンドに接続しようずしおいたす。 python3 manage.py runserverを1぀のタブで、yarnを別のタブで開始しお運転したした。



React開発サヌバヌはポヌト3000で実行され、Djangoはポヌト8000​​で実行されたす。前面にフェッチ 'http// localhost8000 / ...'芁求を曞き蟌むこずほど簡単なこずはありたせん。しかし、cors-originは、サむトがサヌバヌに自動リク゚ストを送信できないようにする特別な保護機胜であるため、そのようには機胜したせんでした。したがっお、よく考えずに、バック゚ンドに組み蟌みたしたdjango-cors-headers、構成したした-動䜜したした。その埌、package.jsonにプロキシセクションを远加しおバック゚ンドをポむントするず掚枬し、フェッチ '/ api / v1 / ...'が正垞に機胜し始め、远加の蚭定は䞍芁になりたした。



最初は、コンストラクタヌで非同期リク゚ストを行ったため、ひどくナむヌブでした。すべおがうたくいき、倧䞈倫でした。埌になっおようやく、この皮の䜜業を実行できる堎所ず実行しおはならないラむフサむクル方法に぀いお孊びたした。これで芁玠が衚瀺され、新しい芁玠を䜜成できたした。



ナヌザヌ管理ず暩利の分離を実装する



この段階で欠けおいたのは、デヌタ芁玠に察する暩利の分離だけでした。これらはすべお、匿名の非ログむンナヌザヌに代わっお䜜成されたした。 djangoの゚コシステムを壊すこずなく、どういうわけかそれに統合する必芁がありたした。



たず、フロント゚ンドでログむン/パスワヌドをハヌドコヌディングし、倀 'Basic' + base64.encodeナヌザヌ名+ "" +パスワヌドでAuthorizationヘッダヌを䜜成したした。次に、base64圢匏の文字列を生成し、ナヌザヌ名/パスワヌドを入力するずきにクラむアントに保存するこずを考えたした。しかし、安党性の芳点からこの決定には倧きな疑問がありたした。私は別のこずを詊みたかったのです。



私はむンタヌネットで少しの間隒ぎ、JWTテクノロゞヌずdjango-rest-framework-simplejwモゞュヌルに぀いお孊びたした。これは、トヌクンのペアを取埗し、アクセストヌクンを曎新するためのDRFずビュヌの認蚌クラスを提䟛したした。



フロント゚ンド偎からは、localStorageにいく぀かのトヌクンを保存し、倀が「Beareraccess-token」のAuthorizationヘッダヌを枡すだけで十分でした。最埌に、ログむンペヌゞをレむアりトし、暩限クラスGithub commitぞのリンクを䜿甚しお、蚱可されおいないナヌザヌのサむトぞのすべおのアクセスを閉じたした。前面に、曎新トヌクンがない堎合は、ログむンペヌゞにリダむレクトしたしたGithubコミットぞのリンク。



次に、サむトぞの登録、バック゚ンドでのビュヌの䜜成、ペヌゞのレむアりト、送信リク゚ストの蚭定を可胜にしたした。将来、私の倢はメヌルでアカりントアクティベヌションを曞くこずでした。



リファクタリング、䞍足しおいる基本機胜の実装、CI



この時点で、最小限の䜿甚可胜なアプリケヌションが刀明し、フィヌドバックを収集したいず思いたした。私は劻にアプリケヌションを芋せお、私の偎からの単䞀のプロンプトなしでそれを䜿甚するように頌みたした。登録は倧成功でしたが、思ったずおりにすべおがうたくいきたせんでした。次に、サブゞェクトフォルダヌを最前線に眮くのではなく、補助ツヌルにする必芁があるこずに気付きたした。たた、ボタンのセットを䜜成しお1日1回クリックできるようにするヒントを远加する必芁がありたす。圌女はそれがあなたが现胞の䞊に塗る必芁があるスプレッドシヌトを備えた通垞の玙の習慣トラッカヌのようであるず期埅したした。これに気づいたずき、私はリファクタリングを始めたした。そしおそれ以倖に、リファクタリングするものがありたした。モゞュヌル構造をほがれロから調べたした。



この時点で、矎しさ、cssスタむル、応答性の高いレむアりトを远加するこずにしたした。この点で、私は特に匷くはなく、CSSフレヌムワヌクに䟝存しおいたす。遞択はに萜ちたブルマ星からのダりンロヌド数に基づいお、npmjs.com私はブヌトストラップを取りたくなかったずいう事実にもかかわらず、。少なくずも、私はこのタスクに察凊したした。



䞊行しお、バック゚ンド機胜を改善したした。完党なCRUDを䜜成したした。メヌルで登録を確認するずいう倢も実珟したした。私は手玙を送る機胜を理解し、デバッグメヌルサヌバヌを介しおすべおをデバッグする胜力を獲埗したした。



python -m smtpd -n -c DebuggingServer localhost:1025


ステヌゞングのために、私はゞャンクGoogleアカりントを開始し、なんずかGoogleメヌルで手玙を送るように蚭定したした。



バック゚ンドのテストカバレッゞに関しおは、すべおがそれ自䜓で非垞にうたくいきたしたが、フロント゚ンドの堎合、すべおがただかなり遅いです。しかし、私は絶望しおいたせん、突然、それは調敎されるこずが刀明したす。



次のステップはCIを蚭定するこずでした。テストを実行するために、GithubActionsを起動し、構成コンストラクタヌを䜿甚しお実行し、少し調敎したした。それだけです。



実皌働環境の蚭定を生成する



しばらくしお、コヌドずロゞックの现郚を敎理した埌、本番構成の䜜成を開始する必芁がありたした。このために私は同じ本[1]に觊発されたした。django-configurationファむル、python-dependenciesを3぀の郚分に分割したしたGithubコミットぞのリンク





  • 共通-あらゆる環境に必芁なすべお
  • dev —
  • prod —


, .



uwsgi, nginx , dockerfile, .



[1] «1 — 1 », , , . phusion/baseimage, Ubuntu, .



, , postgres, . ( Github).



production-



, [1], AWS, . , - . , , , , . Free Tier, , , ? .



, AWS - , . , . , ECS.





Elastic Container Service



Github Actions Builderを䜿甚するず、AWSECSで継続的なコンテナヌ展開タスクの構成を䜜成できるこずがわかりたした。このサヌビスを詳しく調べ始めたずしたしょう。ロヌカルコン゜ヌルで、クラスタヌを䜜成し、タスク定矩を䜜成し、コンテナヌを蚘述する必芁があるこずに気付きたした。以前は、そのむメヌゞを別のAWS ECRサヌビス機胜的にはDockerhubに保存しおいたした。コン゜ヌルには、FargateずEC2の2皮類のクラスタヌが甚意されおいたした。最初のテクノロゞヌは完党にサヌバヌレスです。぀たり、コンテナヌを起動するだけで、ランタむムがすべおを凊理したす。 2番目のタむプのクラスタヌのコンテナヌは、クラりド内の独自の仮想マシンむンスタンスで実行されたす。長い間これに飛び蟌みたくなかったので、私はFargateに基づいおクラスタヌを䜜成したした。しかし、私は秘密の倀をコンテナに枡すこずができなかったずいう事実に遭遇したした、このため、タスクは垞に䜎䞋しおいたした。



コンテナを動䜜状態にしようずしおいる間、クラスタは数時間動䜜しおいお、サヌビスの支払いでタブにお金が远加されたした。テクノロゞヌ自䜓は有料であるこずが刀明し、無料利甚枠には適甚されたせん。私はクラスタヌを完枈し、少し埌で支払いを凊理するこずにしたした。EC2リ゜ヌスを䜿甚する堎合を陀いお、EC2の䞊でECSを䜿甚するために远加料金を支払う必芁がないこずをドキュメントで読みたしたが、EC2は無料利甚枠でカバヌされおいるため、このパスを詊すこずにしたした。



AWSサポヌト



結局、誰かが私に嘘を぀き、圌らは私にこの構成のためにもう少しお金を請求したした。少額ではありたすが、それでも残念でしたが、合蚈0.32ドルでした。それから、私はセットアップに問題があり、垞に無料枠に収たるず思っおいたず蚀いたしたが、䜕もうたくいかず、お金が匕き出されたした。私は助けを求めた。私の電話に応えお、圌らは喜んで応答し、すべおの予期しない費甚をカバヌする1ドルのバりチャヌを䞎えたした。うたく。



その結果、私はこのコンテナサヌビスずマスタヌEC2を最も玔粋な圢で忘れなければなりたせんでした。



Elastic Computing Cloud



EC2 — . Free Tier 750 . , , - , .



[1] docker-machine, . , EC2. docker .



, dockre-machine create
 EC2. docker-compose up -d . 80 . , «Public DNS» , .





Relational Database Service



AWS RDS. . , ( postgres) , Free Tier, . , , .



Simple Email Service



私はたた、手玙が送られおいないずいう事実に盎面しなければなりたせんでした。事実、すべおのメヌルサヌビスは、スパムに察抗するためにEC2むンスタンスに䞀臎するIPを犁止しおいたす。SESを䜿甚するこずが䞍可欠でした。別のAWSサヌビス。



たた、それを構成し、手玙を送信するメヌルボックスを瀺したした。すべお問題ありたせん。しかし、これたでのずころすべおがそれほどバラ色であるわけではありたせん。新しいアカりントはデフォルトでサンドボックスモヌドになっおおり、未確認のメヌルボックスにメヌルを送信するこずはできたせん。ベヌタテスタヌのボックスを確認する必芁がありたした。





ドメむンを登録し、httpsアクセス甚の蚌明曞を構成したす



アプリケヌションを完党にテストするには、https接続をセットアップする必芁がありたしたが、これはドメむンを登録しないず䞍可胜であるこずが刀明したした。安党でない接続を介しお転送するこずにより、電子メヌルアドレス、パスワヌド、およびトヌクンを危険にさらしたくありたせんでした。この堎合、私はむンタヌネット党䜓を怜玢したした。䞀郚のレゞストラは高䟡であるため適合したせんでしたが、どこかで非垞に高䟡であり、その䞊、倚くのレゞストラはひどいレビュヌを持っおいたす。私が探しおいたずき、Yandex広告ネットワヌクは私が䜕を望んでいるかを理解し、すぐに39ルヌブルのドメむンを登録できる䌚瀟を提䟛しおくれたした。このサヌビスに぀いおのレビュヌがもっずあったので、私はアカりントを䜜成し、無料のドメむンを遞択しお登録したした。



次に、このドメむンを䜿甚しおEC2むンスタンスにアクセスするために、AWS Route 53サヌビスでホスティングゟヌンを䜜成し、DNS蚭定を登録し、ドメむンが登録されたサヌビスの個人アカりントのNSレコヌドをAmazonのものに曞き盎したした。



Let'sEncryptサヌビスを䜿甚しお蚌明曞を䜜成したした。私はこの構成に萜ち着きたした。ロヌカルnginxがコンテナヌアドレスぞのproxy_passを䜜成し、コンテナヌが回転し、ポヌト8080からアクセスできたす。certbotコン゜ヌルナヌティリティを䜿甚しお蚌明曞を生成し、httpsを自動的に構成するこずは難しくありたせんでした。最埌に、ポヌト443で仮想​​マシンぞのアクセスを蚱可したす。



プロゞェクトの開発は論理的な結論に達したした



, . , , SES , . , . , , , , , , , , . , , . :





  • , , . .
  • -
  • ,
  • , -


— , , . React , AWS, , , .



しかし、䞻な認識は、珟堎の人はたったく戊士ではないずいうこずです。私はこのプロゞェクトに2か月以䞊、空き時間に䜕時間も取り組んでいたした...そしおあなたは䜕を知っおいたすか私はただそれほどひどく瞫い付けおいたせん。幎をずるほど、「そのような」こずを孊びたいずいう欲求が少なくなり、「ただ面癜い」こずに぀いお倚くのこずを孊びたいずいう欲求が少なくなるこずがわかりたす。しかし同時に、あなたは利益のために䜕かをするためのより倚くの利甚可胜な機䌚があるこずに気づきたす。あなたは集䞭的な努力、チヌムワヌク、そしおリラックス、芪しい人々ず過ごす時間に感謝し始めたす。



Githubのコヌド。



リンク



  1. Django 2.0Webアプリケヌションの構築



All Articles