一つの社内共有フォルダをwebdavでサーバのディレクトリに同期させよう

## はじめに
IT系知識に明るくない一般事務担当者が、ありもののCMSなどを使わずに、さらにFileZilla(SFTP系ツール)なども使わずに、画像ファイルを特定のサーバ内ディレクトリにアップロードする！というシチュエーションってありませんか？

[当協会][0]では、従来、個々の担当者のクライアントPC内にFileZillaをインストールして、画像アップロード作業をする、ということが通例になっていたのです。
が、でも、それって、一歩間違えれば関係ないディレクトリやファイルをいじくることができてしまって大変リスキーですよね。
この状況を何とか打破できないかな、と考えたのが、以下のやり方。

[0]:http://www.piano.or.jp

* 画像を保管するディレクトリをサーバに設置する
* 特定の一つのローカルクライアントPCに、画像を保管するフォルダを作成する
* 上記クライアントPCのフォルダに、Windowsの共有フォルダ機能を設定して、同一ネットワーク内PCからの読み書きを可能にしておく

あとはサーバ側のディレクトリと、ローカル側のフォルダとが同期できていればよいのですが、そこにwebdavを用います。
以下ではそのやり方を詳述していきます。

<!-- more -->

## サーバ側の設定_apache2サーバ
まずサーバ側ですが、今回初めて知りました、nginxってwebdavまわりの実装が貧弱なんですね(残念！)
nginxでWEB公開している稼働中のサーバに対して適用したかったので、nginxでいけないものか散々色々と試してみたのですが、nginxのリビルドが必要とかで面倒だったので諦めました。

ということで、今回は、apache2を入れるための別サーバを一つ立てて、nginxからリバースプロキシかけることにします。
では、apache2のインストールから(サーバOS環境はUbuntu16.04)

```
apt-get -y install apache2
```

仮に、 /var/www/webdav などを用意してですね、以下のようにconfの設定を。

/etc/apache2/sites-available/webdav.conf

``` apache
Alias /webdav /var/www/webdav
<Directory /var/www/webdav>
    Dav On
    AllowOverride None
    Options Indexes
</Directory>
```

今回、80番ポートは閉じて別のポート、例えば8081でアクセスさせる設定も入れておきます。
また、公開用の画像ファイルしか置かない予定なので、特にベーシック認証などもかけません。
ベーシック認証のかけかたなど、末尾の参考記事をご覧いただければと。

/etc/apache2/ports.conf

```apache
# Listen 80
Listen 8081
```

/etc/apache2/sites-available/000-default.conf

```apache
<VirtualHost *:8081>
	ServerName hogehoge.com:8081

	ServerAdmin webmaster@localhost
	DocumentRoot /var/www/

	ErrorLog ${APACHE_LOG_DIR}/error.log
	CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
```

ちなみに、用意した /var/www/webdav には、owner情報やpermissionなど以下のように設定しておくこと。

```
chown www-data:www-data /var/www/webdav
chmod 775 /var/www/webdav
```

で、ここまでやったら、仕上げに、apache2でwebdavの機能をonにしてあげます。

```
a2enmod dav*
a2ensite webdav
```

で、apache2を再起動すれば完了です。
あと、必要に応じてファイアウォールの設定もしておくといいと思います。
ubuntuはufwが便利ですね、ufw美味しいです。


## サーバ側の設定_nginxサーバ
次に、リバースプロキシの設定をnginx側に仕込みます。

/etc/nginx/conf.d/webdav.conf

```nginx
upstream webdav {
  ip_hash;
  server hogehoge.com:8081;
}

server {
  listen 80;
  server_name hogehoge-hoge.com;

  root /var/apps/hogehoge-hoge.com;

  location / {
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Client-IP $remote_addr;
    proxy_set_header X-Forwarded-For $remote_addr;
  }
    
  location /img/ {
    proxy_pass http://webdav;
  }  
}
```

hogehoge-hoge.com というURLにアクセスがあり、かつ、特定ディレクトリ hogehoge-hoge.com/img であれば、apache2サーバ側へ振り分ける、その際に8081番ポートを使うよー、という設定ですね。

このあたりの細かい設定も、末尾参考記事などご参考ください。

最後に、nginxのreloadを。


## クライアント側の設定_CarotDAV
で、クライアント側ですが、Windows組み込みのwebdav機能が特にWin8以後、ちょっと使いものにならない感じになっているそうなので、共有フォルダを置いたPCに、CarotDAVをインストールします。

[CarotDAV][1]
[1]:http://rei.to/carotdav.html

CarotDAVのインストール後、上記の例でいうと http://hogehoge-hoge.com/img へ接続する設定を入れてください。
さらに、簡易WebDAVサーバー機能の設定をおこないます。

CarotDAVの設定については以下の記事など参考に。

[「CarotDAV」の簡易WebDAVサーバーを使ってクラウドストレージをマウントしてみた][2]
[2]:http://wasure.net/carotdav-mount/

で、ネットワークドライブの設定をおこなって、例えばZドライブなど割り当ててマウントします(このあたりも、上記記事にあります)
これで、ローカルフォルダのように、サーバ内ディレクトリを扱えるようになりました。
ただ、ネットワークドライブは、直接的に「共有フォルダ」設定をすることができません(このPC内だけで完結するならここまででよいのですが)

さあ、あと一歩です。


## クライアント側の設定_FreeFileSync
何でもよいので一つ「共有フォルダ」を用意しておきます。
その共有フォルダには、同一ネットワーク内の他PCからは読み書き可能な権限でアクセスできる状態にしましょう。

[Windowsネットワークの基礎：第2回　ファイル共有の使い方 (1/2)][3]
[3]:http://www.atmarkit.co.jp/ait/articles/1406/12/news097.html

このフォルダと、上記でマウントしたZドライブとを同期すればよいわけです。
フォルダの状態監視して同期してくれるツールはフリーソフトであるので、それを使いましょう。
今回は、FreeFileSync(と、その同梱品であるRealFileSync)を。

FreeFileSyncの使い方は以下記事など参考に。

[ファイル同期ソフトの決定版？FreeFileSyncの導入と使い方][4]
[4]:http://photo-studio9.com/freefilesync-1/

FreeFileSyncで一回、手動で設定をおこなった後に同期をすると、タスクファイルを書き出せるようになりますので、それをエクスポートしておきます。
その後、RealFileSyncで上記エクスポートしたファイルを読み込ませて、常駐させておけばOKです。

後は、「共有フォルダ」として設定したフォルダ内に、何らかファイルを追加したら、その数秒後には、FreeFileSyncを通じて共有フォルダからZドライブへファイルが同期されるので、webdavの機能を通じてマウントしているからサーバ側のディレクトリにファイルが格納されていることになります。

実際、SSH接続などしてファイルの存在を確認してみると、当たり前ですがちゃんとあります。
この際、ファイルのownerは、www-dataですね。

以上、長くなりましたが、便利ですよ、これ。
願わくば、もう少しwebdavが復権してくれてnginxでもしっかりしたサポートが入ってくれればなあ……と思わずにはいられません。


## 参考記事

[Apache2 インストール][5]
[nginxをリバースプロキシにしてApacheでWebDavをホストする方法(SSL+BASIC認証)][6]
[複数のWebサーバーを1つのドメインでアクセスさせたい場合 (Nginx でリバースプロキシ)][7]
[WebDAVを利用する][8]

[5]:https://www.server-world.info/query?os=Ubuntu_14.04&p=httpd
[6]:http://blog.kaminogi.jp/archives/517
[7]:http://qiita.com/Salinger/items/4d7d41c1e5dd73f0a691
[8]:https://www.server-world.info/query?os=Ubuntu_14.04&p=httpd&f=10