[Caddy]Raspberry Pi Zero WHで毎日アクセスしたくなるファイルサーバーを動かす(WebDAV)
Intro
長らくオフラインでRaspberry Pi Zero WHを使用してきましたが、引っ越してから本格的にWLAN(Wireless Local Area Network)を構築するにようになり、ついにRaspberry Pi Zero WHで毎日アクセスするファイルサーバーを動かすようになったので、試したコマンド、設定などを紹介したいと思います。
アカウント登録やSSHは必要ありません。
必要最低限のことだけでやっていきたいと思います。
Bootstrap
Raspberry Pi OS
まずはRaspberry Pi OSをインストールします。
Download
ファイルサーバーに使うCaddyをダウンロードします。
ファイルサーバーはWebDAVとして使うため、mholt/caddy-webdav
モジュールを追加します。
するとファイル名がRaspberry Pi Zero WHの場合、caddy_linux_arm6_customになるはずです。
ポートを開放せずインターネットに公開できるQuick Tunnels用のcloudflaredをダウンロードします(以降Cloudflare Tunnelと記載)
Raspberry Pi Zero WHの場合、cloudflared-linux-armを選択します。
Build
ファイルサーバーとは別に個人的にGo言語で作ったWebアプリケーションを動かしているため、開発環境でビルドしておきます。
$ GOOS=linux GOARCH=arm GOARM=6 go build CGO_ENABLED=0 go build -ldflags '-s -w -extldflags "-static"' -trimpath
ただRaspberry Pi OS内でWebアプリケーションをビルドすることはあるので、Go言語もダウンロードしておきます。
Raspberry Pi Zero WHの場合、go1.23.4.linux-armv6l.tar.gzを選択します。
Install
microSDにOSイメージを焼いたらRaspberry Pi Zero WHへ差し込んで電源投入していつものセットアップ画面を進めていきましょう。
Raspberry Pi OS内でターミナルを起動し、ホームディレクトリでいくつかファイルを作成します。
cron.shに実行権限をつけてあげましょう。後ほど使います。
$ touch Caddyfile cron.sh main.go new.txt
$ chmod 755 cron.sh
また先ほどダウンロードしてきたツールたちは別途USBメモリーやmicroSDを用意し、Raspberry Pi OSのHomeにあるDocumentsディレクトリに転送しておきます。
ビルドしたmainコマンドをHomeディレクトリに移動し、実行権限をつけてあげましょう。
$ mv Documents/main ~
$ chmod 755 ~/main
ufw
まず最初にufwをインストールして設定を終えます。
$ sudo apt install ufw
$ sudo ufw status verbose
$ sudo ufw default deny
$ sudo ufw allow from 192.168.10.0/24 to any proto tcp port 49152:49153
$ sudo ufw enable
$ sudo ufw status verbose
これで同じルーターで接続しているデバイスから49152、49153ポートへアクセスできるようになります。
もし使用するポートが増えた場合は以下のようにして拡張しましょう。
$ sudo ufw delete 1
$ sudo ufw allow from 192.168.10.0/24 to any proto tcp port 49152:49167
Caddy
続いてCaddyを/usr/local/bin
ディレクトリに移動して、実行権限をつけてあげます。
$ sudo cp Documents/caddy_linux_arm6_custom /usr/local/bin/caddy
$ sudo chmod 755 /usr/local/bin/caddy
$ caddy version
v2.8.1 h1:UVWB6J5f/GwHPyvdTrm0uM7YhfaWb4Ztdrp/z6ROHsM=
Cloudflare Tunnel
Cloudflare Tunnelも/usr/local/bin
ディレクトリに移動して、実行権限をつけてあげます。
$ sudo cp Documents/cloudflared-linux-arm /usr/local/bin/cloudflared
$ sudo chmod 755 /usr/local/bin/cloudflared
$ cloudflared version
cloudflared version 2024.12.1 (built 2024-12-10-1655 UTC)
Go
Go言語をtarコマンドで展開します。
$ tar -xzf Documents/go1.23.3.linux-armv6l.tar.gz
その後、/usr/local/bin
にgoコマンドとgofmtコマンドのシンボリックリンクを作成します。
$ sudo ln -s ~/go/bin/go /usr/local/bin/go
$ sudo ln -s ~/go/bin/gofmt /usr/local/bin/gofmt
$ go version
go version go1.23.4 linux/arm
Setup
インストールが終わったので他のセットアップを進めます。
まずhostnameがデフォルトのままなのでMenuのPreferencesのRaspberry Pi Configurationから変更し、再起動した後hostnameが変更されているか確認します。
$ hostname
WLANのIPアドレスも後ほど使うので確認します。
$ ip a
ファイルサーバーにzipファイルをアップロードするため、展開できるcron用シェルスクリプトを作成します。
$ nano cron.sh
$ less cron.sh
#!/usr/bin/env bash
for i in $(ls ~/Public/*.zip); do
unzip -nqj "$i" -d "${i%.zip}"
done
crontabを編集します。
$ crontab -e
$ crontab -l
*/1 * * * * ~/cron.sh
後はcronをサービス登録すればcron用シェルスクリプトの処理が1分ごとに実行されます。
$ sudo systemctl status cron
Caddy
以降の処理はターミナルが6枚ぐらい必要になると思うのでCtrl + Alt + Tキーでタブを作っておきます。
まずはCaddyを動かすためにCaddyfileを編集します。
$ less Caddyfile
$ nano Caddyfile
{
admin off
auto_https disable_redirects
local_certs
skip_install_trust
}
https://try.cloudflare.example.com:49152,
https://localhost:49152,
https://raspi-example.local:49152,
https://192.168.10.101:49152 {
log {
output file {$HOME}/49168.log
level ERROR
}
respond /robots.txt 200 {
body "# try.cloudflare.example.com
User-Agent: *
Disallow: /
"
}
root * {$HOME}/Public
@notget not method GET
route @notget {
basic_auth {
{env.BASIC_AUTH_USERNAME} {env.BASIC_AUTH_PASSWORD}
}
webdav
}
file_server browse
}
https://try.cloudflare.example.com:49153,
https://localhost:49153,
https://raspi-example.local:49153,
https://192.168.10.101:49153 {
log {
output file {$HOME}/49169.log
level ERROR
}
respond /robots.txt 200 {
body "# try.cloudflare.example.com
User-Agent: *
Disallow: /
"
}
reverse_proxy localhost:49169
}
WebDAVのためにBasic認証が必要になるため、48文字のユーザー名とパスワードをランダム生成します。
$ tr -dc a-zA-Z0-9 </dev/urandom 2>/dev/null | head -c48 >> new.txt
$ tr -dc a-zA-Z0-9 </dev/urandom 2>/dev/null | head -c48 >> new.txt
$ caddy hash-password --plaintext "$(tail -1 new.txt)" >> new.txt
$ less new.txt
$ nano new.txt
$ export BASIC_AUTH_USERNAME=username
$ export BASIC_AUTH_PASSWORD='$2a$14$...'
Caddyがhttpsで正常に動いているか動作確認します。
$ PORT=49169 ~/main
$ caddy run
$ curl -k https://localhost:49152/robots.txt
# try.cloudflare.example.com
User-Agent: *
Disallow: /
$ curl -k https://localhost:49153/robots.txt
# try.cloudflare.example.com
User-Agent: *
Disallow: /
Cloudflare Tunnel
Cloudflare Tunnelを2個動かします。
$ cloudflared tunnel --no-tls-verify --url https://localhost:49152 --logfile 49152.log
$ cloudflared tunnel --no-tls-verify --url https://localhost:49153 --logfile 49153.log
Quick Tunnels用のURLが発行されるため、Caddyfileのaddressやrespond /robots.txt
を書き換えます。
改めてCaddyを動かします。
$ caddy run
全て動かし終えたらhtopを起動して監視できるようにします。
$ htop
以上、Caddyfileのaddressで設定したURLをブラウザで開けば以下のようなファイルサーバーが使えるようになるはずです。
https://192.168.10.101:49152/
https://raspi-example.local:49152/
https://try.cloudflare.example.com/
私は画像生成AIで生成した画像をCaddyで管理しているので、開発環境からcurlでアップロードしています。
WebDAVのおかげです。
$ curl -T 1700000000.zip -k -u "$BASIC_AUTH_USERNAME:$BASIC_AUTH_PASSWORD" https://raspi-example.local:49152/
最近のWindowsではWebDAVサービスが非推奨のため、SFTPクライアントやS3クライアントとしても使えるFTPクライアントWinSCPでWebDAV接続するのもいいかもしれません。
Other
Go言語開発用のコマンドです。
$ less main.go
$ nano main.go
$ go fmt
$ go run main.go
$ go build -x main.go
WLANの調子が悪くなり、ファイルサーバーにアクセスできなくなった際、再起動するコマンドです。
$ sudo ip link set wlan0 down
$ sudo ip link set wlan0 up
$ reboot
再起動後は改めてCloudflare Tunnelを動かし、Quick Tunnels用のURLを新たに発行する必要があります。
Outro
画像生成AIで生成した画像をRaspberry Pi Zero WHで動かすCaddyのWebDAVで管理できるファイルサーバーは今までの記事の集大成とも呼べるものでした。
いくつかインストールして設定するだけで誰でも簡単に建てることができますので、皆さんも是非使っていないRaspberry Pi Zero WHで毎日アクセスしたくなるファイルサーバーを動かしてみてください。
Discussion