ローカル環境のdbをfly.ioのdbに移行する

無料枠のfly.ioだと、rails db:seedを実行した時メモリが不足しているようで途中で止まってしまうので ローカル環境のdbの内容を移行することにしてみました。

postgreSQLのコンテナの中でpostgresユーザーに切り替えた後に、pg_dumpコマンドでデータベースのバックアップを取得します。

docker exec -it <PostgreSQLのcontainer id> bash
su - postgres
pg_dump myapp_development > myapp_development.dump
exit
exit

docker cpコマンドで取得したバックアップをホスト環境に持ってきます。

docker cp  <PostgreSQLのcontainer id>:/var/lib/postgresql/myapp_development.dump myapp_development.dump

fly proxyコマンドを実行するとpsqlコマンドでfly.ioのPostgreSQLに接続できるようになるようになるみたいです。

fly proxy 15432:5432 -a <postgres-app-name>

fly proxyコマンドを実行したら別ターミナルからpsql -fコマンドで取得したバックアップファイルを実行します。

psql postgres://{username}:{password}@localhost:15432 -f myapp_development.dump

usernameとpassowrdは環境変数DATABASE_URLを見ることで確認できると思います。

fly ssh console
env | grep DATABASE_URL

最後にar_internal_metadataテーブルのvalueがdevelopmentとなっているのでproductionに変えておくといいと思います。

fly postgres connect -a <postgres-app-name>
\c db名
delete from ar_internal_metadata where key = 'schema_sha1';
update ar_internal_metadata set value = 'production' where key = 'environment';

fly.ioでデプロイする方法 忘備録

前提

docker、docker-compose、railsのアプリをfly.ioにデプロイしたいと思います。

準備

flyctlのインストールとfly.ioへのサインアップ、クレジットカードの登録を行っておきます。

brew install flyctl
flyctl auth signup

手順

既存のDockerfileを使用しようとするとうまくいかなったので予めDockerfileの名前を変更しておきます。

mv Dockerfile Dockerfile.local

fly launchを叩いて対話的質問に答えていきます。
Dockerfileがない状態でfly launchをすると新たにDockerfileを生成してくれます。
アプリで使用しているrubyのバージョンはホスト環境に予めインストールしておいてください。

fly launch

# 自動的にソースコードをスキャンしてRailsアプリであることを判定してくらしい
Scanning source code
Detected a Rails app

# アプリケーションの名前を指定する。空白でエンターを押すと自動的に名前がつけられる。
? Choose an app name (leave blank to generate one):

# リージョンを指定する。選択肢の中から東京リージョンを選ぶ
? Choose a region for deployment: Tokyo, Japan (nrt)

# yを入力してPostgreSQLを作成する
? Would you like to set up a Postgresql database now? (y/N) 


#  無料枠のDevelopmentを選ぶ
? Select configuration: Development - Single node, 1x shared CPU, 256MB RAM, 1GB disk

# Redisを使用するかどうかを指定する
# 使う場合はyを使わない場合はNを押すといいと思います。
? Would you like to set up an Upstash Redis database now? (y/N) 

# yを入力して.dockerignoreファイルを生成する
? Create .dockerignore from 1 .gitignore files?

するとDockerfilefly.tomlなどが生成されます。
また、dockerfile-railsGemfileに追加されます。 redisを使う選択をした場合はredisもGemfileに追加されます。

生成されたDockerfileに下記を追加します。 ENTRYPOINTの上あたりに書けばいいと思います。

RUN rm -f tmp/pids/server.pid

fly deployでデプロイします。 最後にsuccessfullyと出たらデプロイに成功です。

fly deploy

 1 desired, 1 placed, 1 healthy, 0 unhealthy [health checks: 1 total, 1 passing]
--> v1 deployed successfully

fly openでデプロイしたページを開けます

fly open

seedデータがある場合は fly ssh consoleでサーバに接続できるのでseedデータを作成します。

fly ssh console
cd rails
bundle exec rails db:seeds

-Cオプションでワンライナーでもできるらしいのですがrails aborted! No Rakefile found (looking for: rakefile, Rakefile, rakefile.rb, Rakefile.rb)と出てうまくいきませんでした。
試してはないですが下記のサイトの方法を試すことでうまくいくかもしれません。 community.fly.io

環境変数は下記のコマンドでセットすることができます。

flyctl secrets set XXX=yyy

ログは下記のログで見ることができます。

flyctl logs

production環境にデプロイすることになるので、本番環境用の設定を追加してあげるといいと思います。

ただし、データベースとの設定は環境変数DATABASE_URLが使われる(自動で設定されます)ので database.ymlファイルを編集する必要はないみたいです。

$ flyctl secrets list
Update available 0.0.493 -> 0.0.495.
Run "flyctl version update" to upgrade.
NAME            DIGEST              CREATED AT
DATABASE_URL    e1d6875307e7602b    2023-03-20T23:52:58Z

下記のコマンドでpostgreSQLに接続できます

fly postgres connect -a <postgres-app-name>(postgres-app-nameはfly.ioのダッシュボードから確認できます)

最後にDockerfileの名前を変更したので 引き続きローカルで実行できるようdocker-compose.ymlも修正しておくといいと思います

    build:
      context: .
      dockerfile: 'Dockerfile.local'

シェルスクリプト個人メモ

  • 変数を代入するときvar = helloなどのようにイコールの前後に空白があるとエラーとなる
  • readonlyをつけると変更できない変数にすることができる
  • $1は第一、$2は第二引数
  • $#は引数の個数
  • $@は全ての引数
  • $0はスクリプトの名前
  • read varでユーザーの入力を変数varに代入できる
  • read -p "Name: " nameでユーザーからの入力を受け取るときターミナルに文字を表示することができる
  • array=(a b c)で配列を作ることができる
  • array[i]=valueで配列のi番目に代入できる
  • ${array[i]}で配列のi番目の要素を取得ができる
  • ${array[@]}で配列の全ての要素を取得できる
  • ${#array[@]}で配列の要素数を取得できる
  • array+=(d e)で配列に要素を追加できる
  • 二重中括弧で計算できる(例:echo ((1+1)) // 2((n=n+22)))、二重中カッコ内の空白はあってもなくてもいい
  • if test then fiもしくは if then fiでif文を作れる
  • if [ $var = a ]のの前後の空白は必要、=の前後の空白は片方のみ空白だとエラーとなる?(基本は=の前後に空白を入れればok)
  • elif [ $var = b ]; then でさらなる条件文を作れる
  • 文字列の比較は二重大括弧を使う、[[ $var = "a b" ]]みたく$varには""をつけなくてもok
  • [[ $var =~ ^t ]]正規表現[[ -z $var ]]で$varが空かどうか
  • 数値を比較する場合は二重括弧を使う、if ((n== 2 )); then みたく空白はあってもなくてもok

for文

for i in a b c; do
  echo $i
done
for i in {a..c}; do
  echo $i
done
array=(a b c)
for i in ${array[@]}; do
  echo $i
done
for ((i=1; i<4; i++)); do
  echo $i
done

dpkgとrpm比較表個人用メモ

dpkg rpm
パッケージ一覧 dpkg -l rpm -qa
パッケージの詳細情報 dpkg -s gzip rpm -qi gzip
パッケージに含まれるファイル dpkg -L gzip rpm -ql gzip
ファイルを含むパッケージ dpkg -S /bin/gzip rpm -qf /bin/gzip

アップデートするパッケージのchangelogを確認する方法

yum-plugin-changelogを使おう

まず予めyum-plugin-changelogをインストールしておきます。

yum install yum-plugin-changelog

yum-plugin-changelogをインストールした後は下記で確認できます

yum changelog all パッケージ名 | less

vimコマンド個人用メモ

コマンド 意味
dd 1行削除
n dd n行削除
dw 単語削除
u Undo
Control + r Undo redo
yy 1行コピー
n yy n行コピー
p, P ペースト
0 行頭に移動
$ 行末に移動
gg 1行目に移動
G 最後の行に移動
{, } 段落移動
Control + o 移動前に戻る
/word 検索
n, N 検索結果を移動
:%s/old/new/g 一括置換
:%s/old/new/gc 確認しながら置換
:%d 一括削除

一括インデントするには?
→gg + v(ビジュアルモード) + G + > (<)