Giter Club home page Giter Club logo

maxitter's Introduction

Maxitter

MaximumメンバーがWeb研究部の活動として、Twitterのようなマイクロブログサービス作りを通して共同開発・Webアプリケーション開発の経験を積むことを目的としたプロジェクトです。

開発環境

  • Docker (Docker Compose)
    • Nginx
    • MySQL (db)
    • Go (back)
    • React (front)

開発形態

  • ブランチモデル
    • production (本番環境)
    • development (ステージング環境)
    • feat/xxx (機能追加)
    • fix/xxx (バグ修正)
    • hotfix/xxx (緊急バグ修正)

開発手順

最初

  1. リポジトリをクローンする git clone https://github.com/saitamau-maximum/maxitter.git
  2. cd maxitterでフォルダに移動
  3. cp .env.example .envで.envファイルを作成
  4. .envファイルを自分の好きな名前やパスワードに書き換え
  5. ./scripts/setup.sh でビルドしてコンテナを起動する

停止

./scripts/stop.sh でコンテナを停止する

再開

./scripts/start.sh でコンテナを再開する

DBデータの削除

./scripts/reset-db.sh でDBデータを削除する

デプロイ

./scripts/deploy.sh で本番環境にデプロイする (マイグレーションなど特別なオペレーションが必要な場合もある)

スプリント

毎週月曜日にあるWeb研究会の講義の間を1スプリントと定義する。

バージョニング

バージョンは1スプリントでマイナーバージョン x.X.x を上げることにする。 それよりも細かい単位の変更 (スプリント中だけど緊急で修正箇所が浮上したなど)でリリースが必要な場合、パッチバージョン x.x.X を上げることにする。

メジャーバージョンに関しては区切りが良くなったタイミングであげるで良い。

maxitter's People

Contributors

sor4chi avatar yukikamome316 avatar shigekk avatar batora9 avatar a01sa01to avatar hana-rs avatar kasa021 avatar seiei-n avatar daaaai0809 avatar

Forkers

seiei-n kasa021

maxitter's Issues

ロゴを作ってみよう

サービスを印象付けるロゴを作りましょう
サイトの左上に貼るのに使ったりします。

現在の投稿件数を表示してみよう

現在のPostの数を返すAPIを作ってもいいし、GET /api/postsで、投稿リストと一緒に返してあげるのもありだと思います。

もし余裕があったら、投稿と同時に件数が増えるようにできると理想ですね。

[HTTPS 対応] nginx 設定編

#21 Step 2
前提: #69

やること

  • SSL/TLS を使うように nginx の設定を書き換える
  • Docker で証明書が読み取れるようにディレクトリのマウント設定も変える

リツイート機能を作ろう

#12 ができていること前提です

  • 投稿から投稿へ連携するためにretweet_idをPostテーブルに追加しよう
  • リツイートができるようにしよう
  • リツイートが表示できるようにしよう

マイグレーションを導入

Bun や dbmate, Gormなどのテーブルスキーマなどをバージョン管理する「マイグレーション」を導入して効率的に管理しよう

読み込み失敗時の理由を表示してみよう

前提: #56

#56 では、読み込みが失敗したときに「エラーが発生しました」と表示されるようになりました。
ですが、ユーザーからしたらなぜエラーが発生したのか、どうしたら解決できるのかがわかりません。

そこで、なぜ失敗したのかも表示してみましょう!
例えば「サーバー内でエラーが発生しました」「ログインしてください」「ページが見つかりません」「リクエストがタイムアウトしました」... などなど

ユーザー認証機能を作ろう

#12 ができていること前提です。

JWTが一番やりやすいのでこれでやりましょう。

  • ユーザーテーブルにemail + passwordフィールドを追加
  • 認証用のミドルウェアを作成
  • JWTをLocalstorageで管理してヘッダにつけてポストする機能を作成

管理者画面を作ってみよう

前提: #20

  • 管理者向け API 作成
  • user ban 機能
  • post delete 機能
  • analytics 機能

など、サービス管理に必要な機能を追加した管理者画面を作成してみましょう!

HTTPS に対応させよう

概要

前提: #31

今の時代、ほとんどのサイトで SSL/TLS を用いた HTTPS 通信が主流になっています。
これはざっくりいうと、ブラウザとホストの間を暗号化して、盗聴されてもだいじょうぶ!にする技術です。

技術について詳しくは説明しませんが、「SSL/TLS 証明書」というものが必要になります。
基本的にはお金をかけて取得するものなのですが、 Let's Encrypt を利用すると無料で取得することができます。

現在プロトコルは http なので、 SSL/TLS 証明書を取得し nginx の設定をすることで https にしましょう!

タスク内容

  • #69
    • ローカルに対して証明書は発行できないので、オレオレ証明書を発行する
    • README.md ファイルに発行手順を書いておく (各自やらなければいけないので、わかりやすく書く)
  • #70
    • SSL/TLS を使うように nginx の設定を書き換える
  • #71
    • 公開鍵ペアを生成
    • 公開鍵を @a01sa01to@sor4chi に送り付けて SSH 接続できるように設定してもらう
  • #72
    • サーバー上でコマンドをたたいて証明書を発行する
    • 自動で更新するように設定する

Branch Protection を設定しよう

現在、このリポジトリには Branch Protection が設定されておらず、書き込み権限のある人ならば development, production ブランチに Push できる状態になっています。
これでは、バグが埋め込まれた状態だとしても本番環境に反映されてしまいます。

そこで利用できるのが、 GitHub の機能「Branch Protection」です。
これは、リポジトリのブランチに対して、 development, production ブランチへの Push 前にプルリクエスト (PR) およびそのレビューがないと Push できないようにしたり、ちゃんとビルドできないコードではマージできないようにしたりする機能です。
詳しくは GitHub の Docs をご確認ください: https://docs.github.com/ja/repositories/configuring-branches-and-merges-in-your-repository/managing-protected-branches/about-protected-branches

実際に development, production ブランチに対して Protection を設定しましょう!
なお、 production ブランチは development ブランチよりも制限をかけたほうが良いです。

ツイートに投稿時刻を表示

すでにバックエンドから日付データが送られてきているので、それを使って各ツイートの下に投稿日時を表示しよう
JavascriptのDateを使って YYYY/MM/DD HH:mm表記にしてみよう

テストを組み込もう

前提: #33

#33 でビルド・デプロイができるかどうかチェック出来たら、次は「テスト」を組み込んでみましょう。
これによって、ビルド時・デプロイ時のエラーのみならず、バックエンド・フロントエンドのバグも見つけることができます。
また、これまで完成していた機能が、新機能によって動かなくなってしまった!ということも防ぐことができます (リグレッションテストといいます)

テストを作成し、まず手元で確認、それができれば GitHub Actions でテストを走らせるように設定してみましょう!

branch preview を作ろう

これ絶対重いやつ

Cloudflare などは便利なもので、ブランチに Push すると勝手にビルドして、ビルドに成功したらそのプレビューを表示してくれます。
saitamau-maximum/website で PR を出したときにコメントが付きますが、それも同じです。

ブランチに Push されたらそれを検知して自動でビルドし、その結果をデプロイしてプレビューを生成する機能を作成してみましょう!

[HTTPS 対応] サーバー証明書発行準備編

#21 Step 3
前提: #69, #70

やること

  • 公開鍵ペアを生成
  • 公開鍵を @a01sa01to@sor4chi に送り付けて SSH 接続できるように設定してもらう

PR は必要ないですが、後々見て何したかわかるように、この Issue にやったこと (コマンドとかローカルの設定とか) をコメントを残していってください!

SQL に index を貼ろう

前提: #2

#2 (PR: #38) により、 GetPosts で呼び出している SQL に ORDER BY created_at DESC LIMIT 20 をつけることで、「 created_at で降順で並び替えたうち、上の 20 個を返す」すなわち最新の投稿 20 件のみが返されるようになりました。
変更部分は以下です。

err := h.DB.Select(&posts, "SELECT * FROM posts ORDER BY created_at DESC LIMIT 20")

ですが、データを並び替える ORDER BY という処理は時間がかかります。
競プロで sort は $O(N \log N)$ かかることを習ったと思いますが、毎回毎回ソートして出力、といったことをしていると、データが $10^8$ くらいあった場合、 20 個返すだけでも数秒かかってしまいます。

index を貼って、高速化につなげましょう!
index ってなに?の話は下のコメントを見てね

GitHub Actions のキャッシュを設定しよう

前提: #33 ✅ (PR: #41)

現在、PR を提出すると GitHub Actions でビルドチェックが走ります。
Actions タブ から、どれかの実行ログを見てみましょう。

Frontend-build のほうが影響は大きく、 Install Frontend Dependencies を見てみると、数十秒かかっていますね。
でも、ローカルで開発する時、 npm ci を実行すると 1 回目は時間かかるかもしれませんが、 2 回目以降は一瞬ですよね。
これは node_modules ディレクトリが作成されており、そこを更新する作業であるためです。

GitHub Actions では、毎回毎回環境がリセットされてしまうため、 node_modules ディレクトリがなく、毎回時間がかかってしまいます。
時間がかかると待ち時間が無駄ですし、 GitHub Actions は課金制なので料金が請求されてしまうこともあります (Public リポジトリだと無料ですが...)

そこでキャッシュを使います。
actions/setup-node では、キャッシュするためのオプションが用意されています。
これを用いて、キャッシュを設定しましょう!

参考: actions/setup-node のリポジトリ (https://github.com/actions/setup-node)

最新の20件だけを表示するようにしよう

現在は全ての投稿が見れる形になっている。
これでは投稿が増えていくにつれてだんだんサイトが重くなっていってしまう。
そこで最新の20件だけを取得するようにして、それを返してあげることで効率化しよう!

サイトのタイトルを変えよう

現在はデフォルトの「Vite + React」というタイトルになっています。
これをとりあえず「Maxitter」に変えてみましょう。

画像投稿機能を作ろう

画像が投稿できるようにしましょう

  • #43
  • 画像投稿用のフィールドを新設
  • 画像投稿用のAPIを生やす
  • 画像投稿のリクエストロジックを書く

TypeScript化しよう

現在フロントエンドはJavaScriptで動いていて、これでは型がないため開発がとても大変です。
そこで型システムをフロントに導入してより保守的な開発ができるようにしましょう。

nginxから画像を配信する基盤を作る

nginxコンテナ/var/www/html/imagesとローカルのbackend/public/imagesをマウントボリューム
goコンテナのapp/public/imagesとローカルのbackend/public/imagesをマウントボリューム
してnginx <-> go間を接続します

読み込みに失敗したときにエラーを表示しよう

概要

現在、「更新する」を押して /api/posts を叩きに行っていますが、リクエストに失敗 (HTTP Status Code が 4xx, 5xx) しても、「読み込み中」の表示のままになっています。
失敗したら「更新する」に直して、「読み込み時にエラーが発生しました」といった表示を出すようにしてみましょう!

スクリーンショット

リクエストに失敗

image

「読み込み中」から変わらない

image

ヒント

HTTP Status Code 4xx, 5xx が出ない!といった場合、 GetPosts 内をいじって意図的に返すようにすればよいです。
ただし、その変更は Commit しないようにしてください!

参考リンク

[HTTPS 対応] サーバー証明書発行編

#21 Step 4
前提: #69, #70, #71

やること

  • サーバー上でコマンドをたたいて証明書を発行する
  • 自動で更新するように設定する

PR は必要ないですが、後々見て何したかわかるように、この Issue にやったこと (コマンドとかローカルの設定とか) をコメントを残していってください!

ページネーションを実装してみよう [バックエンド編]

#2 ができていること前提です

最新の投稿1ページだけでは過去のツイートが見れませんよね。
ということでページネーションを実装して過去の全ての投稿が遡れるようにしましょう!
GET /api/posts?page=2のようなAPIを実装するイメージでやるとやりやすいと思います。

例)
1ページ20件の投稿が表示されるとして
例えばデータベースに ID 1 - 50 の投稿があったら(ID大きい方が最新)
GET /api/posts?page=1 => 50 - 31
GET /api/posts?page=2 => 30 - 11
GET /api/posts?page=3 => 10 - 1

となるように設計してみよう

React Routerを使ってルートを増やそう

現在はSPAのReactアプリになっているので、これをReact Routerなどを使ってPESPA式にしましょう。

これをすることで機能追加が容易になるでしょう。

Nginxのフォールバック設定が必要になりますが、とりあえず今回は導入できればいいです。

GitHub Actions でビルドチェックをしよう

新機能を追加しても、設定ミスや構文ミスなどがあってビルド・デプロイできなければ意味がありません。
しかし、いちいち PR を受けてブランチを切り替え、ちゃんとビルドができるかどうかをチェックするのは手間です。

そこで、 GitHub Actions を利用し、ブランチに Push されたら自動的にビルドできるかチェックする CI (Continuous Integration) を作成してみましょう!
なお、ビルドができればとりあえずおっけーです。ビルド時以外のバグについてはここではチェックされないことに注意してください。
ビルド時以外のバグ (?) もチェックしたい場合、 #34 もやりましょう!

[HTTPS 対応] ローカル証明書発行編

#21 Step 1

内容

  • ローカルに対して証明書は発行できないので、オレオレ証明書を発行する
  • README.md ファイルに発行手順を書いておく (各自やらなければいけないので、わかりやすく書く)

やること

  • README.md の更新

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.