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

[Google Cloud](https://cloud.google.com/)で[Tiny Tiny RSS](https://tt-rss.org/)を動かしてみようと思います。基本的に自分用の備忘録です。

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

# 環境

今どきはTiny Tiny RSSもDockerで動かすようなので、[Containers on Compute Engine](https://cloud.google.com/compute/docs/containers)を参考にGoogleが提供しているContainer-Optimized OSを使ってみます。

[docker-compose.yml](https://git.tt-rss.org/fox/ttrss-docker-compose/src/docker-compose.yml)を見ると、WebサーバはNginx、DBはPostgreSQLを使っているようです。

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

以下の設定でVMインスタンスを起動します。

* [Machine type](https://cloud.google.com/compute/docs/machine-types)はとりあえず[Compute EngineのFree tier](https://cloud.google.com/free/docs/gcp-free-tier/#compute)が使える`e2-micro`を選択。
* Boot diskの[Image](https://cloud.google.com/compute/docs/images)はOperating system `Container Optimized OS`の中からFamily: cos-stableとなっているバージョンを選択。
* Firewallsの設定のAllow HTTP trafficをチェック。
* [Using Cloud Logging with Container-Optimized OS](https://cloud.google.com/container-optimized-os/docs/how-to/logging)を参考に、Custom metadataにkey=`google-logging-enabled`, value=`true`を追加してロギングを有効化。

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

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

```bash
$ sudo timedatectl set-timezone America/Los_Angeles
```

[Running Docker Compose with Docker](https://cloud.google.com/community/tutorials/docker-compose-on-container-optimized-os)を参考にContainer Optimized OSでdocker-composeを使えるようにします。

```bash
z80@cos-tt-rss ~ $ docker run docker/compose:1.29.2 version
Unable to find image 'docker/compose:1.29.2' locally
1.29.2: Pulling from docker/compose
339de151aab4: Pull complete 
484a7070e879: Pull complete 
6391cb0e5266: Pull complete 
aaaf585806ed: Pull complete 
Digest: sha256:ae66070588c539b965986dc74e9371e3e62ef71668b72a5eed70de111ed3659e
Status: Downloaded newer image for docker/compose:1.29.2
docker-compose version 1.29.2, build 5becea4
docker-py version: 5.0.0
CPython version: 3.7.10
OpenSSL version: OpenSSL 1.1.1k  25 Mar 2021
```

ついでにdocker-composeをaliasに登録しておきます。

```bash
z80@cos-tt-rss ~ $ echo alias docker-compose="'"'docker run --rm \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v "$PWD:$PWD" \
    -w="$PWD" \
    docker/compose:1.29.2'"'" >> ~/.bashrc
z80@cos-tt-rss ~ $ source ~/.bashrc
```

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

[Installation Guide](https://tt-rss.org/wiki/InstallationNotes)に従って、ユーザにお勧めのstaticでインストールしてみます。

```bash
z80@cos-tt-rss ~ $ git clone https://git.tt-rss.org/fox/ttrss-docker-compose.git ttrss-docker
Cloning into 'ttrss-docker'...
remote: Enumerating objects: 1164, done.
remote: Counting objects: 100% (1164/1164), done.
remote: Compressing objects: 100% (707/707), done.
remote: Total 1164 (delta 746), reused 726 (delta 450)
Receiving objects: 100% (1164/1164), 135.10 KiB | 408.00 KiB/s, done.
Resolving deltas: 100% (746/746), done.
z80@cos-tt-rss ~ $ cd ttrss-docker/
z80@cos-tt-rss ~/ttrss-docker $ git checkout static-dockerhub
Branch 'static-dockerhub' set up to track remote branch 'static-dockerhub' from 'origin'.
Switched to a new branch 'static-dockerhub'
```

設定ファイルを編集します。[Global configuration](https://tt-rss.org/wiki/GlobalConfig)の設定項目も.envファイルで設定できるので、必要に応じて追加します。

```bash
z80@cos-tt-rss ~/ttrss-docker $ cp .env-dist .env
z80@cos-tt-rss ~/ttrss-docker $ vi .env
```
```:~/ttrss-docker/.env
...
TTRSS_SELF_URL_PATH=http://z80.example.com/tt-rss
...
TTRSS_DAEMON_SLEEP_INTERVAL=600
...
HTTP_PORT=80
```

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

docker-composeで起動します。

```bash
z80@cos-tt-rss ~/ttrss-docker $ docker-compose pull
Pulling db        ... 
Pulling app       ... 
Pulling backups   ... 
Pulling updater   ... 
Pulling web-nginx ... 
...
Pulling db        ... done
Pulling web-nginx ... done
Pulling app       ... done
Pulling updater   ... done
Pulling backups   ... done
z80@cos-tt-rss ~/ttrss-docker $ docker-compose up -d
Creating network "ttrss-docker_default" with the default driver
Creating volume "ttrss-docker_db" with default driver
Creating volume "ttrss-docker_app" with default driver
Creating volume "ttrss-docker_certs" with default driver
Creating volume "ttrss-docker_backups" with default driver
Creating ttrss-docker_db_1 ... 
Creating ttrss-docker_db_1 ... done
Creating ttrss-docker_backups_1 ... 
Creating ttrss-docker_app_1     ... 
Creating ttrss-docker_backups_1 ... done
Creating ttrss-docker_app_1     ... done
Creating ttrss-docker_updater_1 ... 
Creating ttrss-docker_web-nginx_1 ... 
Creating ttrss-docker_updater_1   ... done
Creating ttrss-docker_web-nginx_1 ... done
```

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

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

[Tiny Tiny RSS Fever API Plugin](https://github.com/DigitalDJ/tinytinyrss-fever-plugin)のInstallationに従ってインストールします。

まずはTiny Tiny RSSのpluginsディレクトリを確認します。

```bash
z80@cos-tt-rss ~ $ docker volume ls
DRIVER    VOLUME NAME
local     ttrss-docker_app
local     ttrss-docker_backups
local     ttrss-docker_certs
local     ttrss-docker_db
z80@cos-tt-rss ~ $ docker volume inspect ttrss-docker_app
[
    {
        "CreatedAt": "2021-10-17T22:33:02Z",
        "Driver": "local",
        "Labels": {
            "com.docker.compose.project": "ttrss-docker",
            "com.docker.compose.version": "1.29.2",
            "com.docker.compose.volume": "app"
        },
        "Mountpoint": "/var/lib/docker/volumes/ttrss-docker_app/_data",
        "Name": "ttrss-docker_app",
        "Options": null,
        "Scope": "local"
    }
]
z80@cos-tt-rss ~ $ ls /var/lib/docker/volumes/ttrss-docker_app/_data
index.php  tt-rss
z80@cos-tt-rss ~ $ ls /var/lib/docker/volumes/ttrss-docker_app/_data/tt-rss
CONTRIBUTING.md  backend.php    composer.lock    gulpfile.js  js             lock          plugins        schema           themes              utils
COPYING          cache          config.php       images       jsconfig.json  messages.pot  plugins.local  sql              themes.local        vendor
README.md        classes        config.php-dist  include      lib            package.json  prefs.php      templates        update.php
api              composer.json  feed-icons       index.php    locale         phpstan.neon  public.php     templates.local  update_daemon2.php
z80@cos-tt-rss ~ $ ls /var/lib/docker/volumes/ttrss-docker_app/_data/tt-rss/plugins.local/
index.html  nginx_xaccel
```

Fever API pluginのファイルをTiny Tiny RSSのpluginsディレクトリにコピーします。

```bash
z80@cos-tt-rss ~ $ git clone https://github.com/DigitalDJ/tinytinyrss-fever-plugin fever
Cloning into 'fever'...
remote: Enumerating objects: 344, done.
remote: Counting objects: 100% (35/35), done.
remote: Compressing objects: 100% (30/30), done.
remote: Total 344 (delta 13), reused 15 (delta 5), pack-reused 309
Receiving objects: 100% (344/344), 109.98 KiB | 853.00 KiB/s, done.
Resolving deltas: 100% (139/139), done.
z80@cos-tt-rss ~ $ sudo mv fever /var/lib/docker/volumes/ttrss-docker_app/_data/tt-rss/plugins.local/
z80@cos-tt-rss ~ $ cd /var/lib/docker/volumes/ttrss-docker_app/_data/tt-rss/plugins.local/
z80@cos-tt-rss /var/lib/docker/volumes/ttrss-docker_app/_data/tt-rss/plugins.local $ ls -l
total 8
drwxr-xr-x 2 z80     z80     4096 Oct 17 15:45 fever
-rw-r--r-- 1 chronos chronos    0 Oct 11 04:00 index.html
drwxr-xr-x 4 chronos chronos 4096 Oct 11 16:53 nginx_xaccel
z80@cos-tt-rss /var/lib/docker/volumes/ttrss-docker_app/_data/tt-rss/plugins.local $ sudo chown -R chronos:chronos fever
z80@cos-tt-rss /var/lib/docker/volumes/ttrss-docker_app/_data/tt-rss/plugins.local $ ls -l
total 8
drwxr-xr-x 2 chronos chronos 4096 Oct 17 15:45 fever
-rw-r--r-- 1 chronos chronos    0 Oct 11 04:00 index.html
drwxr-xr-x 4 chronos chronos 4096 Oct 11 16:53 nginx_xaccel
```

あとは、各ユーザのPreferences→PluginsのところでFever API pluginを有効にしてから、Preferences→Fever Emulationのところでパスワードを設定しておきます。

# Dockerイメージの更新

```bash
z80@cos-tt-rss ~/ttrss-docker $ docker-compose down
...
z80@cos-tt-rss ~/ttrss-docker $ docker-compose pull
...
z80@cos-tt-rss ~/ttrss-docker $ docker images
REPOSITORY                                            TAG         IMAGE ID       CREATED         SIZE
cthulhoo/ttrss-web-nginx                              latest      b5a08f23b261   40 hours ago    22.3MB
cthulhoo/ttrss-fpm-pgsql-static                       latest      22d112067a88   40 hours ago    133MB
cthulhoo/ttrss-web-nginx                              <none>      eda29dacbf79   6 days ago      22.3MB
cthulhoo/ttrss-fpm-pgsql-static                       <none>      1865276c9590   6 days ago      133MB
postgres                                              12-alpine   3627b2778444   2 weeks ago     190MB
docker/compose                                        1.29.2      32d8a4638cd8   5 months ago    76.2MB
gcr.io/stackdriver-agents/stackdriver-logging-agent   1.8.4       e6b23af25854   11 months ago   226MB
z80@cos-tt-rss ~/ttrss-docker $ docker-compose up -d
Creating network "ttrss-docker_default" with the default driver
Creating ttrss-docker_db_1 ... 
Creating ttrss-docker_db_1 ... done
Creating ttrss-docker_app_1 ... 
Creating ttrss-docker_backups_1 ... 
Creating ttrss-docker_app_1     ... done
Creating ttrss-docker_backups_1 ... done
Creating ttrss-docker_web-nginx_1 ... 
Creating ttrss-docker_updater_1   ... 
Creating ttrss-docker_updater_1   ... done
Creating ttrss-docker_web-nginx_1 ... done
```