さくらのVPSプラン乗り換え計画(3)

Ruby と Git をインストール。
まず Ruby。

takatoh@tk2-254-36564:~$ sudo apt install ruby ruby-dev
takatoh@tk2-254-36564:~$ ruby -v
ruby 2.3.1p112 (2016-04-26) [x86_64-linux-gnu]

bundler が入っていないのでインストール。

takatoh@tk2-254-36564:~$ sudo gem install bundler

つぎは Git。

takatoh@tk2-254-36564:~$ sudo apt install git
takatoh@tk2-254-36564:~$ git --version
git version 2.7.4

さくらのVPSプラン乗り換え計画(1)

タイトルの通り、プランの乗り換えにチャレンジ。

VPS の OS は標準の CentOS じゃなくて、使い慣れた Ubuntu にしたかったので、OS の再インストールをした。ところが、用意されている「標準OS」の Ubuntu 16.04 をインストールしてみたけど、ログインができない。パスワードを間違えたのかと思って何度かやり直し(インストール自体のやり直しも含めて)やってみたけどダメ。CentOS6 をインストールすると何故か大丈夫。なんでだ?
仕方がないので「カスタムOS」の Ubuntu 16.04 をインストールしたら(インストールに時間はかかったけど)無事、ログインに成功した。ユーザー名は takatoh。

VPS のページから、コンソールを選んでサーバに接続する。
まずは ssh の設定。/etc/ssh/sshd_config ファイルを編集する。

$ sudo vi /etc/ssh/sshd_config

ポートを変更。

Port 60000

root でのログインを禁止。

PermitRootLogin no

設定を反映するために sshd を再起動。

$ sudo systemctl restart sshd

次にファイアウォールの設定。

$ sudo ufw enable
$ sudo ufw default DENY
$ sudo ufw allow 60000

これで、ローカルの PC から ssh でアクセスできるようになったはず。試してみよう。

takatoh@envelopes $ ssh -p 60000 [email protected]
[email protected]'s password: 
Welcome to Ubuntu 16.04.2 LTS (GNU/Linux 4.4.0-77-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage
Last login: Thu May  4 10:48:04 2017
takatoh@tk2-254-36564:~$

OK。
それじゃこんどはパスワード認証をやめて、公開鍵での認証に切り替える。

takatoh@tk2-254-36564:~$ pwd
/home/takatoh
takatoh@tk2-254-36564:~$ mkdir .ssh
takatoh@tk2-254-36564:~$ chmod 700 .ssh
takatoh@tk2-254-36564:~$ cd .ssh
takatoh@tk2-254-36564:~/.ssh$ wget -O authorized_keys https://github.com/takatoh.keys
--2017-05-04 11:08:43--  https://github.com/takatoh.keys
Resolving github.com (github.com)... 192.30.255.113, 192.30.255.112
Connecting to github.com (github.com)|192.30.255.113|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/plain]
Saving to: 'authorized_keys'

authorized_keys         [ <=>                ]     381  --.-KB/s    in 0.001s  

2017-05-04 11:08:43 (309 KB/s) - 'authorized_keys' saved [381]

takatoh@tk2-254-36564:~/.ssh$ ls -al
total 12
drwx------ 2 takatoh takatoh 4096 May  4 11:08 .
drwxr-xr-x 4 takatoh takatoh 4096 May  4 11:08 ..
-rw-rw-r-- 1 takatoh takatoh  381 May  4 11:08 authorized_keys
takatoh@tk2-254-36564:~/.ssh$ chmod 600 authorized_keys
takatoh@tk2-254-36564:~/.ssh$ ls -al
total 12
drwx------ 2 takatoh takatoh 4096 May  4 11:08 .
drwxr-xr-x 4 takatoh takatoh 4096 May  4 11:08 ..
-rw------- 1 takatoh takatoh  381 May  4 11:08 authorized_keys

ここでいったんログアウトして、鍵認証でログインできるか試してみる。

takatoh@envelopes $ ssh -p 60000 [email protected]
Welcome to Ubuntu 16.04.2 LTS (GNU/Linux 4.4.0-77-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage
Last login: Thu May  4 11:05:11 2017 from 58.1.225.90

OK。それじゃもう一度 /etc/ssh/sshd_config を編集して、パスワード認証をしないことにする。

PasswordAuthentication no

sshd の再起動。

takatoh@tk2-254-36564:~$ sudo systemctl restart sshd

とりあえずここまで。

結局PCを買い換えた

先週の金曜日に起動しなくなってしまったメインマシン(apostrophe)、土曜日に DELL のサポートに電話してやり取りした結果、DELL に送って修理が必要ということになった。で、どのくらいかかるのかときいたら、期間にして2週間、費用にして3〜4万円(サポート期間が過ぎているので有償)という回答だった。
少し考えたけど、そんなにかかるなら買ってしまったほうがいい。DELL の即納モデルなら1週間もすれば届くだろうし、ちょうど春の割引キャンペーンをやっているので本体だけなら4万円をちょっと超えるくらいだ。
というわけで、一昨日届いた。昨日は時間がなかったので、今日セットアップ。プリインストールの Windows 10 のリカバリメディア(何故か USB フラッシュメモリしか選べないので急いで買ってきた)を作っておいて、Windows はさっくり削除して Ubuntu 16.04 LTS をインストールした。とりあえずは最低限のセットアップが終わったところ。あとは時間を見て環境を整えていこう。
あ、ホスト名は envelopes にした。
それにしても出費が続くなぁ。

メインマシン(Ubuntu)が起動しなくなった

今朝のこと。Ubuntu 16.04 のメインマシン(apostrophe)を見るとソフトウェアのアップデートが表示されていたので、アップデートした。すると、アップデートを完了するにはマシンの再起動が必要だというので、再起動したところ、起動しなくなってしまった。DELL のロゴマークが表示された状態で止まっていて、それっきり動きがない。
ともかく朝で時間がないので、そのまま様子を見ることにして(つまりほうっておいて)出かけたわけだ。
で、今帰ってきてみたら今朝と同じ状態のまま。マシンの電源を切ったり入れたりしてみるも変化がない。どういうわけだ。明日明後日と用事があってまとまった時間が取れそうにないんだけど、最悪再インストールかも。どうしたもんかね。

[追記]

Ubuntu のインストールディスクを入れて起動してみたけどダメだった。というか、DELL のロゴマークが表示されている状態で止まってるってここは、OS 以前の BIOS の途中で止まってるってことじゃなかろうか。こりゃダメかな。

Railsアプリの引っ越し(4)デーモンとして動かす編

起動スクリプトを、これも apostrophe からコピー。

tonzlr@wplj:/etc/init.d$ cd
tonzlr@wplj:~$ cd /etc/init.d
tonzlr@wplj:/etc/init.d$ sudo scp tonzlr@apostrophe:/etc/init.d/tonzlr .
sudo tonzlr のパスワード: 
tonzlr@apostrophe's password: 
tonzlr                                        100%  455     0.4KB/s   00:00

これも変更しないでいいんじゃないかな。

#!/bin/bash

PATH=/usr/local/bin:/usr/bin:/bin:/sbin:PATH
TONZLR_ROOT=/home/tonzlr/tonzlr

case "$1" in
start)
echo "Starting Tonzlr"
cd ${TONZLR_ROOT}
export SECRET_KEY_BASE=`rake secret`
bundle exec unicorn_rails -c unicorn.conf -E production -D
;;
stop)
echo "Stoping Tonzlr"
PID=`cat ${TONZLR_ROOT}/unicorn.pid`
kill -QUIT ${PID}
;;
*)
echo "Usage: tonzlr {start|stop}" >&2
exit 1
;;
esac

exit 0

起動確認。

tonzlr@wplj:~/tonzlr$ sudo /etc/init.d/tonzlr start
Starting Tonzlr

OK。

Unit ファイルを書く。

[Unit]
Description=Tonzlr service
After=network.target

[Service]
ExecStart=/etc/init.d/tonzlr start
ExecStop=/etc/init.d/tonzlr stop
Restart=always
Type=forking
PIDFile=/home/tonzlr/tonzlr/unicorn.pid

[Install]
WantedBy=multi-user.target

そして、/etc/systemd/system/tonzlr.service にリンクを張る。

tonzlr@wplj:~/tonzlr$ sudo ln -s /lib/systemd/system/tonzlr.service /etc/systemd/system/tonzlr.service

起動確認。

tonzlr@wplj:~/tonzlr$ sudo systemctl start tonzlr

OK。start したり stop したりして確認できた。

Ubuntu の起動時に自動起動するようにする。

tonzlr@wplj:~/tonzlr$ sudo systemctl enable tonzlr
Synchronizing state of tonzlr.service with SysV init with /lib/systemd/systemd-sysv-install...
Executing /lib/systemd/systemd-sysv-install enable tonzlr
insserv: warning: script 'K01bruschetta' missing LSB tags and overrides
insserv: warning: script 'tonzlr' missing LSB tags and overrides
insserv: warning: script 'bruschetta' missing LSB tags and overrides
update-rc.d: error: tonzlr Default-Start contains no runlevels, aborting.

むぅ、またエラーが出てる。だけど、この間の Flask アプリではこれでもちゃんと自動起動できるようになっていたので、今回もそれを期待してリブートしてみる。

tonzlr@wplj:~/tonzlr$ sudo reboot

……はたしてリブートした結果……おお、ちゃんと自動起動されている!

よし、最後に、Nginx のヴァーチャルホスト tonzlr を設定する。

upstream unicorn-tonzlr {
    server 127.0.0.1:9009;
}

server {
    # port
    listen 80;

    # server name
    server_name tonzlr;

    # document root
    root /home/tonzlr/tonzlr;

    # index
    #index index.php index.html index.htm;

    # log files
    access_log /var/log/nginx/tonzlr/access.log combined;
    error_log /var/log/nginx/tonzlr/error.log warn;

    keepalive_timeout 60;
    proxy_connect_timeout 60;
    proxy_read_timeout 60;
    proxy_send_timeout 60;

    location / {
        #root /home/tonzlr/tonzlr;

        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_pass http://unicorn-tonzlr;
    }

}

sites-enabled/tonzlr にリンクを張って:

tonzlr@wplj:/etc/nginx$ sudo ln -s /etc/nginx/sites-available/tonzlr /etc/nginx/sites-enabled/tonzlr

ログファイル用のディレクトリを作る。

tonzlr@wplj:/etc/nginx$ sudo mkdir /var/log/nginx/tonzlr

Nginx をリロード。

tonzlr@wplj:/etc/nginx$ sudo systemctl reload nginx

hosts ファイルに tonzlr を追加して、http://tonzlr/ にブラウザでアクセスしてみる。

OK!!!!!!!!!
あとは、他のマシンの hosts ファイルを書き換えるだけだ。

Railsアプリの引っ越し(3)Unicornで動かす編

Unicorn のインストール。

tonzlr@wplj:~/tonzlr$ sudo apt install unicorn
[sudo] tonzlr のパスワード: 
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
以下のパッケージが自動でインストールされましたが、もう必要とされていません:
  libpango1.0-0 libpangox-1.0-0 ubuntu-core-launcher
これを削除するには 'sudo apt autoremove' を利用してください。
以下の追加パッケージがインストールされます:
  ruby-kgio ruby-rack ruby-raindrops
以下のパッケージが新たにインストールされます:
  ruby-kgio ruby-rack ruby-raindrops unicorn
アップグレード: 0 個、新規インストール: 4 個、削除: 0 個、保留: 8 個。
269 kB のアーカイブを取得する必要があります。
この操作後に追加で 898 kB のディスク容量が消費されます。
続行しますか? [Y/n] Y
取得:1 http://jp.archive.ubuntu.com/ubuntu xenial/universe amd64 ruby-kgio amd64 2.10.0-1build1 [27.7 kB]
取得:2 http://jp.archive.ubuntu.com/ubuntu xenial/universe amd64 ruby-rack all 1.6.4-3 [81.3 kB]
取得:3 http://jp.archive.ubuntu.com/ubuntu xenial/universe amd64 ruby-raindrops amd64 0.16.0-1build1 [33.0 kB]
取得:4 http://jp.archive.ubuntu.com/ubuntu xenial/universe amd64 unicorn amd64 4.9.0-2build2 [127 kB]
269 kB を 0秒 で取得しました (1,720 kB/s)
以前に未選択のパッケージ ruby-kgio を選択しています。
(データベースを読み込んでいます ... 現在 216599 個のファイルとディレクトリがインストールされています。)
.../ruby-kgio_2.10.0-1build1_amd64.deb を展開する準備をしています ...
ruby-kgio (2.10.0-1build1) を展開しています...
以前に未選択のパッケージ ruby-rack を選択しています。
.../ruby-rack_1.6.4-3_all.deb を展開する準備をしています ...
ruby-rack (1.6.4-3) を展開しています...
以前に未選択のパッケージ ruby-raindrops を選択しています。
.../ruby-raindrops_0.16.0-1build1_amd64.deb を展開する準備をしています ...
ruby-raindrops (0.16.0-1build1) を展開しています...
以前に未選択のパッケージ unicorn を選択しています。
.../unicorn_4.9.0-2build2_amd64.deb を展開する準備をしています ...
unicorn (4.9.0-2build2) を展開しています...
man-db (2.7.5-1) のトリガを処理しています ...
systemd (229-4ubuntu16) のトリガを処理しています ...
ureadahead (0.100.0-19) のトリガを処理しています ...
ureadahead will be reprofiled on next reboot
ruby-kgio (2.10.0-1build1) を設定しています ...
ruby-rack (1.6.4-3) を設定しています ...
ruby-raindrops (0.16.0-1build1) を設定しています ...
unicorn (4.9.0-2build2) を設定しています ...
insserv: warning: script 'K01bruschetta' missing LSB tags and overrides
insserv: warning: script 'bruschetta' missing LSB tags and overrides
insserv: warning: script 'K01bruschetta' missing LSB tags and overrides
insserv: warning: current start runlevel(s) (empty) of script `unicorn' overrides LSB defaults (2 3 4 5).
insserv: warning: current stop runlevel(s) (0 1 2 3 4 5 6) of script `unicorn' overrides LSB defaults (0 1 6).
insserv: warning: script 'bruschetta' missing LSB tags and overrides
systemd (229-4ubuntu16) のトリガを処理しています ...
ureadahead (0.100.0-19) のトリガを処理しています ...

apostrophe から設定ファイル unicorn.conf をコピー。

tonzlr@wplj:~/tonzlr$ scp tonzlr@apostrophe:tonzlr/unicorn.conf .
tonzlr@apostrophe's password: 
unicorn.conf                                  100%  166     0.2KB/s   00:00

たぶん、変更しないでいいはず。

tonzlr@wplj:~/tonzlr$ cat unicorn.conf
listen "9009"
worker_processes 1
working_directory "/home/tonzlr/tonzlr"
pid "./unicorn.pid"
stdout_path "./unicorn.log"
stderr_path "./unicorn.log"
preload_app true
tonzlr@wplj:~/tonzlr$ bundle exec unicorn_rails -c unicorn.conf -E production

OK。ブラウザで http://localhost:9009/ にアクセスして確認できた。

Railsアプリの引っ越し(2)とりあえず動いた編

前回のエントリのあとごちょごちょやってたらとりあえず動くようになったので、書いておく。
まず、依存しているらしいパッケージを apt install でインストール。

  • libgmp3-dev
  • libsqlite3-dev

専用ユーザの作りなおし。

takatoh@wplj $ sudo adduser tonzlr
takatoh@wplj $ sudo gpasswd -a tonzlr sudo

作ったユーザでログインして、GitHub からクローン。

tonzlr@wplj:~$ git clone https://github.com/takatoh/Tonzlr.git tonzlr

bundle install

tonzlr@wplj:~$ cd tonzlr
tonzlr@wplj:~/tonzlr$ bundle install --path vendor/bundle
Fetching gem metadata from https://rubygems.org/..........
Fetching version metadata from https://rubygems.org/..
Fetching dependency metadata from https://rubygems.org/.
Installing rake 10.4.2
Installing i18n 0.7.0
Installing json 1.8.1 with native extensions
Installing minitest 5.5.0
Installing thread_safe 0.3.4
Installing builder 3.2.2
Installing erubis 2.7.0
Installing rack 1.5.2
Installing mime-types 1.25.1
Installing polyglot 0.3.5
Installing arel 5.0.1.20140414130214
Installing coffee-script-source 1.8.0
Installing execjs 2.2.2
Installing thor 0.19.1
Installing hike 1.2.3
Installing multi_json 1.10.1
Installing libv8 3.16.14.3 (x86_64-linux)
Using bundler 1.14.6
Installing tilt 1.4.1
Installing ref 1.0.5
Installing sass 3.2.19
Installing spring 1.2.0
Installing sqlite3 1.3.10 with native extensions
Installing will_paginate 3.0.7
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

current directory:
/home/tonzlr/tonzlr/vendor/bundle/ruby/2.3.0/gems/json-1.8.1/ext/json/ext/generator
/usr/bin/ruby2.3 -r ./siteconf20170304-6634-1swo6wh.rb extconf.rb
creating Makefile

current directory:
/home/tonzlr/tonzlr/vendor/bundle/ruby/2.3.0/gems/json-1.8.1/ext/json/ext/generator
make "DESTDIR=" clean

current directory:
/home/tonzlr/tonzlr/vendor/bundle/ruby/2.3.0/gems/json-1.8.1/ext/json/ext/generator
make "DESTDIR="
compiling generator.c
In file included from generator.c:1:0:
../fbuffer/fbuffer.h: In function ‘fbuffer_to_s’:
../fbuffer/fbuffer.h:175:47: error: macro "rb_str_new" requires 2 arguments, but
only 1 given
     VALUE result = rb_str_new(FBUFFER_PAIR(fb));
                                               ^
../fbuffer/fbuffer.h:175:20: warning: initialization makes integer from pointer
without a cast [-Wint-conversion]
     VALUE result = rb_str_new(FBUFFER_PAIR(fb));
                    ^
Makefile:239: ターゲット 'generator.o' のレシピで失敗しました
make: *** [generator.o] エラー 1

make failed, exit code 2

Gem files will remain installed in
/home/tonzlr/tonzlr/vendor/bundle/ruby/2.3.0/gems/json-1.8.1 for inspection.
Results logged to
/home/tonzlr/tonzlr/vendor/bundle/ruby/2.3.0/extensions/x86_64-linux/2.3.0/json-1.8.1/gem_make.out

An error occurred while installing json (1.8.1), and Bundler cannot
continue.
Make sure that `gem install json -v '1.8.1'` succeeds before bundling.

やっぱりエラーになったけど、めげずに bundle update

tonzlr@wplj:~/tonzlr$ bundle update
Fetching gem metadata from https://rubygems.org/..........
Fetching version metadata from https://rubygems.org/..
Fetching dependency metadata from https://rubygems.org/.
Resolving dependencies...
Installing rake 12.0.0 (was 10.4.2)
Installing i18n 0.8.1 (was 0.7.0)
Installing json 1.8.6 (was 1.8.1) with native extensions
Installing minitest 5.10.1 (was 5.5.0)
Installing thread_safe 0.3.6 (was 0.3.4)
Installing builder 3.2.3 (was 3.2.2)
Using erubis 2.7.0
Installing rack 1.5.5 (was 1.5.2)
Using mime-types 1.25.1
Using polyglot 0.3.5
Using arel 5.0.1.20140414130214
Using bundler 1.14.6
Installing coffee-script-source 1.12.2 (was 1.8.0)
Installing execjs 2.7.0 (was 2.2.2)
Installing thor 0.19.4 (was 0.19.1)
Using hike 1.2.3
Installing multi_json 1.12.1 (was 1.10.1)
Installing libv8 3.16.14.17 (x86_64-linux) (was 3.16.14.3)
Using tilt 1.4.1
Installing rdoc 4.3.0 (was 4.2.0)
Installing ref 2.0.0 (was 1.0.5)
Using sass 3.2.19
Installing spring 1.7.2 (was 1.2.0)
Installing sqlite3 1.3.13 (was 1.3.10) with native extensions
Installing turbolinks-source 5.0.0
Installing will_paginate 3.1.5 (was 3.0.7)
Installing tzinfo 1.2.2
Installing rack-test 0.6.3 (was 0.6.2)
Installing treetop 1.4.15
Installing coffee-script 2.4.1 (was 2.3.0)
Installing uglifier 3.1.3 (was 2.6.0)
Installing sprockets 2.12.4 (was 2.12.3)
Installing sdoc 0.4.2 (was 0.4.1)
Installing therubyracer 0.12.3 (was 0.12.1) with native extensions
Installing turbolinks 5.0.1 (was 2.5.3)
Installing activesupport 4.1.4
Installing mail 2.5.4
Installing actionview 4.1.4
Installing activemodel 4.1.4
Installing jbuilder 2.6.3 (was 2.2.6)
Installing actionpack 4.1.4
Installing activerecord 4.1.4
Installing actionmailer 4.1.4
Installing railties 4.1.4
Installing sprockets-rails 2.3.3 (was 2.2.2)
Installing coffee-rails 4.0.1
Installing jquery-rails 3.1.4 (was 3.1.2)
Installing rails 4.1.4
Installing sass-rails 4.0.5
Bundle updated!

今度は成功。

設定ファイルの編集。

tonzlr@wplj:~/tonzlr$ cd config
tonzlr@wplj:~/tonzlr/config$ cp site_config.yml.example site_config.yml
tonzlr@wplj:~/tonzlr/config$ vi site_config.yml
---
development:
  storage_dir: ./storage-devel
test:
  storage_dir: ./storage-test
production:
  storage_dir: /media/aysheaia/wallpapers

データベースのマイグレーション。

tonzlr@wplj:~/tonzlr$ rake db:migrate RAILS_ENV=production
== 20141229035713 CreateWallpapers: migrating =================================
-- create_table(:wallpapers)
   -> 0.0021s
== 20141229035713 CreateWallpapers: migrated (0.0023s) ========================

== 20141229040752 CreateImages: migrating =====================================
-- create_table(:images)
   -> 0.0009s
== 20141229040752 CreateImages: migrated (0.0010s) ============================

== 20141230093231 AddImagesCountToWallpapers: migrating =======================
-- add_column(:wallpapers, :images_count, :integer, {:default=>0})
   -> 0.0038s
== 20141230093231 AddImagesCountToWallpapers: migrated (0.0039s) ==============

== 20141230233607 CreateTags: migrating =======================================
-- create_table(:tags)
   -> 0.0010s
== 20141230233607 CreateTags: migrated (0.0011s) ==============================

== 20141230234524 CreateTaggings: migrating ===================================
-- create_table(:taggings)
   -> 0.0010s
-- add_index(:taggings, :tag_id)
   -> 0.0007s
-- add_index(:taggings, [:taggable_id, :taggable_type])
   -> 0.0012s
== 20141230234524 CreateTaggings: migrated (0.0031s) ==========================

== 20141231051856 CreatePools: migrating ======================================
-- create_table(:pools)
   -> 0.0011s
== 20141231051856 CreatePools: migrated (0.0012s) =============================

== 20141231052318 CreatePoolings: migrating ===================================
-- create_table(:poolings)
   -> 0.0009s
== 20141231052318 CreatePoolings: migrated (0.0010s) ==========================

apostrophe からデータベースを持ってきて上書き。

tonzlr@wplj:~/tonzlr$ cd db
tonzlr@wplj:~/tonzlr/db$ scp tonzlr@apostrophe:tonzlr/db/production.sqlite3 .
tonzlr@apostrophe's password: 
production.sqlite3                            100% 6721KB   6.6MB/s   00:00
tonzlr@wplj:~/tonzlr/db$ cd ..

assets のプリコンパイル。

tonzlr@wplj:~/tonzlr$ rake assets:precompile
I, [2017-03-04T14:51:43.129624 #7460]  INFO -- : Writing /home/tonzlr/tonzlr/public/assets/application-542d4bf5c7f8bc802982fa7761156fb8.js
I, [2017-03-04T14:51:43.184646 #7460]  INFO -- : Writing /home/tonzlr/tonzlr/public/assets/application-9084123bb8f8533cdd8e6f85fc1b536c.css

Rails 自身で配信するように、config/environments/production.rb を編集。

# Disable Rails's static asset server (Apache or nginx will already do this).
config.serve_static_assets = true

そして起動。SECRET_KEY_BASE 環境変数を設定するのを忘れないように。

tonzlr@wplj:~/tonzlr$ export SECRET_KEY_BASE=`rake secret`
tonzlr@wplj:~/tonzlr$ bundle exec rails s -e production
=> Booting WEBrick
=> Rails 4.1.4 application starting in production on http://0.0.0.0:3000
=> Run `rails server -h` for more startup options
=> Notice: server is listening on all interfaces (0.0.0.0). Consider using 127.0.0.1 (--binding option)
=> Ctrl-C to shutdown server
[2017-03-04 14:55:12] INFO  WEBrick 1.3.1
[2017-03-04 14:55:12] INFO  ruby 2.3.1 (2016-04-26) [x86_64-linux-gnu]
[2017-03-04 14:55:12] INFO  WEBrick::HTTPServer#start: pid=7479 port=3000

これで、ブラウザでアクセスすると、動いているのが確認できた。

Railsアプリの引っ越し

Flask アプリの引っ越しが完了したので、apostrophe (Ubuntu 14.04 LTS) で動いているもうひとつの WEB アプリ(Rails 製)を wplj (Ubuntu 16.04 LTS) に引っ越す。

下準備

このアプリはファイルを貯めこむタイプなので、事前に tar コマンドと scp コマンドを使って /media/aysheaia/wallpapers 以下にファイルを配置しておいた。

専用ユーザの作成

takatoh@wplj $ sudo adduser tonzlr
[sudo] takatoh のパスワード: 
ユーザー `tonzlr' を追加しています...
新しいグループ `tonzlr' (1002) を追加しています...
新しいユーザー `tonzlr' (1002) をグループ `tonzlr' に追加しています...
ホームディレクトリ `/home/tonzlr' を作成しています...
`/etc/skel' からファイルをコピーしています...
新しい UNIX パスワードを入力してください: 
新しい UNIX パスワードを再入力してください: 
passwd: パスワードは正しく更新されました
tonzlr のユーザ情報を変更中
新しい値を入力してください。標準設定値を使うならリターンを押してください
	フルネーム []: 
	部屋番号 []: 
	職場電話番号 []: 
	自宅電話番号 []: 
	その他 []: 
以上で正しいですか? [Y/n] Y
takatoh@wplj $ sudo gpasswd -a tonzlr sudo
ユーザ tonzlr をグループ sudo に追加

Railsアプリの配置

ここからは上で作ったユーザで作業。
GitHub からクローンする。

tonzlr@wplj:~$ git clone https://github.com/takatoh/Tonzlr.git tonzlr

ディレクトリを移動して、依存パッケージをインストール。

tonzlr@wplj:~$ cd tonzlr
tonzlr@wplj:~/tonzlr$ bundle install
プログラム 'bundle' はまだインストールされていません。 'bundle' を利用するために、コンピュータの管理者に 'ruby-bundler' をインストールすることを相談してください

bundler がインストールされてなかった。インストール。

tonzlr@wplj:~/tonzlr$ sudo gem install bundler
[sudo] tonzlr のパスワード: 
tonzlr は sudoers ファイル内にありません。この事象は記録・報告されます。

あれ?なんでだ?
仕方がないので、takatoh ユーザに戻ってインストール。

takatoh@wplj $ sudo gem install bundler

もう一度 tonzlr ユーザで。

tonzlr@wplj:~/tonzlr$ bundle install --path vendor/bundle
Fetching gem metadata from https://rubygems.org/..........
Fetching version metadata from https://rubygems.org/..
Fetching dependency metadata from https://rubygems.org/.
Installing rake 10.4.2
Installing i18n 0.7.0
Installing json 1.8.1 with native extensions
Installing minitest 5.5.0
Installing thread_safe 0.3.4
Installing builder 3.2.2
Installing erubis 2.7.0
Installing rack 1.5.2
Installing mime-types 1.25.1
Installing polyglot 0.3.5
Installing arel 5.0.1.20140414130214
Installing coffee-script-source 1.8.0
Installing execjs 2.2.2
Installing thor 0.19.1
Installing hike 1.2.3
Installing multi_json 1.10.1
Installing libv8 3.16.14.3 (x86_64-linux)
Using bundler 1.14.6
Installing tilt 1.4.1
Installing ref 1.0.5
Installing sass 3.2.19
Installing spring 1.2.0
Installing sqlite3 1.3.10 with native extensions
Installing will_paginate 3.0.7
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

current directory:
/home/tonzlr/tonzlr/vendor/bundle/ruby/2.3.0/gems/json-1.8.1/ext/json/ext/generator
/usr/bin/ruby2.3 -r ./siteconf20170304-4815-1cena5t.rb extconf.rb
mkmf.rb can't find header files for ruby at /usr/lib/ruby/include/ruby.h

extconf failed, exit code 1

Gem files will remain installed in
/home/tonzlr/tonzlr/vendor/bundle/ruby/2.3.0/gems/json-1.8.1 for inspection.
Results logged to
/home/tonzlr/tonzlr/vendor/bundle/ruby/2.3.0/extensions/x86_64-linux/2.3.0/json-1.8.1/gem_make.out

An error occurred while installing json (1.8.1), and Bundler cannot
continue.
Make sure that `gem install json -v '1.8.1'` succeeds before bundling.

む、なんかエラーが。ヘッダファイル ruby.h が見つからないのか?
再び takatho ユーザで。ああもう、いちいちめんどくさいな。

takatoh@wplj $ sudo apt install ruby-dev

tonzlr に戻ってもう一度。今度はどうだ。

tonzlr@wplj:~/tonzlr$ bundle install --path vendor/bundle
Fetching gem metadata from https://rubygems.org/..........
Fetching version metadata from https://rubygems.org/..
Fetching dependency metadata from https://rubygems.org/.
Using rake 10.4.2
Using i18n 0.7.0
Installing json 1.8.1 with native extensions
Using minitest 5.5.0
Using thread_safe 0.3.4
Using builder 3.2.2
Using erubis 2.7.0
Using rack 1.5.2
Using mime-types 1.25.1
Using polyglot 0.3.5
Using arel 5.0.1.20140414130214
Using coffee-script-source 1.8.0
Using execjs 2.2.2
Using thor 0.19.1
Using hike 1.2.3
Using multi_json 1.10.1
Using libv8 3.16.14.3 (x86_64-linux)
Using bundler 1.14.6
Using tilt 1.4.1
Using ref 1.0.5
Using sass 3.2.19
Using spring 1.2.0
Installing sqlite3 1.3.10 with native extensions
Using will_paginate 3.0.7
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

current directory:
/home/tonzlr/tonzlr/vendor/bundle/ruby/2.3.0/gems/json-1.8.1/ext/json/ext/generator
/usr/bin/ruby2.3 -r ./siteconf20170304-5824-26t94o.rb extconf.rb
creating Makefile

current directory:
/home/tonzlr/tonzlr/vendor/bundle/ruby/2.3.0/gems/json-1.8.1/ext/json/ext/generator
make "DESTDIR=" clean

current directory:
/home/tonzlr/tonzlr/vendor/bundle/ruby/2.3.0/gems/json-1.8.1/ext/json/ext/generator
make "DESTDIR="
compiling generator.c
In file included from generator.c:1:0:
../fbuffer/fbuffer.h: In function ‘fbuffer_to_s’:
../fbuffer/fbuffer.h:175:47: error: macro "rb_str_new" requires 2 arguments, but
only 1 given
     VALUE result = rb_str_new(FBUFFER_PAIR(fb));
                                               ^
../fbuffer/fbuffer.h:175:20: warning: initialization makes integer from pointer
without a cast [-Wint-conversion]
     VALUE result = rb_str_new(FBUFFER_PAIR(fb));
                    ^
Makefile:239: ターゲット 'generator.o' のレシピで失敗しました
make: *** [generator.o] エラー 1

make failed, exit code 2

Gem files will remain installed in
/home/tonzlr/tonzlr/vendor/bundle/ruby/2.3.0/gems/json-1.8.1 for inspection.
Results logged to
/home/tonzlr/tonzlr/vendor/bundle/ruby/2.3.0/extensions/x86_64-linux/2.3.0/json-1.8.1/gem_make.out

An error occurred while installing json (1.8.1), and Bundler cannot
continue.
Make sure that `gem install json -v '1.8.1'` succeeds before bundling.

まだエラーが!
ググってみるとこのページに
 cf. https://github.com/flori/json/issues/253
libgmp3-dev をインストールすればいい、みたいに書いてある。

takatoh@wplj $ sudo apt install libgmp3-dev
tonzlr@wplj:~/tonzlr$ bundle install --path vendor/bundle
Fetching gem metadata from https://rubygems.org/..........
Fetching version metadata from https://rubygems.org/..
Fetching dependency metadata from https://rubygems.org/.
Using rake 10.4.2
Using i18n 0.7.0
Installing json 1.8.1 with native extensions
Using minitest 5.5.0
Using thread_safe 0.3.4
Using builder 3.2.2
Using erubis 2.7.0
Using rack 1.5.2
Using mime-types 1.25.1
Using polyglot 0.3.5
Using arel 5.0.1.20140414130214
Using coffee-script-source 1.8.0
Using execjs 2.2.2
Using thor 0.19.1
Using hike 1.2.3
Using multi_json 1.10.1
Using libv8 3.16.14.3 (x86_64-linux)
Using bundler 1.14.6
Using tilt 1.4.1
Using ref 1.0.5
Using sass 3.2.19
Using spring 1.2.0
Installing sqlite3 1.3.10 with native extensions
Using will_paginate 3.0.7
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

current directory:
/home/tonzlr/tonzlr/vendor/bundle/ruby/2.3.0/gems/json-1.8.1/ext/json/ext/generator
/usr/bin/ruby2.3 -r ./siteconf20170304-7573-1jyzrko.rb extconf.rb
creating Makefile

current directory:
/home/tonzlr/tonzlr/vendor/bundle/ruby/2.3.0/gems/json-1.8.1/ext/json/ext/generator
make "DESTDIR=" clean

current directory:
/home/tonzlr/tonzlr/vendor/bundle/ruby/2.3.0/gems/json-1.8.1/ext/json/ext/generator
make "DESTDIR="
compiling generator.c
In file included from generator.c:1:0:
../fbuffer/fbuffer.h: In function ‘fbuffer_to_s’:
../fbuffer/fbuffer.h:175:47: error: macro "rb_str_new" requires 2 arguments, but
only 1 given
     VALUE result = rb_str_new(FBUFFER_PAIR(fb));
                                               ^
../fbuffer/fbuffer.h:175:20: warning: initialization makes integer from pointer
without a cast [-Wint-conversion]
     VALUE result = rb_str_new(FBUFFER_PAIR(fb));
                    ^
Makefile:239: ターゲット 'generator.o' のレシピで失敗しました
make: *** [generator.o] エラー 1

make failed, exit code 2

Gem files will remain installed in
/home/tonzlr/tonzlr/vendor/bundle/ruby/2.3.0/gems/json-1.8.1 for inspection.
Results logged to
/home/tonzlr/tonzlr/vendor/bundle/ruby/2.3.0/extensions/x86_64-linux/2.3.0/json-1.8.1/gem_make.out

An error occurred while installing json (1.8.1), and Bundler cannot
continue.
Make sure that `gem install json -v '1.8.1'` succeeds before bundling.

まだダメだ。最後のメッセージのように json をインストールしてみる。

takatoh@wplj $ sudo gem install json -v '1.8.1'
Fetching: json-1.8.1.gem (100%)
Building native extensions.  This could take a while...
ERROR:  Error installing json:
	ERROR: Failed to build gem native extension.

    current directory: /var/lib/gems/2.3.0/gems/json-1.8.1/ext/json/ext/generator
/usr/bin/ruby2.3 -r ./siteconf20170304-7998-r1om93.rb extconf.rb
creating Makefile

current directory: /var/lib/gems/2.3.0/gems/json-1.8.1/ext/json/ext/generator
make "DESTDIR=" clean

current directory: /var/lib/gems/2.3.0/gems/json-1.8.1/ext/json/ext/generator
make "DESTDIR="
compiling generator.c
In file included from generator.c:1:0:
../fbuffer/fbuffer.h: In function ‘fbuffer_to_s’:
../fbuffer/fbuffer.h:175:47: error: macro "rb_str_new" requires 2 arguments, but only 1 given
     VALUE result = rb_str_new(FBUFFER_PAIR(fb));
                                               ^
../fbuffer/fbuffer.h:175:20: warning: initialization makes integer from pointer without a cast [-Wint-conversion]
     VALUE result = rb_str_new(FBUFFER_PAIR(fb));
                    ^
Makefile:239: ターゲット 'generator.o' のレシピで失敗しました
make: *** [generator.o] エラー 1

make failed, exit code 2

Gem files will remain installed in /var/lib/gems/2.3.0/gems/json-1.8.1 for inspection.
Results logged to /var/lib/gems/2.3.0/extensions/x86_64-linux/2.3.0/json-1.8.1/gem_make.out

ダメだな。詰んだか?
……というところで時間切れ。今日はここまで。

Flaskアプリを引っ越す(5)解決編

データの更新ができない問題が解決した。
アプリのせいじゃなくて、パーミッションの問題だった。次のようにして解決。

bruschetta@wplj:~/bruschetta$ chmod 666 bruschetta/bruschetta.db
bruschetta@wplj:~/bruschetta$ chmod 777 bruschetta

最初、データベースファイルのパーミッションだけ変えてみたけどダメで、ディレクトリのパーミッションも変えたら OK になった。