Nextcloud in Docker を自宅に構築 01章_証明書

# Nextcloud in Docker を自宅に構築
NextcloudをDocker使って，自宅のNAPT配下に構築する．
何章まで行くかわかりません．終わるといいな．

1. (今回) [Nextcloud in Docker を自宅に構築 01章_証明書](https://qiita.com/AkihisaYoshii4/items/3b18af3788c96b1f67f0)
2. 内部DNSサーバの構築
3. リバースプロキシの構築
4. Nextcloudの構築

## 前提条件
### 必要なもの

- Linuxサーバ
- DockerとDocker Compose
- 記事の内容に対して，補填できる知識


### ネットワーク環境
```text:ネットワーク環境
[GLOBAL]----[ONU]--[Router (192.168.1.1)]
                          ├-[Server (192.168.1.2)]
                          └-[Client (192.168.1.3)]
```

## ドメイン(DDNS)
まずは，ドメインを取ろう．[MyDNS.JP](https://mydns.jp)が楽そう．
まあ，あまり説明することもないでしょう．
`Domain* : (FQDN)` って書いてるところに，自分の欲しいドメインを入れる．
Aレコードのホスト名に，ワイルドカード設定をすることで，ホスト名に問わず自宅まで問い合わせさせることができる．
その後，内部DNSサーバで解決する．

![Aレコードのワイルドカード設定](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71328/abe741d6-27f1-5371-a3ce-af69d8bbbdac.png)



ここでは仮に．`var_mydomain_var.mydns.jp` を取得したとする．

MyDNSは，Dynamic DNSを提供しているので，定期的に，現在のGlobal IPを教えなきゃいけない．
以下のスクリプトをServerのcronとかに登録しておく．

```bash:IPアドレス報告
#!/bin/sh

curl https://MyDNSのユーザID:MyDNSのユーザパスワード@www.mydns.jp/login.html 1 > /dev/null
```
取得できたかどうかは，
`ping var_mydomain_var.mydns.jp` や
`ping hoge.var_mydomain_var.mydns.jp` で
で確認する．


## 証明書
今回の本題である．
Let's EncryptのDNS-01で習得する．

### DNS-01方式
DNSのTXTレコードを用いて，証明書を発行する(よく分かっていない)．
従来のHTTPS方式のように，Port443を解放しなくても良い．

### MyDNS + Let's Encrypt + DNS-01
取得するPHPスクリプトが[公開](https://github.com/disco-v8/DirectEdit/)されているので，Dockerコンテナ化する．

### コンテナ化
コンテナ化したものが[こちら](https://github.com/Hukanzen/docker-DirectEdit)である．
Cloneして，表の様にrun時の引数と， `txtedit.conf` ファイルを編集する．


|変数|設定する内容|
|:--|:--|
|YOURDOMAIN|var_mydomain_var.mydns.jp|
|YOURMAILADDR|証明書に使用するメールアドレス|
|MYDNSJP_MASTERID|MyDNSのID|
|MYDNSJP_MASTERPWD|MyDNSのパスワード|
|MYDNSJP_DOMAIN|var_mydomain_var.mydns.jp| 


```bash:doc_direct_editのrun
docker run --rm \
	-e YOURDOMAIN=$YOURDOMAIN \
	-e YOURMAILADDR=$YOURMAILADDR \
	-v $(pwd)/etc/letsencrypt:/etc/letsencrypt \
	doc_direct_edit
```
```php5:txtedit.conf
<?php
    $MYDNSJP_URL       = 'https://www.mydns.jp/directedit.html';
    $MYDNSJP_MASTERID  = '';
    $MYDNSJP_MASTERPWD = '';
    $MYDNSJP_DOMAIN = '';
?>
```

### 証明書取得
怖い人は，Dockerfile内で，`certbot` [実行時](https://github.com/Hukanzen/docker-DirectEdit/blob/f3ca95aabc014fff22ca68ed58b477a864f8bbf3/Dockerfile#L21) に，`dry-run` オプションを付けてBuildすることで，テストできる(筈)．

DockerfileをBuildして，Runすると，その場に，`etc` ディレクトリができる．
`./etc/letsencrypt/live/var_mydomain_var.mydns.jp/` 配下に証明書ができている．

```bash:etc配下
etc/
└── letsencrypt
    ├── accounts
    │   └── acme-v02.api.letsencrypt.org
    │       └── directory
    │           └── hogehogehoge
    │               ├── meta.json
    │               ├── private_key.json
    │               └── regr.json
    ├── archive
    │   └── var_mydomain_var.mydns.jp
    │       ├── cert1.pem
    │       ├── chain1.pem
    │       ├── fullchain1.pem
    │       └── privkey1.pem
    ├── csr
    │   └── 0000_csr-certbot.pem
    ├── keys
    │   └── 0000_key-certbot.pem
    ├── live
    │   ├── var_mydomain_var.mydns.jp
    │   │   ├── cert.pem -> ../../archive/var_mydomain_var.mydns.jp/cert1.pem
    │   │   ├── chain.pem -> ../../archive/var_mydomain_var.mydns.jp/chain1.pem
    │   │   ├── fullchain.pem -> ../../archive/var_mydomain_var.mydns.jp/fullchain1.pem
    │   │   ├── privkey.pem -> ../../archive/var_mydomain_var.mydns.jp/privkey1.pem
    │   │   └── README
    │   └── README
    ├── renewal
    │   └── var_mydomain_var.mydns.jp.conf
    └── renewal-hooks
        ├── deploy
        ├── post
        └── pre

16 directories, 16 files
```

## まとめと今後
証明書が，DNS-01方式で取得できた．
今後は，以下のとおりである．
1. 内部DNSサーバの構築
2. リバースプロキシの構築
3. Nextcloudの構築

遠くね？