lxd＋zerotierで自宅サーバ上にPHPの開発環境用のimageを作る

この記事はビットスターのアドベントカレンダー12日目です。

## 要件

- vscodeからSSH接続して開発できること
- gitが利用できること
- ubuntuを利用すること
- VPNサービスzerotierのネットワークに追加すること
- mysqlの利用ができること
- composerが利用できること

## 環境

どこのご家庭にも2~3台はある普通の自宅サーバ

- Ubuntu 20.04.3 LTS

- LXD 4.20

  

## image用コンテナを作成

ホストからコンテナを作成する。
ホストに登録している鍵がそのまま利用できるようにコンテナに転送する。

```shell
lxc launch ubuntu:20.04 test
lxc file push ~/.ssh/authorized_keys test/root/.ssh/authorized_keys
lxc exec test -- bash
```

## PHP、mysqlのインストール

コンテナに必要なパッケージをインストールする。
今回はPHP7.4、mysql8

```shell
apt install composer php-fpm mysql-server git openssh-server
```



## zerotierのインストール

コンテナにzerotierのクライアントをインストールする。
zerotierのネットワークを通じてssh接続やhttpの通信を行なう
自分のネットワークにJoinする。

```shell
curl -s 'https://raw.githubusercontent.com/zerotier/ZeroTierOne/master/doc/contact%40zerotier.com.gpg' | gpg --import && \
if z=$(curl -s 'https://install.zerotier.com/' | gpg); then echo "$z" | sudo bash; fi
zerotier-ctl join <NetworkID>
```

## image化の準備

zerotierをインストールした状態でimage化するとzerotierのdevice-IDが重複してしまうので対策を講じる。

```shell
ls -l /var/lib/zerotier-one/
total 36
-rw------- 1 zerotier-one zerotier-one   24 Apr 17 01:26 authtoken.secret
drwx------ 4 zerotier-one zerotier-one 4096 Apr 17 01:26 controller.d
-rw-r--r-- 1 zerotier-one zerotier-one  141 Apr 17 02:07 identity.public
-rw------- 1 zerotier-one zerotier-one  270 Apr 17 02:07 identity.secret
drwxr-xr-x 2 zerotier-one zerotier-one 4096 Apr 17 01:32 networks.d
drwxr-xr-x 2 zerotier-one zerotier-one 4096 Apr 17 02:32 peers.d
-rw-r--r-- 1 zerotier-one zerotier-one  570 Apr 17 01:26 planet
lrwxrwxrwx 1 zerotier-one zerotier-one   22 Feb 15 08:00 zerotier-cli -> /usr/sbin/zerotier-one
lrwxrwxrwx 1 zerotier-one zerotier-one   22 Feb 15 08:00 zerotier-idtool -> /usr/sbin/zerotier-one
lrwxrwxrwx 1 zerotier-one zerotier-one   22 Feb 15 08:00 zerotier-one -> /usr/sbin/zerotier-one
-rw-r--r-- 1 zerotier-one zerotier-one    3 Apr 17 02:07 zerotier-one.pid
-rw-r--r-- 1 zerotier-one zerotier-one    4 Apr 17 02:07 zerotier-one.port
```

identity.public identity.secret 上記 2 つがデバイス ID となるので この 2 つのファイルを削除し、zerotier を再起動すると 2 つのファイルが再作成されて中身が変わる。 image 化する前に必ず削除する必要がある。

```shell
cd /var/lib/zerotier-one
rm -rf identity.*
```



## image化とimageからコンテナ作成

aliasで名前を付けておくphp7.4、mysql8のimageなので'p74m80'とした

```shell
lxc stop test
lxc publish test --alias p74m80
lxc image list
+--------+--------------+--------+---------------------------------------------+--------------+-----------+----------+-------------------------------+
| ALIAS  | FINGERPRINT  | PUBLIC |                 DESCRIPTION                 | ARCHITECTURE |   TYPE    |   SIZE   |          UPLOAD DATE          |
+--------+--------------+--------+---------------------------------------------+--------------+-----------+----------+-------------------------------+
| nodejs | 22**** | no     | Ubuntu 20.04 LTS server (20210415)          | x86_64       | CONTAINER | 509.76MB | Apr 17, 2021 at 1:57am (UTC)  |
+--------+--------------+--------+---------------------------------------------+--------------+-----------+----------+-------------------------------+
| p74m80 | 97**** | no     | Ubuntu 20.04 LTS server (20211118)          | x86_64       | CONTAINER | 573.91MB | Nov 27, 2021 at 11:59am (UTC) |
+--------+--------------+--------+---------------------------------------------+--------------+-----------+----------+-------------------------------+
|        | a8**** | no     | ubuntu 20.04 LTS amd64 (release) (20211129) | x86_64       | CONTAINER | 380.57MB | Nov 30, 2021 at 6:00am (UTC)  |
+--------+--------------+--------+---------------------------------------------+--------------+-----------+----------+-------------------------------+
lxc launch p74m80 develop
lxc exec develop -- zerotier-cli info
200 info 0e**** 1.x.x ONLINE

```

zerotierのコンパネから登録するとIPが割り当てられる

```
+--------------+---------+----------------------------+------+-----------+-----------+
| develop      | RUNNING | 10.52.xx.ｘ (eth0)        |      | CONTAINER | 0         |
|              |         | 10.xx.xx.ｘ (ztyqbuv6lb) |      |           |           |
+--------------+---------+----------------------------+------+-----------+-----------+
```



## お負け

zerotierのAPIを利用してコマンドライン上から許可できるようにした。

```shell
#!/usr/bin/env bash

AUTH="*******"
NETWORK="8b*******"
MEMBER=$1
NAME=$2

curl -X POST -H "Authorization: bearer ${AUTH}" -d '{"name":"'${NAME}'","config":{"authorized":true}}' https://my.zerotier.com/api/v1/network/${NETWORK}/member/${MEMBER}

```

```shell
./zerotier-authorizer.sh 0e**** develop
```

一応動作しますが例外処理してないので使用はおすすめしません。
そのうちしっかりしたツールにしたい。

## あとがき
開発環境が簡単にデプロイできるようになるのでなにか作ろうと思った時のハードルが少しだけ下がる気がする。
サーバーコンテナは1つのコンテナで必要なプロセス動かすことができるので私は管理しやすい。
自宅サーバだがzerotierをつかってVPNで接続することでポート開放することなくどこからでもサーバーにつなぐことができる。
ぜひlxd＋zerotierで快適な開発ライフを

以前nodejsの開発環境も作ったので興味があればどうぞ

https://sakakinox.net/posts/p12/

## 参考サイト

https://www.zerotier.com/download/

https://docs.zerotier.com/central/v1#tag/network-member