Open5

Rails + Github Action + EC2 で自動デプロイ

mizkomizko

APIモードのRailsプロジェクト作成

最新バージョン 7.0.4 でプロジェクト作成する

$ rails _7.0.4_ new my_api --api

エラーでた

Traceback (most recent call last):
        2: from ...i/.rbenv/versions/2.7.2/bin/rails:23:in `<main>'
        1: from .../.rbenv/versions/2.7.2/lib/ruby/2.7.0/rubygems.rb:296:in `activate_bin_path'
.../.rbenv/versions/2.7.2/lib/ruby/2.7.0/rubygems.rb:277:in `find_spec_for_exe': can't find gem railties (= 7.0.4) with executable rails (Gem::GemNotFoundException)

ローカルのRubyのバージョンが 2.7.2 だったので rbenv で 3.1.3 取得
作業ディレクトリで ruby の 3.1.3 に変更

rbenv local 3.1.3

再度プロジェクト作成

$ rails _7.0.4_ new my_api --api

エラー

The `rails' command exists in these Ruby versions:
   2.7.2

rails コマンドが Ruby 3.1.3 にないからエラー

とりあえず rails コマンドが使えるようにする
作業ディレクトリで以下実行

  1. Gemファイル作成
$ bundle init 
  1. Gemファイルで下記をコメントイン
# gem "rails"
  1. Railsインストール
$ bundle install --path vender/bundle
  1. プロジェクト作成
$ bundle exec rails _7.0.4_ new api --api
  1. 1~3 で作られたファイルは一旦いらないので削除
  2. 起動して確認
$ cd api
$ bin/rails server

http://127.0.0.1:3000/ にアクセスして下記の画面が出たのでOKそう

きっと docker でやったほうが早い。。。

参考

https://nishinatoshiharu.com/new-rails-tutorial/

mizkomizko

EC2の環境設定

PCから簡単に接続できるように設定

$ cd ~/.ssh
$ vim config

下記を追加

Host [接続名]
    HostName [EC2のオープンIP]
    User ec2-user
    IdentityFile xxx.pem[プライベートキーのパス]

プライベートキーの権限変更

ダウンロードしたままのキーだと以下のエラーが出る

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for 'xxx.pem' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.

下記で権限を変更

$ chmod 600 xxx.pem

接続

$ ssh [接続名]

必要なパッケージのインストール

EC2に入って作業

yum のアップデート

$ sudo yum update

必要パッケージのインストール

$ sudo yum -y install gcc-c++ make patch git curl zlib-devel openssl-devel ImageMagick-devel readline-devel libcurl-devel libffi-devel libicu-devel libxml2-devel libxslt-devel

rbenv で ruby をインストール

$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
$ source .bash_profile

$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
$ rbenv install 3.1.3
$ rbenv rehash
$ rbenv global 3.1.3
$ ruby -v
ruby 3.1.3p185 (2022-11-24 revision 1a6b16756e) [x86_64-linux]

参考

https://pikawaka.com/rails/ec2_deploy

mizkomizko

EC2にRailsアプリを手動でデプロイする

Gitに連携

SSHキーを作成

$ ssh-keygen -t rsa

作成した公開鍵の中身をGitに設定

$ cat /home/ec2-user/.ssh/id_rsa.pub

Gitに接続できるか確認

$ ssh -T git@github.com

アプリを動かす準備

デプロイ先のディレクトリを準備

$ sudo mkdir /var/www/
$ sudo chown ec2-user /var/www/

Nginxをインストール

$ sudo amazon-linux-extras install nginx1

Nginxを起動

$ sudo systemctl start nginx

httpでアクセスして下記の画面が出たのでOKそう

Nginx で Puma が動くように設定

upstream rails-app {
  server unix:/var/www/[リポジトリ名]/tmp/sockets/puma.sock fail_timeout=0;
}

server {
  listen 80;
  server_name [IP];
  root /var/www/[リポジトリ名]public;

  location ^~ /assets/ {
    gzip_static on;
    expires max;
    add_header Cache-Control public;
  }

  location @rails-app {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_set_header X-Real_IP $remote_addr;
    proxy_redirect off;
    proxy_pass http://shoppin-api;
  }

  try_files $uri/index.html $uri @rails-app;
  error_page 500 502 503 504 /500.html;
}

Gitからアプリをクローンする

$ cd /var/www
$ git clone [SSHのクローンURL]
$ cd [リポジトリ名]
$ bundle install

secret_key_base の作成

$ bin/rake secret

コマンド結果をコピーして /etc/environment に貼り付ける

# /etc/environment
SECRET_KEY_BASE='[上記コマンドの結果]'
RAILS_MASTER_KEY='[Railsアプリのmaster.keyの中身の貼り付け]'
RAILS_ENV='production'

サーバから出て、上記の設定を反映させる

Nginx再起動してRailsサーバ起動

$ sudo systemctl reload nginx
$ sudo systemctl start nginx
$ bin/rails server

参考

https://pikawaka.com/rails/ec2_deploy
https://nishinatoshiharu.com/nginx-puma-setting/

mizkomizko

Docker Compose で Rails+Postgres 環境を作る

下記の記事を参考
https://zenn.dev/hs7/articles/2cc4d67650ba69

ファイルの変更をしても反映されないので下記を参考
https://rurukblog.com/post/docker-compose-file-update/

$ docker-compose build --no-cache を実行

$ docker-compose up したら下記のエラーが発生

could not connect to server: No such file or directory
Is the server running locally and accepting
connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?

https://teratail.com/questions/178489 を参考
databese.ymlに host: db を追加

見慣れた画面になった

下記を実行

$ bin/rails db:create

作った環境をEC2にデプロイする

EC2インスタンスに install されているパッケージを update

$ sudo yum -y update

EC2にDockerをインストール

$ sudo yum -y install docker

EC2でインストールしたDockerを起動

$ sudo service docker start

ec2-user に docker 実行権限を渡す

$ sudo usermod -a -G docker ec2-user

※ インスタンスにログインし直す

Dockerの自動起動設定

$ sudo systemctl enable docker

設定できたか確認

$ systemctl is-enabled docker
enabled

docker-compose インストール

$ sudo mkdir -p /usr/local/lib/docker/cli-plugins
$ VER=2.4.1
$ sudo curl \
  -L https://github.com/docker/compose/releases/download/v${VER}/docker-compose-$(uname -s)-$(uname -m) \
  -o /usr/local/lib/docker/cli-plugins/docker-compose
$ sudo chmod +x /usr/local/lib/docker/cli-plugins/docker-compose
$ sudo ln -s /usr/local/lib/docker/cli-plugins/docker-compose /usr/bin/docker-compose

# インストール確認
$ docker-compose --version

Gitインストール

$ sudo yum install git

SSHキー作成してGitに接続できるようにする

$ ssh-keygen -t rsa

# 下記で表示される内容をGitに登録
$ cat /home/ec2-user/.ssh/id_rsa.pub 

# 接続確認
$ ssh -T git@github.com

Gitからアプリをコピーする

$ sudo mkdir /var/www/
$ sudo chown ec2-user /var/www/
$ cd /var/www
$ git clone [SSHのクローンURL]
$ cd [リポジトリ名]

下記のエラーが発生

 Missing `secret_key_base` for 'production' environment, set this string with `bin/rails credentials:edit` (ArgumentError)

下記の2記事を参考にmaster.keyの作成とcredentials.yml.encの作り直し
https://zenn.dev/jinwatanabe/articles/d8e73fcccf16fbfed9df
https://qiita.com/zenfumi/items/4a7cbab59f0f7ede0d6e

下記のエラーが解消できず

api-web-1  | 2023/03/04 11:44:10 [crit] 6#6: *1 connect() to unix:/myapp/tmp/sockets/puma.sock failed (2: No such file or directory) while connecting to upstream, client: "NginxサーバーのIP", server: *, request: "GET /list/ HTTP/1.1", upstream: "http://unix:/myapp/tmp/sockets/puma.sock:/list/", host: "パブリックIP"

この記事を参考に、Nginxのコンテナにも /myapp/tmp/sockets/ ディレクトリができるようにしたら動いた
https://qiita.com/NaokiIshimura/items/7cb2390243939a34754f

参考

https://weseek.co.jp/tech/2196/#7_EC2_Docker_install
https://kacfg.com/aws-ec2-docker/#EC2Docker

mizkomizko

TODO

GithubActionで自動デプロイできるようにする