【備忘録】ラズパイを自宅サーバにし、独自ドメインで外部公開するまで

# はじめに
Raspberry Pi 4を自宅サーバとして運用し始めたので、その際にやったことの備忘録として書き残しておきます。
本記事では以下のことをやります。
* ラズパイを固定IPアドレス化
* Docker環境構築
* ファイアウォール導入
* 独自ドメイン取得
* ドメイン名とグローバルIPアドレスの紐づけ
* サービスを外部公開する

# ラズパイを固定IPアドレス化
Webブラウザを立ち上げて、URLの欄にルータのローカルIPアドレスを入力してください。ルータのIPアドレスはwindowsならコマンドプロンプトで以下のコマンドを入力すれば、「デフォルトゲートウェイ」という項目に出てきます。192.168.〇.1みたいなIPアドレスになってることが多いです。

```console
ipconfig
```
IPアドレスを打ち込むと、自宅のルータの設定のページに飛びます。おそらく、ここでログインを要求されるので、IDとパスワードを入力してログインをします。IDとパスは今まで何もいじっていなければ、デフォルトのものが存在するはずなので、わからなけらば自宅のルータの種類に応じてググってみてください。
私の家のルータでは以下のようなページが表示されました。

![スクリーンショット 2022-08-05 175852.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742387/83edd550-2836-2176-fc80-b5474616723a.png)

このルータ機能の設定をクリック。

![スクリーンショット 2022-08-05 182208.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742387/9108d984-a83f-46d5-37e4-b206482d77ee.png)

IPアドレス/DHCPサーバの設定をクリック。

![スクリーンショット 2022-08-05 180109.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742387/419a47a3-2516-93a4-e8bb-179c7bd1d273.png)

固定割当というところにラズパイに割り当てたいIPアドレスを設定します。例えば、192.168.3.30という値を割り当てたいなら割当IPの4つ目の四角に30と入力。
MACアドレスはラズパイのものを入力。ラズパイ上で以下のコマンドを入力すれば、eth0て項目に多分出てくる。

```console
ip addr
```

ポート転送の設定もやってしまいましょう。
ルータ設定のページに戻りまして、ポート転送設定をクリック。ここで80番ポート、443番ポートのアクセスはラズパイの固定IPアドレスに転送するようにしときます。IPアドレスの欄には先ほど設定した固定IPアドレスを入力。

![スクリーンショット 2022-08-05 184712.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742387/3a97cc1b-0b23-c04a-8b19-626f5f5c4ae8.png)

# Docker環境構築
ラズパイ上で以下のコマンドを入力。
```console
sudo apt install docker docker-compose
```

以下のコマンドが動作すれば成功。
```console
sudo docker version
```
このままだとdockerコマンド使う度にsudoを入力する必要があって非常に面倒なので、sudoなしでも使えるようにする。
```console
sudo adduser ubuntu docker
```
これでsudoなしでも使えるはず。

```console
docker version
```
# ファイアウォールを導入
最終的に外部に公開するのでファイアウォールはちゃんと使いましょう。
外部から接続可能なポートを許可する設定をします。とりあえずここではssh、http、httpsを許可する。
```console
sudo ufw allow 22
sudo ufw allow 80
sudo ufw allow 443
sudo ufw enable
```
設定できているか確認。
```console
sudo ufw status
```
ssh接続して作業している場合、sshを許可してからファイアウォールを動作させないと接続できなくなってしまうので、順番には要注意です。

# 独自ドメインを取得
さて、いよいよ大詰めです。独自ドメインを取得しましょう。[お名前.com](https://www.onamae.com/)でも、[Xserver](https://www.xserver.ne.jp/)でも[ムームードメイン](https://muumuu-domain.com/)でもお好きなサイトから取得してください。
値段やらインターネットの評判やらで比較検討するといいです。

私はXserverのものを使用しているので、以降はXserverを例に説明していきます。

# ドメイン名とグローバルIPアドレスの紐づけ
IPアドレスとドメイン名の紐づけはDNSというものを使ってやるのですが、グローバルIPアドレスはプロバイダーの都合で変わる可能性があります。その対策として、ダイナミックDNS(DDNS)というサービスを利用します。今回は無料で使える[mydns](https://www.mydns.jp/)を利用することにします。
アカウントを作ったらメールにMaster ID&Passwordが送られてくるので確認しましょう。(gmailだと迷惑メールに振り分けられるみたいなので注意)

DOMAIN INFOからドメインを入力します。ここのDomainに先ほど取得したドメインを入力します。
おそらく、MXレコードにも自動でドメインが補完されると思いますが、メールとして使う予定がない場合、ホスト名は「.」に、Preference値を0にするといいです。
![スクリーンショット 2022-08-05 191413.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742387/d01594f7-b9df-1c35-aecc-d45fbfbb853f.png)

例)「example.com」というドメインを取得した場合
![スクリーンショット 2022-08-05 191745.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742387/95602507-a98e-67a7-491d-9761d3334b38.png)

さて、mydnsのネームサーバーを使わせてもらうことになるので、mydnsのページからName Server Listという部分を確認しておきましょう、
![スクリーンショット 2022-08-05 192212.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742387/cbda525f-db69-8a8b-e5f3-bffccd93abfe.png)

その他をサービスを利用するを押して、ネームサーバーに先ほど確認したものを入力。

次はXserver側でmydnsのネームサーバを利用するようにします。Xserver Domainのページに飛んで、ネームサーバー設定をクリック。
![スクリーンショット 2022-08-05 192548.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742387/fbbd53fc-e4bc-60fe-caf5-3a2e755d04a4.png)

これで外部からのアクセスができるようになったはずです。

# サービスを外部公開する
まだ、何もサービスを動かしていないので実際に動かして試してみましょう。
ラズパイで以下のコマンドを入力してください。

```console
mkdir webtest
cd webtest
sudo vim docker-compose.yml
```
docker-compose.ymlには以下の内容を入力。今回はApacheを起動してみます。
https-portalはhttps対応させるために使うイメージです。非常にお手軽にサイトのhttps化ができるのでおすすめです。
(リバースプロキシサーバーとしても使えるよ)

```docker
version: "3"

services:
  https-portal:
    image: steveltn/https-portal:1
    container_name: web_https-portal
    ports:
      - 80:80
      - 443:443
    networks:
      - webnet
    restart: always
    volumes:
      - ./certs:/var/lib/https-portal
    environment:
      DOMAINS: (取得したドメイン名) -> http://website:80
      STAGE: staging

  website:
    image: httpd:2.4
    container_name: testweb
    networks:
      - webnet
    restart: always

networks:
  webnet:
```

いざ、実行。
```console
docker-compose up -d
```

少し接続ができるようになるまで時間がかかるので数分ほど待ちます。
そして、Webブラウザを立ち上げて、URLに「https://(ドメイン名)」と入力してやれば、**It works!**という文字が表示され、apacheに接続できることがわかります。

最後にIPアドレスを定期的に通知するようにしておわり
```console
crontab -e
```
一番下に以下を追加。
```console
*/10 * * * * wget -q -O /dev/null http://(Master ID):(password)@ipv4.mydns.jp/login.html
*/10 * * * * wget -q -O /dev/null http://(Master ID:(password)@ipv6.mydns.jp/login.html
```
# 終わりに
以上、ラズパイを自宅サーバにするまででした。意外とやろうと思えば、簡単にできるのでやってみてください。サブドメインの設定方法もあるのですが、それはまた気が向いたら書きます()