【初めての自宅サーバー】　ポート開放せずにファイルサーバーを作る！

# 初めての自宅サーバー構築：NextCloudでファイルサーバーを作ろう！

みなさん、自宅サーバーって気になりませんか？「できる同僚」が「NextCloudを自宅サーバーに構築すれば、無料で画像やドキュメントを保存できて便利だよ」と言っていたのを聞いて、私も挑戦してみることにしました。この記事では、初心者の視点から「初めての自宅サーバーの構築」としてNextCloudでファイルサーバーを構築した過程を紹介します。

## 躓いたポイントたち

まず、私が苦労したポイントを共有します。同じような問題にぶつかったときの参考になれば幸いです。

| ポイント | 解決策 |
|:--|:--|
| WSL？ Docker？ 環境構築をどうする？ | WSL2 + Dockerの組み合わせを選択 |
| ドメインをどうしよう | お名前.comで無料ドメインを入手 |
| ポート開放がうまくできない！JCOMが悪いのか？ | CloudFlareを使用してポート開放不要に |
| DNSの設定方法がわからない | CloudFlareのダッシュボードで設定 |
| NextCloudにスマホからログインできない | trusted_domainsの設定を追加 |
| NextCloudの速度が遅くて不快 | キャッシュ設定の最適化を実施 |

## 構築の流れ

1. PCの選定
2. 環境構築（WSL＋Docker）
3. ドメインの入手
4. CloudFlareの設定
5. NextCloudをより使いやすく

## 用いたPC

形から入るタイプの私は、MINIS FORUMのUN100Lを選びました。コンパクトで省電力、そして24時間稼働させても気にならないサイレント設計が決め手でした。

https://store.minisforum.jp/products/minisforum-un100l?variant=44656652714150&currency=JPY&utm_medium=product_sync&utm_source=google&utm_content=sag_organic&utm_campaign=sag_organic&gad_source=1&gclid=Cj0KCQjw-uK0BhC0ARIsANQtgGMRwYLzCXtAMGgpMiMkhe2UC2nTgieHIchZnkVWlcP3vxOW9PcYNj0aAnqBEALw_wcB

## 環境構築

### Windows 11にWSL2でUbuntuの環境を構築

まずはPowerShellでWSL2をインストールします。

```console:powershell
wsl --install
```

このコマンドを実行すると、WSL2とUbuntuがインストールされます。

### Ubuntu上にDockerを立ち上げる

次に、Ubuntu環境にDockerをインストールします。以下のコマンドを順番に実行してください。

```console:wsl2
sudo apt update
sudo apt install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io
sudo systemctl start docker
sudo systemctl enable docker
sudo usermod -aG docker $USER
wsl --shutdown
```

これらのコマンドでDockerのインストールと初期設定が完了します。

### NextCloudをインストールしファイルサーバーを構築

NextCloudの構築にはDocker Composeを使用します。以下の手順で進めてください。

```console:wsl2
mkdir ~/nextcloud
cd ~/nextcloud
nano docker-compose.yml
```

`docker-compose.yml`ファイルに以下の内容を記述します。

```yml:docker-compose.yml
version: '3'

services:
  db:
    image: mariadb
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_PASSWORD: dbpassword
      MYSQL_DATABASE: nextcloud
      MYSQL_USER: nextcloud
    volumes:
      - db:/var/lib/mysql

  app:
    image: nextcloud
    restart: always
    ports:
      - 8080:80
    links:
      - db
    volumes:
      - nextcloud:/var/www/html

volumes:
  nextcloud:
  db:
```

ファイルを保存後、以下のコマンドでコンテナを起動します。

```console:wsl2
docker-compose up -d
```

これでNextCloudの基本的なセットアップが完了しました。ブラウザで`http://localhost:8080`にアクセスし、初期設定を行ってください。

## 独自ドメインの取得

CloudFlareの設定で詰まる可能性があるため、先にドメインを取得しておくことをおすすめします。今回は[お名前.com](https://www.onamae.com/?btn_id=aboutdomain_breadcrumb_top)でドメインを取得しました。

https://www.onamae.com/?btn_id=aboutdomain_breadcrumb_top

:::note info
**重要：** ドメイン取得時に表示される**ネームサーバー**を後ほどの設定で書き換えます
:::


## CloudFlareでポート開放不要のWEB公開を実現

JCOMのWiFiでポート開放が面倒だったため、CloudFlareを使用してポート開放なしでサービスをWeb公開する方法を採用しました。

### CloudFlareとは？

CloudFlareは、ウェブサイトのパフォーマンスと安全性を向上させるためのCDN（コンテンツ配信ネットワーク）およびDDoS保護サービスです。以下の主な特徴があります：

1. **セキュリティ強化**: DDoS攻撃やその他のサイバー攻撃からウェブサイトを保護します。
2. **高速化**: CDNを通じてコンテンツを配信することで、ウェブサイトの読み込み速度を向上させます。
3. **SSL/TLS暗号化**: 無料のSSL/TLS証明書を提供し、通信を暗号化します。
4. **Argo Tunnel**: これにより、ポート開放なしで自宅サーバーをインターネットに公開できます。

今回の自宅サーバー構築では、特にArgo Tunnel（現在はCloudflare Tunnelと呼ばれています）の機能を利用します。これにより、ルーターの設定を変更したりポートを開放したりすることなく、安全にNextCloudサーバーをインターネットに公開できるのです。

### CloudFlareの設定

それでは、実際にCloudFlareの設定を行っていきましょう。

https://www.cloudflare.com/

1. [CloudFlare](https://www.cloudflare.com/)でアカウントを作成し、取得したドメインを追加します。
2. 表示されるNameserverをドメイン取得サイトで登録します。

次に、WSL2環境でCloudflaredをインストールし設定します。

```console:wsl2
wget -q https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb
sudo dpkg -i cloudflared-linux-amd64.deb
cloudflared tunnel login
cloudflared tunnel create nextcloud-tunnel
nano ~/.cloudflared/config.yml
```

`config.yml`ファイルに以下の内容を記述します。

```yml:config.yml
tunnel: <トンネルID>
credentials-file: /home/<ユーザー名>/.cloudflared/<トンネルID>.json

ingress:
  - hostname: nextcloud.your-domain.com
    service: http://localhost:8080
  - service: http_status:404
```

トンネルを実行します。

```console:wsl2
cloudflared tunnel run nextcloud-tunnel
```

最後に、CloudflareのダッシュボードでDNSレコードを追加します。

```
タイプ: CNAME
名前: nextcloud
ターゲット: <トンネルID>.cfargotunnel.com
```

## NextCloudにアクセスしてみよう

ドメインにアクセスすると、`信頼できないドメインを介したアクセス`と表示される場合があります。これを解決するには、NextCloudの設定を変更する必要があります。

```bash:docker/bin/bash
docker exec -it <コンテナ名> /bin/bash
nano config/config.php
```

`config.php`ファイルに以下の設定を追加します。

```php:config.php
'trusted_domains' => 
  array (
    0 => 'localhost',
    1 => '<あなたのIPアドレス>',
    2 => '<あなたのドメイン名>',
  ),

'overwriteprotocol' => 'https',
```

設定後、NextCloudコンテナを再起動します。

```console:wsl2
docker-compose restart app
```

これで、自分のドメインでNextCloudにアクセスできるようになりました！

Dockerを再起動するたびに、この設定をするのは正直面倒です。
`docker-compose.yml`に環境変数を追加することで毎回自動で設定することもできます。
```yml:docker-compose.yml
version: '3'

services:
  app:
    image: nextcloud
    restart: always
    ports:
      - 8080:80
    links:
      - db
    volumes:
      - nextcloud:/var/www/html
    environment:
      - MYSQL_PASSWORD=
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud
      - MYSQL_HOST=db
      - NEXTCLOUD_TRUSTED_DOMAINS=localhost:8080 <ドメイン名>
      - OVERWRITEPROTOCOL=https
      - PHP_MEMORY_LIMIT=1024M
      - PHP_UPLOAD_LIMIT=1024M
    省略…
```
## まとめ

初めての自宅サーバー構築、いかがでしたか？確かに躓くポイントはありましたが、一つ一つ解決していくことで、自分だけのクラウドストレージを手に入れることができました。

NextCloudを使いこなすことで、プライバシーを保ちつつ、便利なファイル管理が可能になります。みなさんも挑戦してみてはいかがでしょうか？

次回は、NextCloudの活用方法や、さらなるカスタマイズについて紹介したいと思います。お楽しみに！