Twitter(世界最後の一人になるまでこの名前で呼び続ける)でもはちょっと前に書いたが最近結婚した。となると家族間で予定表を共有したいという願望が出てくる。もちろんiCloudのカレンダーや予定表共有サービスはあるが、「クラウドなどというものはない。単なる他人のコンピュータだ」というモットーを掲げているので出来れば自前でサーバを立ち上げたい。ついでに余ってるRaspberryPiの使い道にもなりそう。
と言うわけで、どこのご家庭でも余ってるRaspberryPiにCalDAVサーバであるRadicaleをインストールしてセルフホスティング、Cloudflaredを使って誰でも1つは持っている独自ドメインからアクセスできるようにする。
"docker Radicale"で検索して出てくるQiitaの記事のはバージョンアップされてないので使わない。dockerはインストールされているものとして話を進める。
今回使うのはこれ。
https://hub.docker.com/r/tomsquest/docker-radicale/
横にもあるとおり、下記のコマンドでdockerhubからpullする。
docker pull tomsquest/docker-radicale
Radicale用のディレクトリを作ってその中にconfigディレクトリとdataディレクトリを作る。さらに起動用のdocker-compose.ymlを作成。上記のサイトではなぜかリンクが切れているので、githubから直接拾ってくる。
mkdir radicale-docker cd ./radicale-docker/ mkdir data mkdir config wget https://raw.githubusercontent.com/tomsquest/docker-radicale/refs/heads/master/docker-compose.yml
github.comこれを元に少々弄ってやる。まずポートは127.0.0.1から0.0.0.0に(この変更をしないとローカルホスト以外からアクセスできない)。またRaspberryPiの環境ではリソース制限周りが動かない(コンテナ自体は動くが起動時にアラートが出る)のと、30秒ごとに死活監視をするとログが埋まるのでコメントアウトする。また、設定ファイルや認証ファイルを入れるconfigディレクトリをボリュームにマウントさせる。変更したdocker-compose.ymlが以下の通り。
services: radicale: image: tomsquest/docker-radicale container_name: radicale ports: - 0.0.0.0:5232:5232 init: true read_only: true security_opt: - no-new-privileges:true cap_drop: - ALL cap_add: - SETUID - SETGID - CHOWN - KILL # deploy: # resources: # limits: # memory: 256M # pids: 50 #healthcheck: # test: curl -f http://127.0.0.1:5232 || exit 1 # interval: 30s # retries: 3 restart: unless-stopped volumes: - ./data:/data - ./config/:/config
あとはコンフィグとユーザ認証周りを行えばいい。ユーザ認証のベストプラクティスはbcryptであるが、デフォルトのpython3だと別にパッケージが必要なので次善策としてソルト付きSHA-512を選ぶ。configディレクトリに移動し、configファイルを作成する。
cd config sudo vim config
内容は下記の通り。serverのhostsオプションで0.0.0.0を指定することにより、ローカルホスト以外からのアクセスを許可する。authはパスワードの形式と保存場所、storageはデータの保存場所の指定。
[server] hosts = 0.0.0.0:5232 [auth] type = htpasswd htpasswd_filename = /config/users htpasswd_encryption = sha512 [storage] filesystem_folder = /data/collections
次にユーザ認証である。上に設定したとおり、htpasswd形式のusersというファイルをこのディレクトリに作る。わざわざApacheをインストールするのも面倒だし、かと言って検索すると出てくるオンラインのhtpasswdファイル作成ページを使うのも怪しいので、デフォルトで入っているopensslを使おう。ソルトも乱数生成コマンドを使えば自動で作ることが出来る。
echo "USER:$(openssl passwd -6 -salt $(openssl rand -base64 6) PASSWORD)" > users
このコマンドのUSERとPASSWORDを適当に設定してやれば良い。なお、当然このコマンドは平文のパスワードを含んだまま.bash_historyにそのまま残るのでちゃんと削除して置くこと。
それではradicaleディレクトリに戻ってdocker-compose.ymlを起動してやる。
cd /home/pi/radicale-docker/ sudo docker compose up -d
正常に動いているか見てみる。
docker ps -a
終了したければ下記コマンドを指示する。
sudo docker compose down
これで動作しているコンテナが一覧表示される。問題があればそれらしいことが書いてあるはずだ。問題が無ければ母艦PCから192.168.11.4:5323へアクセスすると下に示すようなログインページが開く。
ここに上で設定したユーザ名とパスワードを入力すればログインできる。最初の状態では何もないので、右下の+ボタンを押して新規にカレンダーを作成する。
これでサーバ側の設定は終わり。このままルータを弄ってポートを空けてやる、等すれば外部からも繋げるが、前述の通りCloudflaredを使って保有するドメイン名から簡単にアクセスするように出来るので次の記事でそれを紹介しよう。