悪霊にさいなまれる世界 -The Demon-Haunted World

30代独身機械系技術者が雑記/セキュリティ/資産運用なんかを書きます/PGP・GPG Key:BC884A1C8202081B19A7A9B8AB8B419682B02FF8

RaspberryPi 3BにdockerでRadicaleをセルフホストしてCloudflaredを使い予定表を共有する(その1:Rasicaleのdockerを使ったインストールと実行)

Twitter(世界最後の一人になるまでこの名前で呼び続ける)でもはちょっと前に書いたが最近結婚した。となると家族間で予定表を共有したいという願望が出てくる。もちろんiCloudのカレンダーや予定表共有サービスはあるが、「クラウドなどというものはない。単なる他人のコンピュータだ」というモットーを掲げているので出来れば自前でサーバを立ち上げたい。ついでに余ってるRaspberryPiの使い道にもなりそう。

と言うわけで、どこのご家庭でも余ってるRaspberryPiにCalDAVサーバであるRadicaleをインストールしてセルフホスティング、Cloudflaredを使って誰でも1つは持っている独自ドメインからアクセスできるようにする。

radicale.org

"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を使って保有するドメイン名から簡単にアクセスするように出来るので次の記事でそれを紹介しよう。