背景

自宅でfilebrowserというOSSを使ってwebからアクセス可能なドライブを作ったのですよ。 ただね、なんとこの間、5年間動かし続けた自作PCが壊れてしまい、直すまでドライブが使えないという問題が発生した。 Mean Time Between Failureをなるべく短くするために以下の二つの手段でドライブを冗長化する。 (しかも、リージョンが分かれているという。自宅で停電が発生しても、実家のドライブにアクセスするようになります。)

  1. filebrowserの下準備
  2. メインのノードとは別にバックアップノードを用意しておき、rsyncで定期的にファイルを同期する
  3. filebrowserの前にnginxが動いているが、ここでHCを導入。メインがぶっ壊れた時にはバックアップにLBする。

0. filebrowserの下準備

Details

filebrowserの立て方を簡単に教えますね。

  1. バイナリをビルドするかダウンロードする(https://github.com/filebrowser/filebrowser) /usr/local/binに移動する。

  2. パスワードとかゴニョゴニョする。パスワードのハッシュを生成。そして、–passwordの引数で渡す

filebrowser hash mypassword
  1. ユニットファイルを作る。 例:
[Unit]
Description=FileBrowser Web UI
After=network.target

[Service]
ExecStart=/usr/local/bin/filebrowser -a 0.0.0.0 -p 10001 -r /home/ray/hdd/filebrowser -d /etc/filebrowser/filebrowser.db --username hogehoge --password hogehoge --log /var/log/filebrowser.log 
WorkingDirectory=/etc/filebrowser
Restart=always
User=root
Group=root

[Install]
WantedBy=multi-user.target

sudo systemctl daemon-reload する sudo systemctl

hogehogeが出力されたら、それを–passwordで渡す。 以上

1. rsyncで定期的にファイルを同期する

以下のコマンドを実行するcronジョブを作っておきましょう。毎時間ファイルを同期してくれます。

rsync -avz  -e ssh ray@evn:~/hdd/filebrowser/ /opt/filebrowser_drive/

cronジョブの作り方は簡単

sudo crontab -e

これで開いて、以下のジョブを登録する

*/1 * * * * rsync -avz -e "ssh -i /home/ray/.ssh/id_ed25519" ray@100.64.1.61:~/hdd/filebrowser/ /opt/filebrowser_drive/

cronはrootで実行されるので、鍵を指定しないと/home/root/.ssh の鍵を使いますが、めんどいので自分のを使うようにする。

sshをするのですが、公開鍵をメインのサーバに登録しておく必要があります。パスフレーズなしで。 あと、自分は地味に以下で詰まった。

非常に今更ですが、sshのpublickey authenticationを正しく動かすには、.ssh/authorized_keysのpermissionが非常に大事です。


# 所有者を ray に戻す
sudo chown ray:ray ~/.ssh/authorized_keys

# パーミッションを正しく設定
chmod 600 ~/.ssh/authorized_keys
chmod 700 ~/.ssh
chmod 755 ~

3. nginxでアクティブ・スタンバイ構成をとる。

以下の設定をすることで、メインにアクセスできないときは、自動でバックアップの方に切り替わるようになっています nginxすごすぎ!

# バックアップ先として、実家のを設定しています。
upstream filebrowser_backend {
    server 100.64.1.61:10001;
    server 192.168.40.10:10001 backup;
}

server {
    listen 443 ssl;
    server_name drive.ingenboy.com;

    ssl_certificate /etc/letsencrypt/live/drive.ingenboy.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/drive.ingenboy.com/privkey.pem;

    # CORS設定
    add_header 'Access-Control-Allow-Origin' '*';
    add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
    add_header 'Access-Control-Allow-Headers' 'Origin, Content-Type, Accept';

    location / {
        proxy_pass http://filebrowser_backend;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

実際にテストしてみた

@evn sudo systemctl stop filebrowser

これをやっても、インターネットからアクセスできたということは、うまくフェイルオーバしているということですね。 素晴らしすぎる!!