超簡単おうちNextcloudと面倒な設定要らずの外部公開 with Tailscale

# 環境
- Raspberry Pi 4 Model B
- Raspbian Bullseye 64bit

# 2023年12月追加

以下の解説はRaspberry Piを対象にしていますがさすがにRAM 2GBでは重かったので最近安い小型PCに移行しました
しかし手順としてはUbuntu 22.04でも変わらないことを確認しました
また、手順を大幅に簡略化しました
Raspberry Pi 4のほかのRAMのモデルや、Raspberry Pi 5での動作報告などお待ちしております！

# 2023年5月追記

DNS周りの問題を解決するのにDnsmasqを使うのは結局あんまりうまく動かなかったので推奨しない
その代わりにTailscaleというVPNサービスを使う
**VPN内**のアクセスだけではなく、**VPN外**への公開もTailscaleの機能を使う

# 概要
1. Raspberry Pi4にsnapを使ってNextcloudの簡単インストールをします
1. Ubuntuなどと違い少しだけ手順が増えるためつまづきました
1. Tailscaleの導入
1. https対応
1. 外部公開
1. iOSのホームアプリとの連携（おまけ）

ここまでやります

# Nextcloudのセットアップ

## USBストレージの準備
外付けHDDなどは`/media`にマウントする必要があるようです
適宜

```zsh
sudo vi /etc/fstab
```
で変更しましょう
環境によってそれぞれ対応してください

## snapのインストール
canonicalが作ったsnap経由で入れるのが一番楽そうなのでまずはこちらをインストールします

```zsh
sudo apt update
sudo apt install snapd
```
これでsnapのインストールができました
snapコマンドが使えるようになるはずなので

```zsh
sudo snap install core
```

coreを導入したらこれでsnapのインストールが完了です
おそらくUbuntu以外のディストリビューションを使う場合はcoreのインストールが必須です

## Nextcloudのインストール

このステップはsnapのおかげで簡単です

```zsh
sudo snap install nextcloud
```
Nextcloud installedと出れば成功です．

とりあえず起動するか確認．
初回起動時に色々な設定ファイルが作られるのでしばし待ちましょう


```zsh
sudo snap start nextcloud
```

## 外付けHDDの有効化
データを外部に保存する場合次のステップが必要です

接続

```
sudo snap connect nextcloud:removable-media
```

データのコピー，ターゲット先に気をつけてください

```
sudo cp -r /var/snap/nextcloud/common/nextcloud/data /media/<Target HDD>/nextcloud_data
```

設定ファイルの編集

```
sudo vi /var/snap/nextcloud/current/nextcloud/config/config.php
```
36行目の`datadirectory`を移動先のものへ

再起動

```
snap restart nextcloud
```

もしうまくいかない場合はpiごと

```
sudo reboot now
```


## 初回セットアップ
既にこの時点でブラウザからRaspberryPiのローカルIPをひらけば
下に示したログイン画面のように管理者アカウントを作るよう指示されます．
指示通りやれば無事ローカル内で動作するNextcloudの完成です．
![スクリーンショット 2021-05-06 2.55.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339688/4c0511fb-6f0e-72c2-048c-5bdc76a6b6c5.png)

# 外部公開とHTTPS

ローカル運用、つまり家の中からしかアクセスを行わない運用のみの方はもう読まなくて大丈夫です

お酒飲みながら作業してお酒飲みながらこの記事書いておりましたが外部公開となると気を引き締めていかなければなりません
2023年になって書き直している今ももちろんお酒を飲んでいます
最初に書いたときもお酒を飲んでいました


## Tailscaleの導入

TailscaleとはVPNのサービスである
詳細とインストール方法については以下の記事を参考にされたい、非常に多機能で便利で素敵
そしてこれを利用してVPNの外までの公開ができる、非常に多機能で便利で素敵

[100台まで無料のVPNサービス「tailscale」、リンクだけでマシンのシェアも可能!?【イニシャルB】 - INTERNET Watch](https://internet.watch.impress.co.jp/docs/column/shimizu/1303751.html)

>WireguardフルメッシュVPNを「ゼロコンフィグ」で作れるクラウド型の最新VPNサービス

![](https://tailscale.com/assets/84113/1676992905-mesh-network.svg)


といっても導入はびっくりするほど簡単なので大丈夫だと思われるため、Nextcloudと一緒に使うべき時に必要な手順だけ示す

```bash
sudo tailscale up
```
これだけできてればなんとかなる


### HTTPS対応

VPNを使うならhttpsを使う意味なんてないじゃないかと思うが、なんかブラウザで開いた時にカッコ悪いのと、後述するTailscaleの便利機能が使えるようになるのでオススメです

ほぼ以下の記事の簡単な日本語訳となる
[Enabling HTTPS · Tailscale](https://tailscale.com/kb/1153/enabling-https/)

まずはTailscaleの設定のページから次のことを確認する

> 1.管理コンソールの DNS ページに移動します。
> 2. MagicDNSを有効にします。
> 3. HTTPS Certificatesの下にある、Enable HTTPSをクリックします。
> DeepLで翻訳しました (https://www.deepl.com/app/?utm_source=ios&utm_medium=app&utm_campaign=share-translation

翻訳しました

そしてNextcloudを動かしているマシンで以下のコマンドを実行する

```bash
sudo tailscale serve --bg --https=443 80
```
そしてTailscaleのリバースプロキシ下でNextcloudを動かすため次のように設定する必要がある

```bash
sudo nextcloud.occ config:system:set overwriteprotocol --value 'https'
```

これでどのようにアクセスできるのか次のように確認できる

```bash
tailscale serve status
```

すると、

```bash
https://<hostname>.tail<乱数>.ts.net (tailnet only)
|-- / proxy http://127.0.0.1:80
```

とあるので、適宜

```bash
sudo nextcloud.occ config:system:set trusted_domains 1 --value=<hostname>.tail<乱数>.ts.net
```

とする。

以上、終わり。https対応終わり！

これによって、先ほどの、`https://<hostname>.tail<乱数>.ts.net`のURLを開くと4G/5Gなど外部からのVPNを介した通信、およびおうちのWiFiなどでの内部からの通信、どちらもできるはずである

この時点で、Tailscaleによって発行された`https://<hostname>.tail<乱数>.ts.net`のアドレスでのアクセスは、VPN内からのアクセスであれば`100.`から始まるVPNのIPアドレスに、おうち内からのアクセスであれば`192.168.`のようなローカルアドレスに自動的に名前解決・ルーティングされる。

**うれしい**
**しかも安定している**

なんならNGN網内折り返しも勝手にやってくれるらしい


[フレッツ網内折り返し通信での快適VPN。Wireguardのパフォーマンスを引き出す - Qiita](https://qiita.com/tinoue@github/items/3de11e8faaa96fe568ad)

**うれしい**

## 外部公開

大体の人はこの時点でNextcloudにアクセスしたいすべての端末にTailscaleを導入すればそれでいい気もするが、Tailscaleの凄さはこれだけにとどまらないため、このNextcloudをTailscale VPNの**外に**公開する方法を示す
これによるメリットは以下のようなものがある

- すべての端末にTailscaleを入れなくてもいい
- 普段はVPN内のみ、たまに外部公開がみたいなことが簡単にできる
- そのおかげで、誰かとファイルの受送信をしたいときだけ外部公開、みたいな使い方ができるようになり、安心

ということで、手順です

まずさっきの`serve`をoffにする

```bash
sudo tailscale serve --https=443 off
```

そして外部公開は次のコマンドでできる。DNSの反映までちょっと時間がかかるかもしれない

```bash
sudo tailscale funnel -bg --https=443 80
```

これで`https://<hostname>.tail<乱数>.ts.net`は外部公開される

どれどれ様子を見てみよう

```bash
tailscale serve status
```

すると、

```bash
https://<hostname>.tail<乱数>.ts.net (Funnel on)
|-- / proxy http://127.0.0.1:80
```

**Funnel on**

えっまじか、とりあえずセキュリティチェックしてみよう

Nextcloudが外部からセキュリティ設定が正しいかどうか簡易的に確認してくれる機能が用意されている

https://scan.nextcloud.com/

外部からのアクセスとセキュリティチェックが無事できるはずだ

えっじゃあもしかして...?

```bash
sudo tailscale funnel --https=443 off
```

すると`https://<hostname>.tail<乱数>.ts.net`は外部からアクセスできなくなる

常に外部公開していてもNextcloudのログイン画面やセキュリティの機能があるため問題はない。しかし不必要に公開する意味もないため、場合に応じて`serve`と`funnel`の切り替えができるのはとても嬉しい。


**これで完成！！！！！！！！！！！！！！！！！！！以上！！！！！！！！！！！！！！！！！！！！**

# おまけ

## 意味もなくhomebridgeを使ってon/offを切り替える

![IMG_5031.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339688/67a2ae03-cdd3-204d-b066-60197ae0ea2c.jpeg)

[nakano57/tailscale-funnel_homebridge-cmd4](https://github.com/nakano57/tailscale-funnel_homebridge-cmd4/tree/main)

# 以前(2023年版)の手順からの移行

証明書の更新が不要になるのでこっちの方がおすすめです

```bash
sudo nextcloud.disable-https
sudo snap set nextcloud ports.http=80
sudo nextcloud.occ config:system:set overwriteprotocol --value 'https'
```

以下外部公開へと続く