elecoma(エレコマ)をherokuで動かす


エレコマはrails製のネットショップのシステムで、オープンソースで公開されています。今回の目的はこのエレコマを使ってherokuにアップすることです。


##ローカル環境に構築

1.https://github.com/elecoma/elecoma からソースをダウンロードし、任意のフォルダへ展開

2.デフォルトではpostgresqlかmysqlを使うようになっているが、手軽にするため、sqlite3を使う様に修正

```Gemfile
# コメントアウトしsqlite3を指定
# gem "pg", :group => :postgresql
# gem "activerecord-mysql2-adapter", :group => :mysql

gem 'sqlite3'
 
```

3.configフォルダ配下にpostgres, mysql, sqlite用のdatabase.ymlが置かれている。
これもsqlite用のファイル名をdataabse.ymlにリネームする。

4.アプリケーションルートで bundle install

``` 
$ bundle install
```

5.データベースを作成

```
$ rake db:migrate
```

6.Webサーバーを起動して、localhost:3000へアクセスするとトップページが表示されことを確認。

``` 
$ script/server
```



7.$RAILS_ROOT/test/fixtures/admin_users.ymlを修正し管理者ユーザのを登録

``` $RAILS_ROOT/test/fixtures/admin_users.yml
$ rake db:fixtures:load FIXTURES=admin_users

# 本番DBへの反映は、「RAILS_ENV=production」オプションを追加
```

8.http://localhost:3000/admin 管理者ログイン画面で上記で指定したユーザ名・パスワードでログインできることを確認する。



##herokuにアップ

※ heroku、gitのインストール等は終わっている前提で進めます。

### Gemfileの修正
1.そのままだとheroku上でruby2.0の環境でデプロイされ、iconvが無い等のエラーがになるので、Gemfileで実行するバージョンを指定

``` Gemfile
source 'https://rubygems.org'
source 'http://gems.github.com'
ruby "1.9.3" # ←これを追加
```

2.heroku上ではpostgresqlを使うので、以下のように修正

``` Gemfile
# gem "pg", :group => :postgresql
# gem "activerecord-mysql2-adapter", :group => :mysql
# gem 'sqlite3'

group :production do
  gem "pg"
end

group :development, :test do
  gem "sqlite3"
end
```

4.Gemfile.lockを更新するためにbundle install

``` 
$ bundle install
```


### その他の修正
1.heroku上でrakeを実行したとき、「taskがありません」といってエラーになるので、以下のファイルをコメントアウト

``` lib/tasks/rspec.rake
# gem 'test-unit', '1.2.3' if RUBY_VERSION.to_f >= 1.9
# rspec_plugin_dir = File.expand_path(File.dirname(__FILE__) + '/../../vendor/plugins/rspec')
# $LOAD_PATH.unshift("#{rspec_plugin_dir}/lib") if File.exist?(rspec_plugin_dir)
# 
# # Don't load rspec if running "rake gems:*"
# unless ARGV.any? {|a| a =~ /^gems/}
# 
# begin
#   require 'spec/rake/spectask'
# rescue MissingSourceFile
#   module Spec
#     module Rake
・
・
・
# 
#     desc "restart spec_server."
#     task :restart => [:stop, :start]
#     
#     desc "check if spec server is running"
#     task :status do
#       if File.exist?(daemonized_server_pid)
#         $stderr.puts %Q{spec_server is running (PID: #{File.read(daemonized_server_pid).gsub("\n","")})}
#       else
#         $stderr.puts "No server running."
#       end
#     end
#   end
# end
# 
# end
```

### herokuへのアップ

4.git管理の設定

```
$ git init
$ git add .
$ git commit -m "start project"
```

5.herokuのプロジェクトを作成

```
$ heroku create
```

6.プロジェクトをherokuへデプロイ

```
$ git push heroku master
```

7.heroku上でマイグレーションを実行してテーブルを作る。


```
$ heroku run rake db:migrate
```



##!!しかしここでエラーになる。
エラーメッセージは以下のようにlogのディレクトリが見つからないとのこと

```
No such file or directory - /app/log/production.log
```


以下のコマンドでheroku上に/app/logディレクトリがあるか確認

```
$ heroku run ls /app
app  bin  ChangeLog  config  COPYRIGHT	db  Gemfile  Gemfile.lock  god	lib  public  Rakefile  README.md  script  spec	stories  test  tmp  var  vendor

```

確かにない。

.gitignoreでlogをバージョン管理しないようになっているのが理由かと思いその制限を外して再度commit, pushしたが結果は変わらず。。。

```
heroku run mkdir /app/log
```
と、heroku上で直接フォルダを作ろうとしても作成されない。

ログの吐き出しを指定している以下のファイルを修正して、logの出力先をtempフォルダに変更

``` config/environments/production.rb
#config.logger = Logger.new("#{RAILS_ROOT}/log/#{RAILS_ENV}.log", 'daily')

config.logger = Logger.new("#{RAILS_ROOT}/tmp/#{RAILS_ENV}.log", 'daily')

```


これで以下のコマンドでherokuにデプロイ

```
$ git add .
$ git commit -m "xxx"
$ git push heroku master
```

そして再度マイグレーションを実行

```
$ heroku run rake db:migrate
```

これでなんとかマイグレーションが通り、テーブルが作成された！

満を持して

```
$ heroku open
```

として画面をみたが、、、ブラウザに出た表示は「Application Error」。


heroku logsでログをみると

```
2014-10-01T09:26:18.510898+00:00 app[web.1]: /app/vendor/bundle/ruby/1.9.1/gems/rails-2.3.18/lib/rails/rack/log_tailer.rb:10:in `size': No such file or directory - /app/log/production.log (Errno::ENOENT)
2014-10-01T09:26:18.510904+00:00 app[web.1]: 	from /app/vendor/bundle/ruby/1.9.1/gems/rails-2.3.18/lib/rails/rack/log_tailer.rb:10:in `initialize'
2014-10-01T09:26:18.510907+00:00 app[web.1]: 	from /app/vendor/bundle/ruby/1.9.1/gems/rack-1.1.6/lib/rack/builder.rb:54:in `new'
2014-10-01T09:26:18.510908+00:00 app[web.1]: 	from /app/vendor/bundle/ruby/1.9.1/gems/rack-1.1.6/lib/rack/builder.rb:54:in `block in use'
2014-10-01T09:26:18.510913+00:00 app[web.1]: 	from /app/vendor/bundle/ruby/1.9.1/gems/rack-1.1.6/lib/rack/builder.rb:73:in `each'
2014-10-01T09:26:18.510911+00:00 app[web.1]: 	from /app/vendor/bundle/ruby/1.9.1/gems/rack-1.1.6/lib/rack/builder.rb:73:in `block in to_app'
2014-10-01T09:26:18.510915+00:00 app[web.1]: 	from /app/vendor/bundle/ruby/1.9.1/gems/rack-1.1.6/lib/rack/builder.rb:73:in `inject'
2014-10-01T09:26:18.510916+00:00 app[web.1]: 	from /app/vendor/bundle/ruby/1.9.1/gems/rack-1.1.6/lib/rack/builder.rb:73:in `to_app'
2014-10-01T09:26:18.510920+00:00 app[web.1]: 	from script/server:3:in `require'
2014-10-01T09:26:18.510918+00:00 app[web.1]: 	from /app/vendor/bundle/ruby/1.9.1/gems/rails-2.3.18/lib/commands/server.rb:95:in `<top (required)>'
2014-10-01T09:26:18.510910+00:00 app[web.1]: 	from /app/vendor/bundle/ruby/1.9.1/gems/rack-1.1.6/lib/rack/builder.rb:73:in `call'
2014-10-01T09:26:18.510923+00:00 app[web.1]: 	from script/server:3:in `<main>'
2014-10-01T09:26:18.542751+00:00 app[web.1]: => Rails 2.3.18 application starting on http://0.0.0.0:48853
2014-10-01T09:26:18.542744+00:00 app[web.1]: => Booting WEBrick
2014-10-01T09:26:19.209364+00:00 heroku[web.1]: Process exited with status 1
2014-10-01T09:26:19.220801+00:00 heroku[web.1]: State changed from starting to crashed
2014-10-01T09:26:20.630701+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/" host=step-elecoma.herokuapp.com request_id=825e3cb2-38d6-4ecf-8b31-db82441845bc fwd="126.12.232.102" dyno= connect= service= status=503 bytes=
```



最終的に不明なエラーで、tempフォルダに出力先を変更したファイルは残っておらず、、、（元々出力されていない？）

怪しいといえば上記のログの１行目の

```
/bundle/ruby/1.9.1/gems/rails-2.3.18/lib/rails/rack/log_tailer.rb:10:in `size': No such file or directory - /app/log/production.log (Errno::ENOENT)`
```

しかし/app/logに関してはやはりうまく作れず・・・・

といった状況でお手上げ中です・・・





追記
ここに似たような情報がありましたが、解決にはいたらず・・
https://github.com/ddollar/rails_log_stdout/issues/4




##追記：できました！(2014/10/20)

webサーバーを「thin」を使うようにすることで無事起動ができました！

####thinサーバーのインストール

1.Gemfileにthinを追加

```Gemfile
gem 'thin'
```

2.bundle install

```
$ bundle install
```

####Procfileの作成
次にheroku上でthinを使用するためにProcfileを作成します。
Procfileとは本番環境のherokuに使用するwebサーバーなどを伝える設定ファイルのようなものです。
これはアプリケーションルートに配置します。

1.viエディタなどでアプリケーションのルートフォルダに"Procfile"という名前で空のファイルを作成

2.その中にthinをwebサーバとして使用する指示を記述

```Procfile
web: bundle exec thin start -e $RAILS_ENV -p $PORT
```

####herokuへアップロード

```
$ git add .
$ git commit -m "comment"
$ git push heroku master
$ heroku open
```

これでheroku上elecomaのWebページを開くことができました！