🕳️

[Caddy]Raspberry Pi Zero WHで毎日アクセスしたくなるファイルサーバーを動かす(WebDAV)

2024/12/15に公開

Intro

長らくオフラインでRaspberry Pi Zero WHを使用してきましたが、引っ越してから本格的にWLAN(Wireless Local Area Network)を構築するにようになり、ついにRaspberry Pi Zero WHで毎日アクセスするファイルサーバーを動かすようになったので、試したコマンド、設定などを紹介したいと思います。

fs

アカウント登録やSSHは必要ありません。
必要最低限のことだけでやっていきたいと思います。

Bootstrap

Raspberry Pi OS

まずはRaspberry Pi OSをインストールします。

https://www.raspberrypi.com/software/

Download

ファイルサーバーに使うCaddyをダウンロードします。
ファイルサーバーはWebDAVとして使うため、mholt/caddy-webdavモジュールを追加します。
するとファイル名がRaspberry Pi Zero WHの場合、caddy_linux_arm6_customになるはずです。

https://caddyserver.com/download

ポートを開放せずインターネットに公開できるQuick Tunnels用のcloudflaredをダウンロードします(以降Cloudflare Tunnelと記載)
Raspberry Pi Zero WHの場合、cloudflared-linux-armを選択します。

https://github.com/cloudflare/cloudflared/releases

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を選択します。

https://go.dev/dl/

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
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
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/

caddy

私は画像生成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接続するのもいいかもしれません。

https://winscp.net/eng/docs/lang:jp

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で毎日アクセスしたくなるファイルサーバーを動かしてみてください。

https://zenn.dev/tkithrta/articles/74085b0d91b5c6
https://zenn.dev/tkithrta/articles/bd5260691d2ce9
https://zenn.dev/tkithrta/articles/5c1b27c8ec95dc

Discussion