web_bonsaiの日記

web開発の学習日記です。誰に見せるためでもないただの日記です。

さくらVPSを契約する | Mac + Docker + Rails その0012

さくらVPSを契約する

会員メニューにログイン

  • 会員メニューにログインする

プランを選ぶ

  • プランを選ぶ

サーバー設定

  • サーバー名(任意): 何かわかりやすい名前
  • サーバー説明(任意): 何かわかりやすい説明
  • インストールするOS: CentOS
  • OSバージョン: 最新バージョン
  • 管理ユーザーのパスワード: 何か強いパスワードを設定
  • スタートアップスクリプト: Setup and update を選択する
    • スタートアップスクリプト設定
      • 初回起動時にパッケージ更新する: 更新する
      • 日本語環境 ja_JP.UTF-8 に変更する: 変更しない
      • ホスト名を設定する。設定する場合のみ FQDN を入力してください。: 入力しない(後で設定する)
      • SSHポートを変更する。変更する場合のみ入力してください。: 入力しない(後で設定する)
      • ログインユーザ名を変更する。変更する場合のみ入力してください。: 入力しない(後で設定する)
      • キーボード配列のVM内部設定をUS配列に変更する。コントロールパネルの設定も変更する必要が有ります。: 変更しない
      • VM内部のファイアウォールを有効化する。パケットフィルタを無効化する事をお勧めします。: ファイアウォールを有効化しない
      • ウェブ管理インタフェース Cockpit をインストールする。: インストールする
      • (対応している場合)IPv6 を有効化する。: 有効化する
      • スワップ(swapfile)を作成する。: 作成しない
      • パッケージ管理システム Snappy(snap) をインストールする。パッケージ更新が実施されます。: インストールする
      • (RedHat系のみ) SELinux を有効化する。: 有効化する
      • カーネルクラッシュダンプを有効化する。メインメモリが予約されます。: 有効化しない
      • タイムゾーンを変更する。: 変更しない Asia/Tokyo
  • パケットフィルター設定(以下の初期値から変更できないらしいが、OS再インストールのときは変更できそう)
    • 利用する
    • TCP 22
  • サーバーへのSSHキー登録
    • 登録する
    • SSHキー: 公開鍵の文字列をコピペ
    • パスワードを利用したログイン: 無効にする(一旦無効にしておいて必要に応じて一時的に有効にする)

注: まずはSSHのキーペアを使用してログインすること、パスワードを利用したログインを無効にすることが重要だと思います。

サーバーを起動する

申し込みから15分程度して、コントロールパネルのページをリロードしてみたら、もうサーバーの準備ができていました。

「電源操作」というドロップダウンから「起動する」を選択して起動しました。

sshでログインする

ターミナルで以下のコマンドを実行します。

ssh ユーザ名@ホスト名 -p 22

SSHキーに設定されたパスフレーズの入力を求められるので、パスフレーズを入力します。

これで無事にログインできるはず。

できなかったらコントロールパネルからOSを再インストールします。

rails newしてからrails/.gitignoreを編集する | Mac + Docker + Rails その0011

参考にさせていただいたページ

.gitignoreについて

config/environmentsについて

今日の環境

  • M1 Mac
  • macOS Monterey
  • Docker Desktop 4.8.x
  • Docker Compose v2.5.0

はじめに

gitリポジトリ

  • 入れるべきファイル
  • 入れた方が良いファイル
  • 入れない方が良いファイル
  • 入れては駄目なファイル

よくわからないなー。と思いつつ、合っている自信はまったく無いけど、ちょこちょこ調べつつ.gitignoreを編集します。

会っているかわからないので、もしこの記事を参考にしているという方がいらっしゃったら、ご自身の責任で.gitignoreの編集をしてください。

私は一切責任を負いません。

railsのスタートページを表示させるところまでやる

以前書いた「Docker Composeを使ってローカルでRails7のSSL環境構築 | Mac + Docker + Rails その0006 - web_bonsaiの日記」のboilerplateを使用して、web_bonsaiディレクトリ内でrailsのスタートページを表示するところまでやります。

rails/.gitignoreを一度commitする

rails newしたときに rails/.gitignore が生成されましたので一度commitします。

GitHubで生成した.gitignoreと合わせてみる

開発用のリポジトリを作成してcloneして準備をする | Mac + Docker + Rails その0009 - web_bonsaiの日記」で保存しておいた「.gitignore_by_git_hub」を使って、一旦rails/.gitignoreを上書きして差分を確認してみます。

差分が確認できたら、足りない項目を rails new で生成された.gitignoreに追記しておきます。

.gitignore_by_git_hubの方には、以下の記述がありましたので、rails/.gitignoreに追記しておきました。

# Ignore pidfiles, but keep the directory.
/tmp/pids/*
!/tmp/pids/
!/tmp/pids/.keep

# Ignore uploaded files in development.
/storage/*
!/storage/.keep
/tmp/storage/*
!/tmp/storage/
!/tmp/storage/.keep

rails/.gitignoreをもう一度commitする

もう一度commitします。

これでGitHubで生成した.gitignoreとrails newで生成した.gitignoreがマージできました。

gitignoreリポジトリの内容も合わせてみる

gitignore/Rails.gitignore at main · github/gitignore · GitHub」の内容をrails/.gitignoreにコピペしてみます。

差分を確認すると足りない項目があったので一応追記しておきます。

以下の行を .env の下に追記しました。

.env*.local

以下の行を !/storage/.keep の下に追記しました。

/public/uploads

gitリポジトリに入れては駄目なファイルについてもう少し調べたりする

参考にさせていただいた「ちょっと待った! Railsでgitリポジトリから除外すべきでないファイル:Gemfile.lockとdb/schema.rb|TechRacho by BPS株式会社」によると、以下のファイルが挙げられていますが2014年の記事なのでさらっと参考程度に思っておきます。

  • .rvmrc
  • config/database.yml

gitリポジトリに入れては駄目なファイルがまだよくわからないので、コツコツaddしてcommitしつつ、「これは駄目かもしれない。」と思うファイルを自分なりにリストアップしてみます。

rails/config/master.key などの明らかに入れては駄目なファイルは、既にrails/.gitignoreに記述されているので git status したときに Untracked files にはリストアップされませんし、addされません。

ファイルの中身を確認したり、ファイルの役割をwebで検索したりしてみましたが、とりあえず rails/config/database.yml を追記すれば今の段階では良さそうに感じました。

railsについてもう少し学習してから再考したいと思います。

.gitignoreにdatabase.ymlを追記する

rails/.gitignoreに以下の通りdatabase.ymlを追加しておきます。

config/database.yml

database.yml.sampleの作成

以下のコマンドで database.yml.sample を作成します。

cp rails/config/database.yml rails/config/database.yml.sample

commitしておきます。

開発用のリポジトリを作成してcloneして準備をする | Mac + Docker + Rails その0009

開発用リポジトリの作成

前回boilerplateのリポジトリを作成しました。

今回は継続的に開発をしていくためのリポジトリを作成しました。

リポジトリ名は web_bonsai リポジトリとしました。

このとき、Rails用の.gitignoreを選択しています。

cloneする

作業用の端末に git clone します。

Rails用の.gitignoreを別名でちょっと置いておく

Rails用の.gitignoreをコピーして、.gitignore_by_git_hub という名前でデスクトップにでも置いておくことにします。

cp .gitignore ~/Desktop/.gitignore_by_git_hub

これは次回以降の記事で使う予定です。

.gitignoreを編集する

.gitignoreの中身を丸ごと削除して以下の通り記述します。

https_portal
/tmp
/nginx/log/nginx/*
!/nginx/log/nginx/.keep

一旦.gitignoreをコミットする

.gitignoreをcommitしてpushしておきます。

nginx/log/nginx/.keepファイルを作成してcommitする

以下のコマンドを実行してファイルを作成します。

touch nginx/log/nginx/.keep

コミットしておきます。

Railsの環境構築ができたのでboilerplateリポジトリを作成しておく | Mac + Docker + Rails その0008

以下の記事に書いた手順で環境構築ができたので、一旦GitHubでdocker_compose_rails_boilerplateリポジトリを作成して、docker-compose.ymlなどをpushしておいた。

Docker Composeを使ってローカルでRails7のSSL環境構築 | Mac + Docker + Rails その0006 - web_bonsaiの日記

これでいつでもさっと環境構築できる。

Docker Composeで構築したrailsアプリケーションなどのコマンドチートシート | Mac + Docker + Rails その0007

はじめに

すぐに忘れてしまうので覚書です。

Docker Composeで構築したrailsアプリケーションのよく使うコマンド

サービスの起動
docker-compose start

サービスの停止
docker-compose stop

サービスの再起動
docker-compose restart

指定したサービスだけを再起動
docker-compose restart サービス名 サービス名

railsのコンテナに入ってコマンドを実行
docker-compose exec app bin/rails c
docker-compose exec app bin/rails db:migrate

railsのコンテナを起動してコマンドを実行
docker-compose run --rm app bin/rails c
docker-compose run --rm app bin/rails db:migrate

railsのコンテナに入って継続的にコマンドを実行
docker-compose exec app bash

DockerまたはDocker Composeのその他のコマンド

サービス一覧
docker-compose ps

すべてのコンテナ一覧
docker ps

コンテナ・ネットワークの削除
docker-compose down

コンテナ・ネットワーク・ボリュームの削除
docker-compose down -v

ログの表示
docker-compose logs -f --tail 10 サービス名
docker-compose logs -f --tail 10 --no-log-prefix サービス名

Docker Composeを使ってローカルでRails7のSSL環境構築 | Mac + Docker + Rails その0006

参考にさせていただいたページ

今日の環境

プロジェクトディレクトリを作成して移動

ディレクトリ名は何でも良いです。

このあと作成していく設定ファイルの記述内容にも影響しません。

mkdir rails_sample
cd rails_sample

docker-compose.ymlの作成とその記述内容

vim docker-compose.yml

記述内容は以下の通りです。

version: "3.9"
services:
  nginx:
    build: ./nginx
    ports:
      - "8000:8000"
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./nginx/html:/var/www/html
      - ./nginx/log:/var/log
    depends_on:
      - app
  https-portal:
    image: steveltn/https-portal:1
    ports:
      - 80:80
      - 443:443
    restart: always
    environment:
      DOMAINS: 'localhost -> http://nginx:8000'
      STAGE: local
    volumes:
      - ./https_portal/ssl_certs:/var/lib/https-portal
    depends_on:
      - nginx
  db:
    image: postgres
    volumes:
      - ./tmp/db:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: password
  app:
    build: ./rails
    ports:
      - "3000:3000"
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - ./rails:/myapp
    environment:
      - RAILS_SERVE_STATIC_FILES=false
      - RAILS_ENV=development
    depends_on:
      - db

nginxディレクトリ作成

mkdir nginx

nginx用のDockerfileの作成とその記述内容

vim nginx/Dockerfile

記述内容は以下の通りです。

FROM nginx:1.20

nginx/nginx.confの作成とその記述内容

vim nginx/nginx.conf

記述内容は以下の通りです。

user nginx;

events {
  # 1ワーカーの接続数
  # worker_connections 2048;

  # 複数のリクエストを同時に受け付けるか
  multi_accept on;

  # 複数アクセスをさばくためにI/O多重化に使うシステムコールを指定する
  use epoll;
}

http {
  # HTTPレスポンスヘッダのContent_Typeに付与する文字コード
  charset UTF-8;

  # HTTPレスポンスヘッダのServerにnginxのバージョンを入れるか(開発時以外は入れないほうが吉)
  server_tokens off;

  # upstreamのpumaを定義
  upstream puma {
    # server service名:3000; のように記述
    server app:3000;
  }

  # 
  server {
    # リスニングポート
    listen 8000;

    # ドメイン設定
    # server_name web-bonsai.com;
    server_name localhost

    # HTTPレスポンスヘッダのContent_Typeに付与する文字コード
    charset utf-8;

    # logの出力先
    access_log /var/log/nginx/access.log;
    error_log  /var/log/nginx/error.log;

    # ドキュメントルート
    root /var/www/html;

    # location
    location /index.html {
      index index.html;
    }

    # location
    location / {
      #proxy_set_header X-CSRF-Token $http_x_csrf_token;
      #proxy_set_header X-Real-IP $remote_addr;
      proxy_pass http://puma;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host $http_host;
      proxy_set_header X-Forwarded-Proto $scheme;
      proxy_redirect off;
    }
  }
}

nginx/htmlディレクトリを作成

mkdir nginx/html

nginx/html/index.htmlの作成とその記述内容

vim nginx/html/index.html

記述内容は以下の通りです。

web_bonsai index.html

nginx/log/nginxディレクトリの作成

mkdir nginx/log
mkdir nginx/log/nginx

logファイルを空で作成

touch nginx/log/nginx/access.log
touch nginx/log/nginx/error.log

railsディレクトリを作成

mkdir rails

rails用のDockerfileの作成とその記述内容

vim rails/Dockerfile

記述内容は以下の通りです。

FROM ruby:3.1.2

RUN apt-get update -qq && apt-get install -y nodejs postgresql-client
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
COPY . /myapp

# Add a script to be executed every time the container starts.
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

# Configure the main process to run when running the image
CMD ["rails", "server", "-b", "0.0.0.0"]

rails/Gemfileの作成とその記述内容

vim rails/Gemfile

記述内容は以下の通りです。

source 'https://rubygems.org'
gem 'rails', '~>7'

rails/Gemfile.lockを空で作成

touch rails/Gemfile.lock

entrypoint.shの作成とその記述内容

vim rails/entrypoint.sh

記述内容は以下の通りです。

#!/bin/bash
set -e

# Remove a potentially pre-existing server.pid for Rails.
rm -f /myapp/tmp/pids/server.pid

# Then exec the container's main process (what's set as CMD in the Dockerfile).
exec "$@"

ここまでやった段階でのディレクトリ構造とファイル構成

.
├── docker-compose.yml
├── nginx
│   ├── Dockerfile
│   ├── html
│   │   └── index.html
│   ├── log
│   │   └── nginx
│   │       ├── access.log
│   │       └── error.log
│   └── nginx.conf
└── rails
    ├── Dockerfile
    ├── entrypoint.sh
    ├── Gemfile
    └── Gemfile.lock

rails newする

docker-compose run --rm --no-deps app rails new . --force --database=postgresql

rails newされて、railsのプロジェクトが生成されます。

このときGemfileやGemfile.lockが更新されます。

以下のようなエラーが赤字で出力されました。

         run  bundle binstubs bundler
Could not find gem 'sprockets-rails' in locally installed gems.
       rails  importmap:install
Could not find gem 'sprockets-rails' in locally installed gems.
Run `bundle install` to install missing gems.
       rails  turbo:install stimulus:install
Could not find gem 'sprockets-rails' in locally installed gems.
Run `bundle install` to install missing gems.

bundle installする

以下のコマンドを実行します。

docker-compose run --rm app bundle install

白字なのでエラーではなさそうですが以下のメッセージが表示されました。

RubyZip 3.0 is coming!
**********************

The public API of some Rubyzip classes has been modernized to use named
parameters for optional arguments. Please check your usage of the
following classes:
  * `Zip::File`
  * `Zip::Entry`
  * `Zip::InputStream`
  * `Zip::OutputStream`

Please ensure that your Gemfiles and .gemspecs are suitably restrictive
to avoid an unexpected breakage when 3.0 is released (e.g. ~> 2.3.0).
See https://github.com/rubyzip/rubyzip for details. The Changelog also
lists other enhancements and bugfixes that have been implemented since
version 2.3.0.

docker-compose buildする

参考ページに倣って以下のコマンドを実行します。

docker-compose build

railsのデータベース設定をする

参考ページに倣って、config/database.ymlを以下の通りになるように編集します。

default: &default
  adapter: postgresql
  encoding: unicode
  host: db
  username: postgres
  password: password
  pool: 5

development:
  <<: *default
  database: myapp_development


test:
  <<: *default
  database: myapp_test

たぶんdefaultの host, username, password の項目を追記するだけだと思います。

db createする

参考ページに倣って以下のコマンドを実行します。

docker-compose run app rails db:create

docker-compose upする

参考ページに倣って、以下のコマンドで、各サービスを起動します。

docker-compose up

localhostにアクセスしてみる

https://localhost/」にアクセスすると、証明書が開発環境用なので「この接続ではプライバシーが保護されません」の警告が表示されます。

そのままアクセスするとrailsのスタートページが表示されました。

https://localhost/index.html」にアクセスすると、作成した nginx/html/index.html の内容が表示されました。

これでローカル環境がhttpsで表示できるようになりました。