Raspberry Pi 5とCloudflare Tunnelを使って、GROWIを自宅で運用する

[オープンソースWikiであるGROWI](https://growi.org/ja/)は、個人で手軽に導入して利用できます。普段のメモ代わりに使ったり、家族で共有する情報をまとめたりするのに便利です。

そんなGROWIを手軽に運用する方法として、Raspberry Pi 5に構築しました。また、[Cloudflare Tunnel](https://www.cloudflare.com/ja-jp/products/tunnel/)を使って、インターネットからもアクセスできるようにしてみましたので、内容をメモしておきます。

## 参考情報

[Raspberry Pi 4BでDockerを使う \- みーのぺーじ](https://pc.atsuhiro-me.net/entry/2021/03/07/193235)がとても役立ちました。ありがとうございます！

## 注意点

Cloudflare TunnelはCloudflareで管理しているドメインが必要です。なお、都度URLが変わっても良い場合は、ドメイン不要で利用できます。

## Raspberry Pi 5のセットアップ

Raspberry PiのOSインストールはRaspberry Pi Imagerを利用しています。なお、OSはRaspberry Pi OSではなく、Ubuntu Server 24.04 LTS (64bit)を選択しています。

![スクリーンショット 2024-07-10 11.17.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/a91b9968-ef59-cc0e-be59-4f70c46caae4.png)


## Dockerのインストール

Dockerのインストール手順は[Install Docker Engine on Ubuntu | Docker Docs](https://docs.docker.com/engine/install/ubuntu/)に沿って行っています。

```bash
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Add the repository to Apt sources:
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update

sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
```

執筆時点では27.0.3がインストールされました。Raspberry Pi OSの場合、このバージョンが古いようです。

```bash
$ docker --version
Docker version 27.0.3, build 7d4bcd8
```

## GROWIのクローン

利用するGROWIはGitクローンで取得します。

```bash
git clone https://github.com/weseek/growi-docker-compose.git growi
cd growi
```

## GROWIのビルド

このままだとアーキテクチャが違うためビルドできないので、 `Dockerfile` を修正します。

```Dockerfile
# syntax = docker/dockerfile:1.4

# バージョン修正
ARG version=7.0

FROM debian:stable-slim as fetch-dockerize
# dockerizeのバージョン修正
ENV DOCKERIZE_VERSION v0.7.0
# dockerizeのURLを、ARM64向けに変更
RUN apt-get update && apt-get install -y curl \
    && curl -sL https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-linux-arm64-$DOCKERIZE_VERSION.tar.gz \
        | tar -xz -C /usr/local/bin

FROM weseek/growi:${version}
LABEL maintainer Yuki Takei <yuki@weseek.co.jp>

COPY --from=fetch-dockerize --link /usr/local/bin/dockerize /usr/local/bin/dockerize
```

そしてビルドします。この時もプラットフォーム指定を忘れずに行ってください。

```bash
sudo docker build -t growi:7.0 --platform linux/arm64 .
```

## docker-composeの修正

続いて `docker-compose.yml` を修正します。

```yaml
version: '3'

services:
  app:
    image: growi:7.0 # buildではなく、imageに修正
    ports:
      - 3000:3000 # 外部アクセスできるように修正

# 以下略
```

これで `docker-compose up -d` でGROWIが起動します。起動完了するまでにはしばらくかかるので、気長に待ちましょう。立ち上がってしまえば、ブラウザからの操作はスムーズです。

![image.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/0d255025-15f9-358d-8810-bd7439f34536.jpeg)


## Cloudflare Tunnelのセットアップ

Cloudflare Tunnelを使って、インターネットからもアクセスできるようにします。

```bash
wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-arm64.deb
sudo dpkg -i cloudflared-linux-arm64.deb
```

次に、Cloudflareのアカウントを使ってログインします。認証時に、利用するドメインを指定します。ドメインは事前にCloudflareで設定しておく必要があります。

```bash
cloudflared login
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/4b357837-6f52-fd14-4305-2017d5a0c489.png)


認証したら、Tunnelを作成します。設定内容が `~/.cloudflared/{id}.json` に保存されます。 `raspberry` は任意の名前です。

```bash
cloudflared tunnel create raspberry
```

この時、サブドメインに対して設定が行われます。たとえば `raspberry.example.com` といった具合です。

### 設定ファイルの作成

`~/.cloudflared/config.yaml` を作成します。 `${name}` 、 `${user}` 、 `${id}` はそれぞれTunnelの名前、ユーザー名、IDに置き換えてください。

```yaml
tunnel: ${name}
credentials-file: /home/${user}/.cloudflared/${id}.json
ingress:
  - hostname: raspberry.example.com
    service: http://127.0.0.1:3000
  - service: http_status:404
```

後はTunnelを起動して、該当ドメインからアクセスできるか確認します。

```bash
cloudflared tunnel run raspberry
```

### サービス化

このままだと、Tunnelが起動している間はSSH接続を維持しなければなりません。そこで、Tunnelをサービス化します。

`/etc/systemd/system/cloudflared.service` を作成します。

```bash
sudo cloudflared --config /home/${user}/.cloudflared/config.yml service install
```

おそらく完了時点でサービスとして立ち上がっているはずです。以下の通り設定ファイルは `/etc/cloudflared/config.yml` にコピーされているので、今後の修正はそちらに対して行います。

```bash
$ systemctl status cloudflared

cloudflared.service - cloudflared
     Loaded: loaded (/etc/systemd/system/cloudflared.service; enabled; preset: enabled)
     Active: active (running) since Wed 2024-07-10 09:26:48 JST; 2h 7min ago
   Main PID: 66342 (cloudflared)
      Tasks: 11 (limit: 9074)
     Memory: 16.4M (peak: 19.7M)
        CPU: 15.731s
     CGroup: /system.slice/cloudflared.service
             └─66342 /usr/bin/cloudflared --no-autoupdate --config /etc/cloudflared/config.yml tunnel run
```

## GROWIの設定

GROWIはURL設定が必要なので、管理画面で外部からアクセスしているURLを設定してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/b2be274d-339a-ce99-f26b-6c2599153f36.png)


## まとめ

Raspberry Pi 5とCloudflare Tunnelを使って、GROWIを自宅で運用しつつ、インターネットからアクセスできる方法を紹介しました。Cloudflare Tunnelを使えばHTTPSアクセスになるのも手軽で便利です

[OSS開発wikiツールのGROWI | 快適な情報共有を、全ての人へ](https://growi.org/ja/)