Docker,CircleCI,AWS,Railsでポートフォリオを作成

#前書き
就職活動用のポートフォリオをDocker,CircleCI,AWS（ECS)を用いてWebアプリケーションを作成しました。
バックエンドにRuby on Railsを用いました。
今回は作成したポートフォリオの機能、参考記事などを紹介したいと思います。

#概要と作成背景
今回作成したアプリはスイーツのデリバリーに特化したECサイトです。


* ケーキ屋のアルバイト経験からお店の業務改善をしたい
* 手軽にお店のスイーツを食べたい
* 店舗で販売しているようなスイーツを配達するサービスが存在しない（自分調べ）

上記の理由により飲食店にもユーザーにもメリットのあるサービスを作成しようと思いました。

アプリのURL: http://sweetsdeli.com

GitHubのURL: https://github.com/sekine617/sweetsdeli

#画面イメージ紹介
###トップページ
新着商品、人気商品などを表示
人気商品はユーザーの購入履歴から購入数が多い商品を表示しています。
![スクリーンショット 2021-02-19 15.07.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/888053/6da63108-7dd3-7add-c2ed-a78072f661cf.png)

###商品一覧ページ
こちらではカテゴリー検索、商品名検索などができます。
![スクリーンショット 2021-02-19 15.27.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/888053/0f067ebd-fd42-9a56-3183-a1f64bbf048a.png)

###商品詳細ページ
こちらでは商品をカートに入れる、お気に入り登録、商品のレビュー投稿などができます。
![スクリーンショット 2021-02-19 15.27.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/888053/7fa16570-3e56-9467-64fe-db7f2c732ee9.png)

###マイページ
マイページではプロフィール編集、お気に入り、購入履歴、投稿したレビューを閲覧できます。

![スクリーンショット 2021-02-19 15.21.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/888053/7ec4a2a2-915c-437b-c07a-27b46c904620.png)

![スクリーンショット 2021-02-19 15.25.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/888053/ae89e857-16f0-a666-9248-986bd315d550.png)

![スクリーンショット 2021-02-19 15.25.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/888053/3ed16726-5aed-8188-10a3-4587d0c8b661.png)

![スクリーンショット 2021-02-19 15.30.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/888053/2d8c9805-fac3-6a6a-65df-601b7763b9ba.png)

###ショッピングカート
こちらではカートに入れた商品の確認、個数の変更、カートから削除などができます。
![スクリーンショット 2021-02-19 15.29.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/888053/7c134151-497a-78ea-423b-2041e0cf8cf3.png)
###購入画面
カートに入れた商品から合計金額を確認し、クレジットカードによる決済が可能です。実際に決済する場合はpay.jpのてすとカードを使用してください。
![スクリーンショット 2021-02-19 15.30.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/888053/90adc101-bd4d-fee9-ac99-3acb7c13f94d.png)
このようにカード情報の入力フォームがモーダルウィンドウで出てきます。
![スクリーンショット 2021-02-19 15.46.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/888053/95f90503-72a1-0189-17c4-bec0fd09c0df.png)

#使用言語
* フロントエンド
  * jQuery
  * HTML
  * CSS/Sass
  * Bootstrap
* バックエンド 
  * Ruby on Rails
  * Ruby
  * PAY.JP(外部API)
* インフラ
  * Docker/docker-compose
  * CircleCI
  * nginx
  * mysql
  * AWS(ECS, ALB, S3, RDS, Route53, ECR, VPC, IAM)

#インフラ構成図
![スクリーンショット 2021-02-19 18.41.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/888053/d1046b69-463d-bf02-1a12-1b46fe1fef51.png)

###開発環境

#機能一覧
* ユーザー関連（devise)
  * 登録機能
  * プロフィール編集機能
  * ログイン・ログアウト機能
* 決済機能(PAY.JP API)
* 人気商品表示機能
* タグ機能
* 商品登録機能
* 画像アップロード機能(AWS S3バケット, carrierwave）
* お気に入り機能（非同期処理, jQuery）
* フラッシュメッセージ表示機能
* レビュー投稿機能
* カート関連
  * カート登録機能
  * カート編集機能
* 住所自動入力機能(jQuery)
* 商品名検索機能
* カテゴリー検索機能
* ページネーション機能(kaminari)

#データベース設計
![スクリーンショット 2021-02-19 21.28.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/888053/19be52da-1956-c245-545a-ce5f475a7602.png)

###テーブル説明
| テーブル名 | 説明 | 
|:-----------:|:------------:|
| users       | ユーザー情報        | 
| orders     | 注文管理（受け取り日時など）   |
| orders_products       | 　注文商品管理   |
| products         | 商品情報     |
| reviews       | 商品に対するレビューを管理  | 
| likes    | 商品へのお気に入り情報     | 
| address    | ユーザーの住所     | 
| cart_items    | cartsとproductsの中間テーブル     | 
| shops    | ショップ情報     | 
| carts    | カート追加した商品情報一時的に保存     | 
| product_tag_relations    | productsとtagsの中間テーブル     | 
| tags    | 商品のカテゴリ情報     | 

ポイントはproductsテーブルのquantity_per_dayで、1日の提供数を指定し注文数が１日の提供数を上回らないようにしました。
また注文時に受け取り日時を指定し、各店舗ごと、日にちごとに管理が可能です。

#苦労した点

###CircleCIでAWSへの自動デプロイ
CircleCIを用いて開発環境のDockerイメージをECRにpushし、ECSのタスク定義を更新してデプロイをしましたが、config.ymlの設定でのエラーに悩まされました。
またAWSの各設定にもかなり悩まされ、インフラの知識がないことで時間が結構かかりました。

credentials.ymlでのpay.jpなどのアクセスキー管理でなかなかうまく行かずインデントの重要性がよくわかりました。

#参考記事

Railsでのテストを参考にしました。
[【Rails】はじめてのRSpec！テストコードを書こう！](https://www.techpit.jp/courses/25)

deviseのログイン機能を参考にしました
[【Rails】ログイン機能を実装する](https://qiita.com/d0ne1s/items/7c4d2be3f53e34a9dec7)