発生した問題
bytemark/webdavを使ってdocker-composeでお手軽にWebDav環境を構築できますが、ApacheのReverseProxyのバックエンドに構築したらクライアントからの接続で「入力したフォルダーは有効ではないようです」と表示されて接続できなくなりました。
原因
bytemark/webdavコンテナが出力したログを見ると クライアントからの OPTIONSメソッドのアクセスがHTTP401のエラーになっていました。
"OPTIONS /hoge HTTP/1.1" 401 381 "-" "Microsoft-WebDAV-MiniRedir/10.0.18362"
ユーザー名/パスワードで認証するより前に OPTIONSメソッドが来ているため拒否されているようです。
対応
bytemark/webdavコンテナ内の
/usr/local/apache2/conf/conf-enabled/dav.conf
の中で
<RequireAny>
Require valid-user
</RequireAny>
と定義されていて、すべてのメッソドに認証が必要な設定になっているので
<LimitExcept OPTIONS>
Require valid-user
</LimitExcept>
として、OPTIONSメソッドを認証なしで通るようにします。
conf-availableディレクトリのdav.confをdockerのボリュームで直接マウントしてみましたがコンテナの起動に失敗しました。
Apacheのconfファイルは起動時にアルファベット順に読み込まれることを利用して、変更後の内容を記述したzdav.conf というファイルを conf-enabledディレクトリ内にマウントすることでdav.confの内容を丸ごと上書きするようにしました。
DavLockDB "/var/lib/dav/DavLock"
Alias / "/var/lib/dav/data/"
<Directory "/var/lib/dav/data/">
Dav On
Options Indexes FollowSymLinks
AuthType Digest
AuthName "WebDAV"
AuthUserFile "/user.passwd"
<LimitExcept OPTIONS>
Require valid-user
</LimitExcept>
</Directory>
# These disable redirects on non-GET requests for directories that
# don't include the trailing slash (for misbehaving clients).
BrowserMatch "Microsoft Data Access Internet Publishing Provider" redirect-carefully
BrowserMatch "MS FrontPage" redirect-carefully
BrowserMatch "^WebDrive" redirect-carefully
BrowserMatch "^WebDAVFS/1.[01234]" redirect-carefully
BrowserMatch "^gnome-vfs/1.0" redirect-carefully
BrowserMatch "^XML Spy" redirect-carefully
BrowserMatch "^Dreamweaver-WebDAV-SCM1" redirect-carefully
BrowserMatch " Konqueror/4" redirect-carefully
BrowserMatch "^gvfs" redirect-carefully
マウントするconfファイルの定義をdocker-compose.ymlの最終行に追加します。
version: '3'
services:
webdav:
image: bytemark/webdav
restart: always
ports:
- "80:80"
environment:
AUTH_TYPE: Digest
USERNAME: hoge
PASSWORD: fuga
LOCATION: /hoge
volumes:
- ./hoge/dav:/var/lib/dav
- ./hoge/zdav.conf:/usr/local/apache2/conf/conf-enabled/zdav.conf
まとめ
dockerを使えば色々な機能を数分で立ち上げることが可能ですが、コンテナ内で問題が発生した場合は調査と対応にそれなりの時間を取られることを想定しておく必要があります。