2018年5月28日月曜日

Chrome OSに cli版Dropbox と nginx + php-fpm を導入する

ある程度のプログラムやスクリプト類をDropbox上に置いていて、『ファイル』からのDropboxアクセス以外にもローカルに同期しておきたいので、chromebrewからcli版のDropboxを導入しました。
それらを動作させるための nginx と php-fpm もchromebrewから導入したので、その記録を残しておきます。

Dropboxの導入

まず、ふつうにchromebrewから導入します。

$ crew install dropbox

Dropboxが /etc/sysctl.conf を固定で見ていて、CloudReadyにはその場所にそのファイルがないので、シンボリックリンクを作ります。

$ sudo mount -o rw,remount /
$ sudo ln -s /etc/sysctl.d/00-sysctl.conf /etc/sysctl.conf

このファイル内(末尾にでも)に以下の記述を入れておきます。

fs.inotify.max_user_watches=100000

これでDropboxがエラーを吐いて同期を停止させることなく動くようになるはずでをのちほどの工程でいじります。

DropboxをGUIからもいじるためのTips

Dropbox内のファイルをGUIからも弄りたい場合、Dropboxフォルダの実体をDownloadsフォルダの中に置いておくと便利です。

$ dropbox stop
$ mv ~/Dropbox ~/Downloads/
$ ln -s ~/Downloads/Dropbox ~/Dropbox
$ dropbox start

これでDropboxアプリはちゃんとディレクトリがあると認識してくれるので、正しく同期も行えます。そして、『ファイル』アプリが唯一ファイルシステムの実体を覗いている“Downloads”フォルダ内にあるファイルということになるので、GUI上のアプリからいじることができるようになります。

nginx と php-fpm の導入

nginxは同名パッケージの導入で入ります。

$ crew install nginx

php-fpmはphpパッケージの導入で入るようなので、php5を指定してphp 5.6.xxを導入しました。

$ crew install php5

インストール後の設定にはそんな変わったところはないです。 /usr/local/share/nginx/conf/nginx.conf からのincludeがうまく行かないような気がしたので、それを使わなかったくらい。 /usr/local/etc/php.ini も一般的にはタイムゾーンを Asia/Tokyo などにする程度だと思います。

nginxとDropboxの小技

nginx.conf の server ディレクティブ中で以下のように書いておくと、ApacheのUserDirのようなことができます。

        # for UserDir
        location ~ ^/~([^/]+?)/(.+\.php)$ {
            alias /home/$1/user/public_html/$2;
            index index.php;
            autoindex on;
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        }
        location ~ ^/~(.+?)(/.*)?$ {
            alias /home/$1/user/public_html/$2;
            index index.php index.html;
            autoindex on;
        }

この記述をしておくと、Chromeからは localhost/~chronos/ で、そしてターミナルからは /home/chronos/user/public_html/ 内をいじるとよくなるので便利です。ここにDropboxの同期ディレクトリ /home/chronos/user/Dropbox/ の中からシンボリックリンクを張っておけば、Dropbox上のファイルをいじれば localhost 上を更新できることになります。

sysctl.confの調整

さきほどシンボリックリンクを作った /etc/sysctl.conf へ、Dropboxが指定してくるコマンドを打って fs.inotify.max_user_watches=100000 という構文を追加してやります。

$ echo fs.inotify.max_user_watches=100000 | sudo tee -a /etc/sysctl.conf; sudo sysctl -p

これでエラーなくDropboxが動くようになる、はず。

あと、これはChrome OSが更新されるたびにやらないといけない気がします(ファイルシステムが書き換えられるので)。

なお、mount の際に / をRWでマウントし直せないことがあります(Chrome/Chromium v66以降)。これは以下のようにしてrootfs verificationを無効化することで回避することができます。

    $ sudo disable_verity
    $ sudo reboot

2行目でリブートしているので、再起動後からverificationのない状態で使えるようになっているはずです。

(半)自動起動を仕込む

これらを導入しただけだと自動で起動することができないので、ホームディレクトリの .bashrc に起動スクリプトを仕込みます。
本来であればinit.dやLaunchCtlなどのOS標準の仕組みを利用すべきなのですが、Chrome OSではそこがいじれない(いじっても元に戻される)領域なので、このような変則的な形を取ります。

まず、.bashrc の適切な場所(末尾にでも)に以下を書きます。

    # Dropbox
    DROPBOX=$(ps ax | grep "dropbox-lnx" | grep -v grep | xargs | cut -d" " -f1 2> /dev/null)
    if [ -z "$DROPBOX" ]; then
      if [ -f /usr/local/bin/dropbox ]; then
        /usr/local/bin/dropbox start
      fi
    fi

    # nginx
    NGINX=$(ps ax | grep "nginx: master process" | grep -v grep | xargs | cut -d" " -f1 2> /dev/null)
    if [ -z "$NGINX" ]; then
      if [ -f /usr/local/bin/startnginx ]; then
        /usr/local/bin/startnginx
      fi
    fi

    # php-fpm
    FPM=$(ps ax | grep "php-fpm: master process" | grep -v grep | xargs | cut -d" " -f1 2> /dev/null)
    if [ -z "$FPM" ]; then
      if [ -f /usr/local/bin/php5-fpm ]; then
        /usr/local/bin/php5-fpm start
      fi
    fi

これでDropbox, nginx, php-fpm それぞれの起動スクリプトが仕込まれたので、以降は .bashrc を読み込むアクションを起こせば自動起動されるはずです。つまり、ctrl-alt-Tを押して shell コマンドを1回起動する必要があります。ここが半自動の所以。

まとめ

Chrome OS最高ゥ!