アウトプットログ

チラシの裏からの脱出に向かう線形のブログ

前回の続き

参考にさせていただいた記事:

【Imagemagick対応】Dockerを利用して、Rails環境を作成 - Qiita

Dockerで作成したRailsアプリをHerokuにデプロイ - Qiita

動かなかった箇所を修正しつつログしておきます。

1)まずはRails アプリを作成

フォルダ作成、Dockerfile, docker-compose.yml, Gemfile, Gemfile.lockを作成して内容編集

#Dockerfile

FROM ruby:2.6

ENV RUNTIME_PACKAGES="linux-headers libxml2-dev libxslt-dev make gcc libc-dev nodejs tzdata postgresql-dev postgresql" \
    DEV_PACKAGES="build-base curl-dev" \
    HOME="/myapp"

WORKDIR $HOME

# Counter Measure to Error:"Autoprefixer doesn’t support Node v4.8.2. Update it"
RUN curl -sL https://deb.nodesource.com/setup_10.x | bash - \
        && apt-get install -y nodejs

RUN apt-get update && \
    apt-get install -y default-mysql-client \
    postgresql-client \
    sqlite3 \
    --no-install-recommends && \
    rm -rf /var/lib/apt/lists/*

ADD Gemfile      $HOME/Gemfile
ADD Gemfile.lock $HOME/Gemfile.lock

RUN bundle install

ADD ./ $HOME
COPY ./ $HOME

CMD ["rails", "server", "-b", "0.0.0.0"]
#docker-compose.yml
version: '3'
services:
    image: postgres
    environment:
      POSTGRES_HOST_AUTH_METHOD: 'trust'
  web:
    container_name: rails_app
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db
#Gemfile
source 'https://rubygems.org'
gem 'rails', '5.2.2'

gem 'rmagick'

2) コンテナの立ち上げ

ターミナルを立ち上げて、docker-compose runでRailsファイル群を作成

docker-compose run web rails new . --force --database=postgresql

3) できたファイルの中にあるdb関連のconfigをいじる

#config/database.yml
default: &default
  adapter: postgresql
  encoding: unicode
  host: db           # 上書き
  username: postgres # 上書き
  password:          # 上書き
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>

4)Railsを起動してみる

docker-compose up

http://localhost:3000にアクセスして確認。

Activerecord dbエラーが多分出るので、データベースを作成し、マイグレートする。

docker-compose run web rails db:create
docker-compose run web rails db:migrate

もう一度起動確認。

docker-compose up

http://localhost:3000にアクセスして確認。

5)次の準備のために起動停止する。

docker-compose restart
docker-compose stop

6) Herokuの準備

herokuのダッシュボードでNew > create new app

App nameを設定:任意

次にHerokuの postgres add-onを設定

Appのページoverviewタブで、Configure Add-onsをクリック

heroku postgresをHobby Devで設定

設定確認できたら、Heroku PostgessコンテナのしたにあるIDをメモっておく

7)コンテナをHerokuにプッシュ

(プッシュする前にRailsコンテナが停止していることを確認する)

Appファイルのある場所でターミナルにコマンド入力

heroku login
heroku container:login
heroku container:push web -a [アプリ名]  #めっちゃ時間かかる
heroku container:release web -a [アプリ名]
heroku addons:attach [postgressコンテナ名] -a [アプリ名]

heroku run rake db:migrate -a [アプリ名]
heorku open -a [アプリ名]

できました。

ローカルだけで起動確認した時:

f:id:araquan:20200228210801p:plain

ちゃんとHerokuでデプロイできた時:

f:id:araquan:20200228210839p:plain

Docker + Rails + Postgres + Heroku UPまで

まずはこちらの記事を参照させていただきました。

qiita.com

書かれているとおりに進めて、 $ docker-compose up

をしたところでこんなエラーが出ます:

db_1   | Error: Database is uninitialized and superuser password is not specified.
db_1   |        You must specify POSTGRES_PASSWORD to a non-empty value for the
db_1   |        superuser. For example, "-e POSTGRES_PASSWORD=password" on "docker run".
db_1   | 
db_1   |        You may also use "POSTGRES_HOST_AUTH_METHOD=trust" to allow all
db_1   |        connections without a password. This is *not* recommended.
db_1   | 
db_1   |        See PostgreSQL documentation about "trust":
db_1   |        https://www.postgresql.org/docs/current/auth-trust.html

docker-compose.ymlのdbの箇所を下記のように書き換えました:

services:
  db:
    image: postgres
    environment:
      POSTGRES_HOST_AUTH_METHOD: 'trust'

参照記事:

PostgresのDockerImageに変更があって起動ができなくなった話 - Qiita

今度はlocalhostで立ち上げると、 FATAL: database "myapp_development" does not exist というエラーが出ます。

データベースが無いのか、ということで

$ docker-compose run web rails db:create
$ docker-compose up

をしたところ、無事ローカルでアプリケーションが起動しました。 f:id:araquan:20200224214117p:plain

その後、元の参照記事に従いHerokuへデプロイを試しましたが、まだ何も作っていないからなのか

$ heroku container:release web
$ heroku open

をしても確認できるのはHerokuの画面のみですね。これで良いのだろうか・・?

f:id:araquan:20200224220144p:plain

迷走記録とHeroku Application Error (Sinatra)

TOMONIがスタートしてはや3週間が経つ。ここ最近の迷走っぷりを記しておこう。

1月に何度も失敗したSinatraアプリのHeroku デプロイを試すため、Rails Tutorial 1章を参考にしてRailsアプリの作成からHerokuデプロイまでやってみる

                   ↓

何度も試すが失敗が続き、ふと職場のWindows PCを用いてCloud9で試したところ成功

全く同じように自分自身のMacBookで試すがやはり失敗

MacBookを初期化、まっさらな環境でMacBookからCloud9に繋いで試したところ今度は成功

(デプロイできた内容は "Hello World"を表示させるだけのもの)

                   ↓

Hello Worldのデプロイが確認できたので、Cloud9上に過去にProgate Ruby on Railsをやりながら試作していた「ほぼProgate自作アプリ」を移植するという課題に取り掛かる

こちらに取り掛かろうとしたところ、なんと!「ほぼProgateアプリ」をバックアップの失敗で消していたことに気が付く

また、バックアップには成功していたSinatra アプリがRubyバージョンの干渉等で動かず、かつリンクしたPostgresqlのデータも消してしまっていることに気が付く

                   ↓

Rails Tutorial動画は購入済み。しかしまずは移植とデプロイをやらないといけない雰囲気の中、独力でデータベースを使ったアプリがまずCloud9上でできるのか?という疑問がわく

職場の研究者と雑談していた際、そもそもAWSは素人には危ないのではないかというお話を聞かされる

SSH公開鍵承認の方法を調べ、試す、なんとなく理解

そんな頃Dockerのハンズオンを受講する機会が得られる

                   ↓

メンターに相談した結果、Docker上でRails環境を作ってアプリ制作を進めるという方向に

                   ↓

Dockerについてハンズオン復習と、教科書学習の上 Docker でRails開発環境を作る勉強をする

                   ↓

DockerでRails+Heroku UP (クリアできた)

                   ↓

DockerでRails + Postgres + Heroku UP   ←今ここ 全然うまくいかない。特にPostgresとActiveRecordのあたりでつまづく。こちらのエラーは次に詳しくログする予定。

辛くなってきたので、ちょっと戻って ローカルでSinatra アプリを使える状態にするため、Rbenvなどで設定の上、Postgresqlでデータベース、テーブルを作成。ローカルで使えるようにした。良かった。

それを持って、Herokuデプロイを試した結果出たエラーが下記です。つまりこれが1月中に何度も何度も出していたApplication Errorの中身です。

2020-02-24T08:45:39.933513+00:00 heroku[web.1]: State changed from crashed to starting
2020-02-24T08:45:42.122713+00:00 heroku[web.1]: Starting process with command `bundle exec ruby heroku_study.rb -p 12155`
2020-02-24T08:45:45.276520+00:00 heroku[web.1]: State changed from starting to crashed
2020-02-24T08:45:45.279904+00:00 heroku[web.1]: State changed from crashed to starting
2020-02-24T08:45:45.114952+00:00 app[web.1]: heroku_study.rb:5:in `<main>': uninitialized constant ActiveRecord (NameError)
2020-02-24T08:45:45.260192+00:00 heroku[web.1]: Process exited with status 1
2020-02-24T08:45:47.060911+00:00 heroku[web.1]: Starting process with command `bundle exec ruby heroku_study.rb -p 19040`
2020-02-24T08:45:49.134296+00:00 heroku[web.1]: State changed from starting to crashed
2020-02-24T08:45:49.117858+00:00 heroku[web.1]: Process exited with status 1
2020-02-24T08:45:49.069069+00:00 app[web.1]: heroku_study.rb:5:in `<main>': uninitialized constant ActiveRecord (NameError)
2020-02-24T08:45:50.365616+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/" host=boiling-spire-98775.herokuapp.com request_id=6b20b719-f2df-4d1a-b165-96302597ccc3 fwd="222.14.238.32" dyno= connect= service= status=503 bytes= protocol=https
2020-02-24T08:45:51.113023+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/favicon.ico" host=boiling-spire-98775.herokuapp.com request_id=087eb9ee-5d04-4fa8-92bc-33d67b32c45e fwd="222.14.238.32" dyno= connect= service= status=503 bytes= protocol=https

備忘ログ Cloud9 とGithub 公開鍵設定方法

Git飼い慣らし週間の記録。

前回ログ(下記)の解決方法についてメモ。

The authenticity of host 'github.com (192.30.253.112)' can't be established.
RSA key fingerprint is SHxxxxxxxxxxxxxxxxxxxxxxxxxxx.
RSA key fingerprint is MDxxxxxxxxxxxxxxxxxxxxxxxxxxx.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'github.com,192.30.253.112' (RSA) to the list of known hosts.
Permission denied (publickey).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.

Mac OSSierra以降、githubSSH鍵が毎回設定しないといけないような仕様になってしまったという文章を発見しました。回避方法について、Githubの文書内にもこちらに記載あり。ただあくまでローカル環境の設定方法なので、こちらは追って対処。

***Cloud9からGitHubにアクセスできるよう、公開鍵を登録します。

  1. Cloud9 の環境上でSSH鍵を作成する。
$ cd ~/.ssh
$ ssh-keygen -t rsa -b 4096 -C "xxxxx@email.com" (自分のメアド)

何か色々聞いてくれますが、とりあえずブランクでエンターを3回押せば2つの鍵が生成されます:

別の名前で鍵を作成したい場合は1つ目の問いの箇所で下記のように設定する

Enter file in which to save the key (/Users/(username)/.ssh/id_rsa):id_rsa_github

作成した公開鍵を表示させてみて、コピペする

$ cat ~/.ssh/id_rsa.pub
ssh-rsa XXXXXXXXXXXXXXXXXXXXXXX(4行ぐらいの暗号みたいな文字羅列) xxxx@email.com (先に指定したメアド)

Githubのアカウントで、Settingを開いてSSH and GPG keysを選択 New SSH Keyをクリック、Titleに適当な名前をつけ、Keyの箇所に、上記ssh-rsaを含めメールアドレスが始まる前までをペースト、Add SSH Key ボタンを押す。

-->設定できたらメールも来る

GitHub上でリポジトリを作成し、作成できたらそのリポジトリに書かれているコードを打ち込んでいけばgit push -u origin masterで全てのデータが保存される。

エラーとの戦い 

2回目のメンターさんとのセッションが終わりました。備忘ログです。

エラーに次ぐエラーに次ぐエラーでパニックというお話をしたところ、それはエンジニアの中でも通常の作業です、とのこと。おすすめはエラーが出て、そのエラーログでGoogle検索などして出てきた打開策を施す。それで次に進んだり、また別のエラーが出ると、「状況が変わった」と認識して次のエラーをまた調べていく。そうこうしているうちに勘所が掴めてくる。

これがテスト&エラーの繰り返しというやつですか。

現役プロのエンジニアさんのお言葉なので響きました。

そして私の方から、「エラーがどんどん重なって行って引き返せない状況になりパソコンが壊れるかもという不安がある」とお伝えしたところ、

「パソコンは壊れません!」と強いお言葉。初期化しなくても開発環境の再構築(Git client リセットなど)することが可能とのことです。

ところでcloud9上で、もう一つのフォルダを作成しました。こちらでgitを使おうとしたところ、またもやエラー。

The authenticity of host 'github.com (192.30.253.112)' can't be established.
RSA key fingerprint is SHxxxxxxxxxxxxxxxxxxxxxxxxxxx.
RSA key fingerprint is MDxxxxxxxxxxxxxxxxxxxxxxxxxxx.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'github.com,192.30.253.112' (RSA) to the list of known hosts.
Permission denied (publickey).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.

Gitとは、複数人で作業するためのツールです。現在私が計画しているappは、いずれも個人開発のみで、他の人と一緒に作っていくことは想定されていません。

ですが、使いこなせた方が将来的に道が広がりそう。役に立ちそうということで、今週はGItとも戦うことにしました。

今週の目標

  • Gitのエラーを飼いならす(初学者レベルで)

  • 自分で制作しかけているrails のコードを移植して行ってHerokuデプロイを試す

頑張ります。

パソコンを変えたらHeroku デプロイができた話

TOMONIでメンターの方と最初の面談をしていただき様々なアドバイスを頂戴し、将来的な目標、開発コース中2か月間の目標、現状認識、そして1週目の課題設定を明確にしました。

目標について

まず、将来的なゴールはまだ明確ではない旨をお伝えしました。そして現在作りたいものの確認をしました。現在具体的には2つのアイデアがあります。

  • 研究に使う魚の生息調査をする際に役立てるアプリ

  • 論文著者ユニークIDのAPIを使って簡単にデータを出力するアプリ

いずれもデータベースを利用することが予測されますが、クレジットカード情報などを取り扱うわけでもないという意味で、現段階ではそれほどセキュリティ周りを厳しく設定する必要がないのではというところに落ち着きました。

2か月間の目標と現状

魚のアプリを昨年のプログラミング教室の卒業制作として作成したので、そちらをrailsアプリとして制作し、デプロイもする。ことを確認しました。

プログラミング教室ではRubySinatraというシンプルなフレームワークを使って設計し、ローカル環境で動かせるところまで実装しました。

卒業後の目下の目標は、このアプリをRuby Railsで制作しデプロイすることでした。

ProgateでRailsコースを学ぶ一方、Herokuを使ってSinatraアプリのデプロイを何度も試していました。しかしHeroku画面上でApplication Errorが表示されてしまい頓挫。

その後同窓生からRails Tutorial上にHeroku デプロイのやり方が含まれていると聞いて、Sinatraでのデプロイは一旦諦めてRails Tutorialに従って"Hello World"だけでも良いからHeroku デプロイを成功されてみよう、というお話になりました。

1週目の課題

  • 過去に失敗したHerokuデプロイを試すこと

しかしメンターさんとのカウンセリングまでにRails Tutorial1章を進めており、やはりHeroku 画面の繊維でAppliation Errorが出ている状況でした。 というわけで、まずはエラーの内容をブログにまとめる、という課題をいただきました。

その後

大変由々しきことながら、エラー内容をブログにまとめることなく、次へ進んでおります。

なぜかというと、エラー内容をまとめる能力がまだ追い付いていませんでした。

記憶をたどると、このような流れで動きました:

  • Heroku上のApplication Errorに出ていた「ログを確認」する方法で確認したところ、pg周辺で問題が起きている様子。

  • そもそもgit push heroku masterをした時点でfatal errorが3つほど出ていた。

  • 自分なりにエラーメッセージでGoogle検索をしてそれぞれ解決方法を試す(具体的には下記: Teratailのものが多かった)

  • pgがおかしい? pgがない?brewでpgを落とす?brewが動かない!Homebrewも動かない!Sudoで動かす。「こうすればhomebrewが落とせるよ」→複数のファイルを削除

  • Cloud9上で新しい環境を構築して1からTutorialを試すもやはりApplication Errorになる

  • エラーが多すぎて全部を拾えずパニックに

  • 職場で作業をしていたので、職場のWindows PCでCloud9にて新しい環境を構築してRaisl Tutorialの1章をすべて行ったところ、デプロイ成功

  • Mac Bookがおかしい? → Macを初期化

  • Mac BookでRaisl Tutorialの1章をすべて行ったところ、デプロイ成功

そんなはずはないんだけど

Cloud9はローカル環境に縛られず開発環境を作ることができるクラウドなので、Mac Bookの不具合に干渉されるのはおかしい。 というのは頭では理解しています。もちろん、Cloud9上で何度も同じところを失敗して堂々巡りをしていただけなのかもしれません。いや多分こっちなんだろうな。

反省点をふまえて

  • 次回からエラーメッセージがが出たらまずログを取る

  • エラーメッセージを読み解いてみる

  • 別途デバッグ方法を学ぶ

初期化を経て、自分のMacがまっさらの状態になりました。

今後しばらく、開発はCloud9とDockerを利用して進めて行こうかなと考えています。