PostgreSQLでテーブルを全て削除する方法
truncate
SELECT 'TRUNCATE TABLE ' || ARRAY_TO_STRING(ARRAY_AGG(relname), ',') || ';' AS query FROM pg_stat_user_tables;
schemaを1回消して再作成
drop schema public cascade; create schema public;
ローカル環境の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?
するとDockerfile
やfly.toml
などが生成されます。
また、dockerfile-rails
がGemfile
に追加されます。
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