Google Compute Engine (GCE)上でTiny Tiny RSSを動かしてみる

[Google Readerが終了](http://googlereader.blogspot.com/2013/07/a-final-farewell.html)して以来、AWSで[Tiny Tiny RSS](https://tt-rss.org/)を動かしてRSSを読んでましたが、[Google Cloud Platform](https://cloud.google.com/)の勉強がてら[Compute Engine](https://cloud.google.com/compute/)に移行してみようと思います。基本的に自分用の備忘録です。

まずはGCE上でTiny Tiny RSSを動かすところまでやってみます。

# 環境

個人的に使い慣れたものを組み合わせてこんな感じにします。

- [Ubuntu LTS](https://wiki.ubuntu.com/LTS)
- [MySQL](https://www.mysql.com/)
- [Lighttpd](https://www.lighttpd.net/)
- [PHP](http://www.php.net/) with [PHP-FPM](http://php-fpm.org/)
- [Tiny Tiny RSS](https://tt-rss.org/)

# GCEのVMインスタンスを起動

[Machine type](https://cloud.google.com/compute/docs/machine-types)はとりあえず`f1-micro`を選択。[OS](https://cloud.google.com/compute/docs/operating-systems/)は`ubuntu-14-04`を選択。Firewallの設定のAllow HTTP trafficをチェックして起動します。

# 各種ソフトウェアのインストールと設定

SSHでログインして作業します。

```bash
$ sudo timedatectl set-timezone America/Los_Angeles
$ sudo apt-get update
$ sudo apt-get install mysql-client mysql-server
$ sudo apt-get install lighttpd
$ sudo apt-get install php5-cli php5-curl php5-fpm php5-mysql
```
`php5`をインストールすると`apache2`も付いてくるので、ここでは`php5-cli`をインストールします。

MySQLの設定ファイルは`/etc/mysql/my.cnf`にあります。ここでは、キャラクターセットの設定を[`utf8mb4`](https://dev.mysql.com/doc/refman/5.6/en/charset-unicode-utf8mb4.html)にセットして`mysql`を再起動します。

```bash
$ sudo vi /etc/mysql/my.cnf
```
```:/etc/mysql/my.cnf
[client]
...
default-character-set = utf8mb4

[mysqld]
..
character-set-server = utf8mb4
```
```bash
$ sudo service mysql restart
mysql stop/waiting
mysql start/running, process 1234
```

PHPの設定ファイルは`/etc/php5/*`にあります。ここでは、PHP-FPMの設定の`cgi.fix_pathinfo`を`1`にセットして、`php5-fpm`を再起動します。

```bash
$ sudo sed -i -e 's/^;\(cgi.fix_pathinfo\)\s*=.*$/\1 = 1/' /etc/php5/fpm/php.ini
$ sudo service php5-fpm restart
php5-fpm stop/waiting
php5-fpm start/running, process 1234
```

Lighttpdの設定ファイルは`/etc/lighttpd/*`にあります。ここでは、fastcgi-phpの設定をPHP-FPM用に以下のように書き換えて、`fastcgi`と`fastcgi-php`を有効にして、`lighttpd`をリロードします。

```bash
$ sudo vi /etc/lighttpd/conf-available/15-fastcgi-php.conf
```
```:/etc/lighttpd/conf-available/15-fastcgi-php.conf
# -*- depends: fastcgi -*-
# /usr/share/doc/lighttpd/fastcgi.txt.gz
# http://redmine.lighttpd.net/projects/lighttpd/wiki/Docs:ConfigurationOptions#mod_fastcgi-fastcgi

## Start an FastCGI server for php (needs the php5-fpm package)
fastcgi.server += ( ".php" =>
        ((
                "socket" => "/var/run/php5-fpm.sock",
                "broken-scriptfilename" => "enable"
        ))
)
```
```bash
$ sudo lighttpd-enable-mod fastcgi
Enabling fastcgi: ok
Run /etc/init.d/lighttpd force-reload to enable changes
$ sudo lighttpd-enable-mod fastcgi-php
Enabling fastcgi-php: ok
Run /etc/init.d/lighttpd force-reload to enable changes
$ sudo service lighttpd force-reload
 * Reloading web server configuration lighttpd                           [ OK ] 
```

# 動作確認

ブラウザで http://(IPアドレス)/ にアクセスして、Lighttpdのデフォルトページが表示されればLighttpdはok。

次のようなPHPスクリプトを用意して、ブラウザで http://(IPアドレス)/phpinfo.php にアクセスして、PHPの情報が表示されればPHPはok。

```php:/var/www/phpinfo.php
<?php phpinfo() ?>
```

# Tiny Tiny RSSのインストールと設定

[インストールガイド](https://tt-rss.org/gitlab/fox/tt-rss/wikis/InstallationNotes)に従ってインストールします。

```bash
$ sudo apt-get install git
$ cd /var/www
$ sudo git clone https://tt-rss.org/git/tt-rss.git tt-rss
Cloning into 'tt-rss'...
...
$ sudo chgrp www-data tt-rss
$ sudo chmod g+w tt-rss
$ cd tt-rss
$ sudo chgrp www-data cache cache/* feed-icons lock
$ sudo chmod g+w cache cache/* feed-icons lock
```
Lighttpdから各種ファイルを書き込めるようにいくつかのディレクトリのパーミッションも設定しておきます。設定が足りない場合は以下のブラウザでのインストール時にメッセージが出るので、それを見て設定しても問題ありません。

MySQLのユーザとデータベースを作成します。

```bash
$ mysql -u root -p
Enter password:
...
mysql> CREATE DATABASE ttrss_db CHARACTER SET utf8mb4;
Query OK, 1 row affected (0.00 sec)

mysql> CREATE USER 'ttrss_user'@'localhost' IDENTIFIED BY 'password';
Query OK, 0 rows affected (0.00 sec)

mysql> GRANT ALL ON ttrss_db.* TO 'ttrss_user'@'localhost';
Query OK, 0 rows affected (0.00 sec)

```

[MySQL用のスキーマ](https://tt-rss.org/gitlab/fox/tt-rss/blob/master/schema/ttrss_schema_mysql.sql)ではテーブルを`DEFAULT CHARSET=UTF8`で作るようになっているので、`DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci`に書き換えます。[こちら](https://tt-rss.org/forum/viewtopic.php?t=2716#p15953)も参考にしつつ、titleやcontentといったカラムのある以下のテーブルについて書き換えます。また、ttrss_entriesテーブルのguidカラムについては`varchar(255)`を`varchar(191)`に書き換えます。

- ttrss_feed_categories
- ttrss_archived_feeds 
- ttrss_feeds 
- ttrss_entries 
- ttrss_user_entries 
- ttrss_filters2
- ttrss_enclosures 
- ttrss_settings_profiles
- ttrss_feedbrowser_cache 
- ttrss_linked_feeds 
- ttrss_error_log

```bash
$ cd /var/www/tt-rss/schema
$ sudo cp -p ttrss_schema_mysql.sql ttrss_schema_mysql.sql.orig
$ sudo vi ttrss_schema_mysql.sql
```

ブラウザで http://(IPアドレス)/tt-rss/install/ にアクセスしてインストールします。成功すれば`/var/www/tt-rss/config.php`に設定ファイルが作られるので、ざっと設定ファイルの内容を確認して、次の設定を追加しておきます(後述)。

```bash
$ sudo vi /var/www/tt-rss/config.php
```
```:/var/www/tt-rss/config.php
	define('DAEMON_SLEEP_INTERVAL', 600);
```

[フィードのアップデート](https://tt-rss.org/gitlab/fox/tt-rss/wikis/UpdatingFeeds)用にUpstartスクリプトを用意して起動します。

```bash
$ sudo vi /etc/init/tt-rss.conf
```
```:/etc/init/tt-rss.conf
description "Tiny Tiny RSS Update Daemon"
author "z80"

start on runlevel [2345]
stop on runlevel [016]

respawn
exec start-stop-daemon -S -c www-data:www-data -x /usr/bin/php /var/www/tt-rss/update.php -- --daemon --log /var/log/tt-rss.log --quiet
```
`respawn`で、デーモンが何らかの理由で終了したら再起動するようにします。

```bash
$ init-checkconf /etc/init/tt-rss.conf
File /etc/init/tt-rss.conf: syntax ok
$ sudo touch /var/log/tt-rss.log
$ sudo chgrp www-data /var/log/tt-rss.log
$ sudo chmod 664 /var/log/tt-rss.log
$ sudo service tt-rss start
tt-rss start/running, process 1234
```

デフォルトでは2分おきにDBをチェックしてフィードのアップデートを行うようになってます(毎回全部ではなく、フィードのアップデートが必要かどうかチェックして、必要な分だけ)。しかし、個人で使ってる分にはそんなに頻繁に走らせる必要はないので、設定ファイルの`DAEMON_SLEEP_INTERVAL`で間隔を適当に調整しておきます。

ブラウザで http://(IPアドレス)/tt-rss/にアクセスして、adminユーザのパスワード(デフォルトはpassword)を変更しておきます。

# Fever API pluginのインストールと設定

スマートフォンのアプリからアクセスできるように[Fever API plugin](https://github.com/dasmurphy/tinytinyrss-fever-plugin)をインストールします。[releases](https://github.com/dasmurphy/tinytinyrss-fever-plugin/releases)ページの最新版を取ってきて`/var/www/tt-rss/plugins/`ディレクトリにコピーします。

```bash
$ wget https://github.com/dasmurphy/tinytinyrss-fever-plugin/archive/1.4.7.tar.gz
...
$ tar xvfz 1.4.7.tar.gz
$ sudo mv tinytinyrss-fever-plugin-1.4.7/fever /var/www/tt-rss/plugins/
```

[Reeder (iOS) integration with TT-RSS (via Fever API)](https://tt-rss.org/forum/viewtopic.php?f=22&t=1981)を参考に設定などを行います。

# まとめ

Compute Engine上でTiny Tiny RSSを動かすことができました。

# ToDo

このままだとVMインスタンスが停止したらデータも丸ごと消えてしまいます。GCEには[ライブ マイグレーション](http://googlecloudplatform-japan.blogspot.com/2015/03/google-compute-engine.html)があるのでそれなりに動き続けてくれそうですが、それでも停止する可能性は残るので、[Persistent Disk](https://cloud.google.com/compute/docs/disks/persistent-disks)や[Cloud SQL](https://cloud.google.com/sql/)を使うなどしてデータが消えないようにする必要があります。
追記:[Google Compute Engine (GCE)からCloud SQLを使ってみる](http://qiita.com/z80/items/f4d584ef8779015668cd)

# 参考

- https://www.howtoforge.com/installing-lighttpd-with-php5-php-fpm-and-mysql-on-ubuntu-14.04-lts
- [Upstart](http://upstart.ubuntu.com/)
- [Running update deamon on Ubuntu server](https://tt-rss.org/forum/viewtopic.php?t=1135)
- [Changing update.php single process update interval](https://tt-rss.org/forum/viewtopic.php?t=2426)