Vagrantで既存Railsアプリ(+Puppeteer)をgithubからcloneして動かすところまで

始めに

今日まで(amazon買収前の)cloud9を騙し騙し使ってきたけど、ついに2019年末でstopするよ的な警告が出だしたのでローカル環境に載せ替えるテスト。

dockerにしようとしたけど、ある画面を開くとRailsサーバーのローカルにあるpuppeteerからPDFを出力して自動ダウンロードするという飛び道具な機能があり、docker-composeでのpuppeteerのインストールやRackサーバのマルチプロセスでの動作がうまく行かなくて挫折。。

改めてVagrantで実行出来るようにするまでの記録。

開発環境

MacBook Pro (macOS Mojave)
Vagrant 2.1.4
VirtualBox 5.2.18

いざ

ゲストOSはCentOS7、インストールするRubyは2.4.3(既存システムなのでバージョン低し)

vagrant box add centos/7
vagrant init centos/7
vagrant plugin install vagrant-vbguest

Vagrantfileに以下を追記

config.vm.network "forwarded_port", guest: 3000, host: 3000
config.vm.synced_folder ".", "/vagrant",type:"virtualbox"
config.vm.provider "virtualbox" do |vb|
  vb.memory = "2048"
end

vagrant起動

vagrant up
vagrant ssh

ファイアウォールいらないので

[vagrant@localhost ~]$ sudo systemctl stop firewalld

rbenvをインストール

[vagrant@localhost ~]$ sudo yum -y install git
[vagrant@localhost ~]$ sudo yum update -y nss curl libcurl
[vagrant@localhost ~]$ git clone https://github.com/rbenv/rbenv.git ~/.rbenv
[vagrant@localhost ~]$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

[vagrant@localhost ~]$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
[vagrant@localhost ~]$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile

[vagrant@localhost ~]$ source ~/.bash_profile

#確認
[vagrant@localhost ~]$ rbenv --version

rubyをインストール

#多分いろいろ入っていないので
[vagrant@localhost ~]$ sudo yum -y install bzip2 gcc openssl-devel readline-devel zlib-devel gcc-c++

#いよいよ
[vagrant@localhost ~]$ rbenv install 2.4.3

DBはmysqlを使っているのでインストール

[vagrant@localhost ~]$ yum remove mariadb-libs -y
[vagrant@localhost ~]$ rm -rf /var/lib/mysql
[vagrant@localhost ~]$ sudo yum -y localinstall https://dev.mysql.com/get/mysql80-community-release-el7-2.noarch.rpm
[vagrant@localhost ~]$ sudo yum -y install mysql-community-server

#起動&自動起動設定
[vagrant@localhost ckhs]$ sudo systemctl start mysqld.service
[vagrant@localhost ckhs]$ sudo systemctl enable mysqld.service

#rootの初期パスワードの確認
[vagrant@localhost ~]$ cat /var/log/mysqld.log | grep 'temporary password'
#root@localhost: のあとに出て来るのが初期パスワード

#rootパスワード変更&セキュリティ設定
mysql_secure_installation

#mysql 8.0で、パスワードを空に設定する
#8.0だとvalidationコンポーネントが動いていてパスワードを空に出来ない。
#開発環境だし空でも問題ないので、コンポーネントを無効化して空にする。
[vagrant@localhost ~]$ mysql -u root -p
# 変更したパスワードで入る

mysql> UNINSTALL COMPONENT 'file://component_validate_password';
mysql> set password for root@localhost = '';
mysql> quit

#パス無しで入れるか確認
[vagrant@localhost ~]$ mysql -u root
mysql> quit

ソースコードをgitからclone

#/vagrant が共有フォルダになっているので、 ~/workspace にシンボリックリンクを作成
[vagrant@localhost ~]$ ln -s /vagrant ~/workspace
[vagrant@localhost ~]$ cd workspace

#ssh-keygenやgit configなど、いつものやつをやってから
[vagrant@localhost ~]$ git clone ssh://git@リポジトリ
[vagrant@localhost ~]$ cd リポジトリ名のディレクトリ

bundle install

[vagrant@localhost リポジトリ]$ gem install bundler
#mysql使うので
[vagrant@localhost リポジトリ]$ sudo yum -y install mysql-devel
[vagrant@localhost リポジトリ]$ bundle install

node + puppeteerのインストール(package.jsonより)

#今回はnode8を入れたいので
[vagrant@localhost ckhs]$ curl --silent --location https://rpm.nodesource.com/setup_8.x | sudo bash -
[vagrant@localhost リポジトリ]$ sudo yum install -y nodejs
[vagrant@localhost リポジトリ]$ npm install

rails 起動

#DB・テーブル・初期データ作成
[vagrant@localhost リポジトリ]$ bin/rails db:create
[vagrant@localhost リポジトリ]$ bin/rails db:migrate
[vagrant@localhost リポジトリ]$ bin/rails db:seed

#起動
[vagrant@localhost リポジトリ]$ bin/rails s -b 0.0.0.0

起動できた!!

ホストマシンからブラウザでlocalhost:3000にアクセスすると表示できますした。

が、PDFダウンロード画面に行くとこんなのが出てpuppeteerが動かない問題発生

(node:4572) UnhandledPromiseRejectionWarning: Error: Failed to launch chrome! /vagrant/ckhs/node_modules/puppeteer/.local-chromium/linux-650583/chrome-linux/chrome: error while loading shared libraries: libX11.so.6: cannot open shared object file: No such file or directory

まぁ、見たまんま libX11.so.6 が読めないということで

sudo yum install -y libX11

で解決か!?

(node:4701) UnhandledPromiseRejectionWarning: Error: Failed to launch chrome! /vagrant/ckhs/node_modules/puppeteer/.local-chromium/linux-650583/chrome-linux/chrome: error while loading shared libraries: libXcomposite.so.1: cannot open shared object file: No such file or directory

同じような問題が発生

この後調査の結果、依存ライブラリをまとめて入れろとのこと

sudo yum -y install libX11 libXcomposite libXcursor libXdamage libXext libXi libXtst cups-libs libXScrnSaver libXrandr alsa-lib pango atk at-spi2-atk gtk3

動いた!!!!

終わりに

この記事書く前に、一度CentOS6で環境構築して、ほぼ最後まで行ってからpuppeteerがCentOS6で動かないことに気づいて凹んだ。。

同じ状況のどなたかにお役に立てれば幸いです。

この記事が気に入ったらサポートをしてみませんか?