Rails + Github Action + EC2 で自動デプロイ
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 コマンドが使えるようにする
作業ディレクトリで以下実行
- Gemファイル作成
$ bundle init
- Gemファイルで下記をコメントイン
# gem "rails"
- Railsインストール
$ bundle install --path vender/bundle
- プロジェクト作成
$ bundle exec rails _7.0.4_ new api --api
- 1~3 で作られたファイルは一旦いらないので削除
- 起動して確認
$ cd api
$ bin/rails server
http://127.0.0.1:3000/ にアクセスして下記の画面が出たのでOKそう
きっと docker でやったほうが早い。。。
参考
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]
参考
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
参考
Docker Compose で Rails+Postgres 環境を作る
下記の記事を参考
ファイルの変更をしても反映されないので下記を参考
$ 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の作り直し
下記のエラーが解消できず
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/ ディレクトリができるようにしたら動いた
参考